我正在用python编写脚本
我的脚本使用urllib2来阅读网页
我正在使用Socksipy强制urllib2使用socks proxy(TOR)
我的问题是在设置socket.socket
之后TorCtl不起作用并引发异常
不起作用的代码是(第一个newTorId()
有效,第二个失败!):
newTorId() #This works
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "localhost", 9050)
socket.socket = socks.socksocket
newTorId() #this Fails!
newTorId
定义如下:
from TorCtl import TorCtl
def newTorId():
conn = TorCtl.connect(passphrase="test")
conn.send_signal("NEWNYM")
例外是:
__init__() takes exactly 2 arguments (3 given)
Traceback (most recent call last):
File "script.py", line 97, in <module>
newTorId()
File "script.py", line 27, in newTorId
conn.send_signal("NEWNYM")
AttributeError: 'NoneType' object has no attribute 'send_signal'
有什么问题?
答案 0 :(得分:1)
这是你自己的代码提出异常,而不是库。特别地,
TorCtl.connect(passphrase="test")
第二次返回None
,当您在结果上调用.send_signal
时会出错。
我认为newTorId()
旨在请求新的Tor身份。您可能只需要调用TorCtl.Connection.send_signal(conn, "NEWNYM")
来获取新标识,而不是每次都尝试创建新连接。请参阅Python - Controlling Tor。
答案 1 :(得分:0)
如前所述,如果连接失败,TorCtl的connect()方法会提供None。
除此之外,这个问题似乎经常出现(1,2)所以我刚为它添加了FAQ entry。 TorCtl is deprecated,所以这是使用stem ...
的示例from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)