首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在使用tor代理时如何控制tor

在使用tor代理时如何控制tor
EN

Stack Overflow用户
提问于 2013-11-30 18:56:07
回答 2查看 2.5K关注 0票数 6

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

代码语言:javascript
复制
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()

我得到了错误:

代码语言:javascript
复制
  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)

也许我需要禁用代理。告诉我怎么做正确。

UPD:

它的工作是:

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-08-06 17:03:08

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

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

代码将如下所示:

代码语言:javascript
复制
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()

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

票数 4
EN

Stack Overflow用户

发布于 2013-11-30 21:34:10

有意思的。我想知道是否..。

代码语言:javascript
复制
socket.socket = socks.socksocket

导致_make_socket()获得一个非标准的套接字,进而导致批量。如果你用PycURL代替,它能工作吗?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20304301

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档