使用Tor的Python脚本异常
我有下面的脚本,它使用 和任务大纲:使用Tor的Python脚本异常,python,tor,Python,Tor,我有下面的脚本,它使用 和任务大纲: from TorCtl import TorCtl import socks import socket socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050) socket.socket = socks.socksocket import urllib2 import sqlite3 from BeautifulSoup import BeautifulSoup def ne
from TorCtl import TorCtl
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2
import sqlite3
from BeautifulSoup import BeautifulSoup
def newId():
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123")
TorCtl.Connection.send_signal(conn, "NEWNYM")
newId()
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
此代码应更改Tor标识,但它会等待一段时间,并出现以下错误:
tuple index out of range
Traceback (most recent call last):
File "template.py", line 16, in <module>
newId()
File "template.py", line 14, in newId
TorCtl.Connection.send_signal(conn, "NEWNYM")
TypeError: unbound method send_signal() must be called with Connection instance as first argument (got NoneType instance instead)
以及:
当调用第二个脚本时,则调用第一个脚本,这是正常的。有人能解释一下问题是什么以及如何解决吗?到控制端口的连接失败,并且
conn
被分配了Python套接字用来指示失败的值(显然是NoneType
)
原因是,在语句socket.socket=socks.socksocket
中,显然您正在将默认的套接字对象或类替换为一个通过Tor透明地代理所有内容的对象或类,这使得程序尝试代理您的控制端口连接
解决方案是仅在打开控制连接后执行
socket.socket=socks.socksocket
(如果以后需要,请保留该连接)或保存原始的socket.socket
值,以便您可以根据需要在值之间切换。匿名很好地解释了此套接字覆盖,答案几乎完美,但您必须关闭控制插座。由于TorCtl事件循环,它更安全,但我必须深入研究TorCtl代码才能理解此事件循环
将代码总结为:
from TorCtl import TorCtl
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
import urllib2
import sqlite3
from BeautifulSoup import BeautifulSoup
__originalSocket = socket.socket
def newId():
''' Clean circuit switcher
Restores socket to original system value.
Calls TOR control socket and closes it
Replaces system socket with socksified socket
'''
socket.socket = __originalSocket
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123")
TorCtl.Connection.send_signal(conn, "NEWNYM")
conn.close()
socket.socket = socks.socksocket
newId()
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
from TorCtl import TorCtl
def newId():
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123")
TorCtl.Connection.send_signal(conn, "NEWNYM")
newId()
from TorCtl import TorCtl
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
import urllib2
import sqlite3
from BeautifulSoup import BeautifulSoup
__originalSocket = socket.socket
def newId():
''' Clean circuit switcher
Restores socket to original system value.
Calls TOR control socket and closes it
Replaces system socket with socksified socket
'''
socket.socket = __originalSocket
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="123")
TorCtl.Connection.send_signal(conn, "NEWNYM")
conn.close()
socket.socket = socks.socksocket
newId()
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())