5

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

このコードはTorIDを変更する必要がありますが、しばらく待機し、次のエラーが発生します。

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

2番目のスクリプトが呼び出されると、最初のスクリプトが呼び出されます。誰かが問題とは何か、そしてどのように修正するかを説明できますか?

4

2 に答える 2

5

匿名はこのソケットの上書きを非常によく説明しました。制御ソケットを閉じる必要があることを除いて、答えはほぼ完璧です。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())
于 2012-04-17T15:14:01.040 に答える
2

制御ポートへの接続が失敗し、connPython ソケットが失敗を示すために使用する値が割り当てられます (これは明らかに型ですNoneType)。

その理由は、ステートメントsocket.socket = socks.socksocketで、明らかに、デフォルトのソケット オブジェクトまたはクラスを、Tor を介してすべてを透過的にプロキシするものに置き換えているためです。これにより、プログラムは制御ポート接続をプロキシしようとします。

解決策は、制御接続を開いたsocket.socket = socks.socksocket にのみ実行するか (後で必要に応じてその接続を維持する) socket.socket、必要に応じて値を切り替えることができるように元の値を保存することです。

于 2012-04-14T16:13:13.467 に答える