I'm trying to connect to a resource using a tor, changing identity. But after the first connection attempt to change identity causes an error. Code:
import urllib2, socks, socket
from stem import Signal
from stem.control import Controller
def newI():
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
newI()
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'}
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()
newI()
I get error:
File "/media/all/Run/e/c.py", line 21, in <module>
newI()
File "/media/all/Run/e/c.py", line 7, in newI
with Controller.from_port(port=9051) as controller:
File "/usr/local/lib/python2.7/dist-packages/stem/control.py", line 659, in from_port
control_port = stem.socket.ControlPort(address, port)
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 314, in __init__
self.connect()
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 187, in connect
self._socket = self._make_socket()
File "/usr/local/lib/python2.7/dist-packages/stem/socket.py", line 340, in _make_socket
control_socket.connect((self._control_addr, self._control_port))
File "/usr/lib/python2.7/dist-packages/socks.py", line 369, in connect
self.__negotiatesocks5(destpair[0],destpair[1])
File "/usr/lib/python2.7/dist-packages/socks.py", line 236, in __negotiatesocks5
raise Socks5Error(ord(resp[1]),_generalerrors[ord(resp[1])])
TypeError: __init__() takes exactly 2 arguments (3 given)
Maybe I need to disable the proxy. Tell me how to do it correctly.
UPD:
With pycurl it's work:
import pycurl
import cStringIO
from stem import Signal
from stem.control import Controller
def newI():
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
newI()
buf = cStringIO.StringIO()
c = pycurl.Curl()
c.setopt(pycurl.URL, 'http://google.com/')
c.setopt(c.WRITEFUNCTION, buf.write)
c.setopt(pycurl.PROXY, 'localhost')
c.setopt(pycurl.PROXYPORT, 9050)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()
html = buf.getvalue()[7:]
buf.close()
newI()
But while you could use a proxy to connect to Tor, you're actually less secure than you'd be with Tor directly, as your connection between you and the internet proxy is not protected. And, as with using Tor as a standalone security method, your connection will be slower.
1) Launch the Tor Browser browser. 2) On the right hand side, click on open menu and Click on Options. 5) A new window is opened called Connection Settings. 6) Click on use Manual Proxy Configuration, enter the IP address and Port number.
Upper right hand side of Tor Browser click on the three horizontal bars, click on Options, select the Advanced tab, click on Network, click on Settings, select "No Proxy" and hit OK. Then type "about:config" into the url bar, go to "network.
The problem is caused by the socket.socket = socks.socksocket
line.
As a temporary solution, one can keep a backup copy of socket.socket
and use that to unset the proxy before asking Tor for a new identity, then set up the proxy again.
The code will look like this:
import urllib2, socks, socket
from stem import Signal
from stem.control import Controller
old_socket = socket.socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
def newI():
socket.socket = old_socket # don't use proxy
with Controller.from_port(port=9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
# set up the proxy again
socket.socket = socks.socksocket
newI()
headers = {'User-Agent': 'Mozilla/3.0 (x86 [en] Windows NT 5.1; Sun)'}
req = urllib2.Request('https://google.com', None, headers)
response = urllib2.urlopen(req)
html = response.read()
newI()
However, I am still waiting for someone to post an explanation as to why the error occurs, and a better way to fix it.
Interesting. I wonder if...
socket.socket = socks.socksocket
is causing _make_socket()
to get a non-standard socket, and in turn bulk. If you use PycURL instead does it work?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With