【问题标题】:Python script Exception with TorTor 的 Python 脚本异常
【发布时间】:2012-03-29 12:31:25
【问题描述】:

我有以下使用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()

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

【问题讨论】:

    标签: python tor


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      与控制端口的连接失败,conn 被分配了 Python 套接字用来指示失败的值(显然是 NoneType 类型)。

      原因是,在声明 socket.socket = socks.socksocket 中,显然您将默认套接字对象或类替换为通过 Tor 透明代理所有内容的对象或类,这使得程序尝试代理您的控制端口连接。

      解决方案是仅在您打开控制连接之后执行socket.socket = socks.socksocket(如果您以后需要它,请保留该连接)或保存原始socket.socket 值以便您可以根据需要在值之间切换。

      【讨论】:

        猜你喜欢
        • 2015-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-06-28
        • 2019-01-01
        • 1970-01-01
        相关资源
        最近更新 更多