Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to control tor, when use tor proxy

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()
like image 481
user2503536 Avatar asked Nov 30 '13 18:11

user2503536


People also ask

Can I use Tor with proxy?

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.

How do I change my proxy Tor settings?

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.

How can I use Tor without proxy?

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.


2 Answers

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.

like image 170
Ionut Hulub Avatar answered Sep 24 '22 23:09

Ionut Hulub


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?

like image 37
Damian Avatar answered Sep 24 '22 23:09

Damian