Исключение 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() 

Когда вызывается второй скрипт, сначала он называется «ОК». Может ли кто-нибудь объяснить, в чем проблема и как исправить?

2 Solutions collect form web for “Исключение Python с помощью Tor”

Аноним очень хорошо объяснил, что этот сокет перезаписывается, ответ почти идеален, за исключением того, что вы должны закрыть управляющий сокет . Это безопаснее из-за цикла событий 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()) 

Соединение с управляющим портом выходит из строя, а conn присваивается значение, которое использует сокеты Python для указания отказа (что, по-видимому, относится к типу NoneType ).

Причина в том, что в выражении socket.socket = socks.socksocket , по-видимому, вы заменяете объект или класс сокета по умолчанию на тот, который прозрачно проксирует все через Tor, что заставляет программу пытаться проксировать ваше соединение с портом управления.

Решение состоит в том, чтобы выполнять только socket.socket = socks.socksocket после того, как вы открыли соединение с контроллером (и поддерживайте это соединение, если вам это нужно позже) или сохраните исходное значение socket.socket чтобы вы могли переключаться между значениями по мере необходимости.

  • Экран шестнадцатеричной консоли консоли Python
  • Убивание программы с использованием многопроцессорности
  • Словарь с однократной записью?
  • Как удалить строки документа при использовании Cython distutils?
  • Что делать, если я хочу сохранить значение None в memcache?
  • Создать константы с помощью модуля настроек?
  • pycharm - как установить уровень выделения на глобальном уровне
  • Что означает знак процента в Python 3.1
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.