Tor 的 Python 脚本异常

标签 python tor

我有以下使用 SocksiPY 的脚本

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

但上面的脚本分为2个独立的脚本:

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

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

当调用第二个脚本然后调用第一个脚本时就可以了。谁能解释问题是什么以及如何解决?

最佳答案

Anonymous 很好地解释了这个套接字覆盖,答案几乎是完美的,除了你必须关闭控制套接字。由于 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())

关于Tor 的 Python 脚本异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9925381/

相关文章:

python - pandas groupby 组中忽略 NaN 的标准错误

php - file_get_contents 通过 tor

proxy - 在 CentOs 上使用 CURL 和 TOR 作为代理

C# Selenium - 无法启动 Tor

ssl - 使用 TOR(由 nginx 提供服务)和 ssl

python - 如何用Python(Sympy)实现一个函数,实现与Wolfram Mathematica中的ToExpression相同的功能?

python - 我正在努力从 Python 实现 RTransferEntropy

python - Pandas - 两列的直方图?

python - Comint-Mode 有类似 eval-print-last-sexp 的功能吗?

php - 如何更改 tor ip 每个 curl_init()