Как изменить идентичность Tor в Python?
у меня есть следующий скрипт:
import socks
import socket
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
import urllib2
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
, который использует Tor и SocksiPy
теперь я хочу изменить идентификатор tor с каждым запросом, например:
for i in range(0, 10):
#somehow change tor identity
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
Как я могу это сделать?
6 ответов
Tor написал новую библиотеку управления TOR в Python, stem. Его можно найти на PyPI. Они предлагают некоторые хорошие учебники, как работать с ним, один из них объясняет, как изменить вашу личность:
from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
controller.signal(Signal.NEWNYM)
убедитесь, что ваша конфигурация правильно.
сегодня я много искал об этом вопросе и, наконец, сумел ответить сам. Но прежде я должен сказать, что pirvoxy и tor должны быть настроены правильно. Сначала скрипт, потом немного о конфигурации:
import urllib2
from TorCtl import TorCtl
proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
opener = urllib2.build_opener(proxy_support)
def newId():
conn = TorCtl.connect(controlAddr="127.0.0.1", controlPort=9051, passphrase="your_password")
conn.send_signal("NEWNYM")
for i in range(0, 10):
print "case "+str(i+1)
newId()
proxy_support = urllib2.ProxyHandler({"http" : "127.0.0.1:8118"})
urllib2.install_opener(opener)
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
выше скрипт получает новый IP и проверяет его от ifconfig.мой веб-сайт. О конфигурациях: Нам нужно С Privoxy. чтобы использовать TOR с HTTP-соединениями, privoxy должен работать с tor. Мы можем сделать это, добавив thi в /etc/privoxy / config файл:
forward-socks5 / localhost:9050 . #dot is important at the end
затем мы настраиваем ControlPort в файле/etc/tor / torrc. Нам нужно просто раскомментировать эту строку:
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:872860B76453A77D60CA2BB8C1A7042072093276A3D701AD684053EC4C
тогда мы просто перезапустим tor:
/etc/init.d/tor restart
другое простое решение, не требующее внешних библиотек, работает как для IPv4, так и для IPv6:
import socket
try:
tor_c = socket.create_connection((TOR_CTRL_HOST, TOR_CTRL_PORT))
tor_c.send('AUTHENTICATE "{}"\r\nSIGNAL NEWNYM\r\n'.format(TOR_CTRL_PWD))
response = tor_c.recv(1024)
if response != '250 OK\r\n250 OK\r\n':
sys.stderr.write('Unexpected response from Tor control port: {}\n'.format(response))
except Exception, e:
sys.stderr.write('Error connecting to Tor control port: {}\n'.format(repr(e)))
Это видео где im используя стержень, SockSipy, Tor 100% работая:)
#!/usr/bin/python
import socks
import socket
import time
from stem.control import Controller
from stem import Signal
import urllib2
import sys
def info():
print "[*] Welcome to Chart-Cheat Script"
print "[*] This script works with running TOR only"
print "[*] usage is chartcheat.py domain"
print "[*] argument domain must be in format www.example.com"
print "[*] Example: chartcheat.py www.example.com"
return
if len(sys.argv)==2:
info();
counter = 0
url = str(sys.argv[1]);
with Controller.from_port(port = 9051) as controller:
controller.authenticate()
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
#visiting url in infinite loop
while True:
urllib2.urlopen("http://"+url)
counter=counter+1
print "Page " + url + " visited = " + str(counter)
#wait till next identity will be available
controller.signal(Signal.NEWNYM)
time.sleep(controller.get_newnym_wait())
else:
info();
Если вы используете python3, пакет urllib в python3 будет таким же, как пакет urllib2 в python2.
Вы можете включить сервер управления Tor, раскомментировав несколько строк
/etc/tor/torrc
и использовать стволовые библиотека для отправки NEWNYM сигналом к смене цепи.
controller.signal(Signal.NEWNYM)
может работать следующее:
for i in range(0, 10):
#somehow change tor identity
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050+i)
socket.socket = socks.socksocket
print(urllib2.urlopen("http://www.ifconfig.me/ip").read())
вы в основном устанавливаете набор прокси-сервера перед каждым подключением. Я asuming, что у вас есть разные прокси для разных IPs, так как вы не указали, как вы собираетесь изменить IP