Исключение 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 чтобы вы могли переключаться между значениями по мере необходимости.

Interesting Posts

Вопросы о пандах: расширение многозначной колонны, инвертирование и группировка

Maya Python: cmds.button () с передаваемыми переменными UI и вызовом функции?

Извлечь GPS-координаты из файла .docx с помощью python

TypeError: unbound method «имя метода» должен быть вызван с экземпляром «Имя класса» в качестве первого аргумента (вместо этого получил экземпляр str)

Python RuntimeError: превышена максимальная глубина рекурсии

Понимание неоднородных массивов numpy

Автоматически растущие списки в Python

Как получить доступ к именам пользователей и профилям с помощью django-allauth

Установка Python Tools для Visual Studio 2012 (PTVS)

Библиотека Python для управления процессами Linux

Python – я не вижу, что моя ошибка, потому что окно сразу исчезает

метод python pandas isin?

Вычисления свертки в Numpy / Scipy

PyQt – несколько табличных виджетов и табличек

Pyqt; QTcpSocket всегда в connectionState после перезапуска сервера;

Python - лучший язык программирования в мире.