【问题标题】:How to control tor, when use tor proxy使用tor代理时如何控制tor
【发布时间】:2013-12-16 17:52:23
【问题描述】:

我正在尝试使用 tor 连接到资源,改变身份。但是在第一次连接尝试更改身份后会导致错误。 代码:

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()

我得到错误:

  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)

也许我需要禁用代理。告诉我如何正确操作。

更新:

使用 pycurl 就可以了:

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()

【问题讨论】:

    标签: python sockets tor


    【解决方案1】:

    问题是由socket.socket = socks.socksocket 行引起的。

    作为一种临时解决方案,可以保留socket.socket 的备份副本,并在向 Tor 请求新身份之前使用它取消设置代理,然后再次设置代理。

    代码将如下所示:

    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()
    

    但是,我仍在等待有人发布有关错误发生原因的解释,以及修复它的更好方法。

    【讨论】:

      【解决方案2】:

      有趣。我想知道...

      socket.socket = socks.socksocket
      

      导致_make_socket() 获得非标准套接字,进而获得批量。如果你改用PycURL,它会起作用吗?

      【讨论】:

      • 这并不能真正回答问题,因为使用 PycURL 并不总是一种选择。比如我需要直接使用socket.socket,所以不能用PycURL代替。
      猜你喜欢
      • 1970-01-01
      • 2010-12-30
      • 2022-11-22
      • 2013-07-14
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多