Python3: как выполнять HTTP запросы через Tor (на примере Ubuntu)

В этом посте я опишу как пользоваться Tor в своих Python-скриптах. Зачем это нужно? Например, чтобы изменить свой видимый IP адрес для сервиса, к которому вы обращаетесь.
Нам понадобится установленный Tor и Python (я использую третий, но второй, по идее, тоже должен работать). Многие советуют использовать дополнительный сервис Privoxy между Tor, который работает как SOCKS-прокси и библиотеками Python, которые хотят получить HTTP-прокси, но я не очень понял, зачем, если в Python можно пользоваться SOCKS-прокси напрямую.
У меня установлена Ubuntu, поэтому и весь процесс я описываю для этой ОС. В других, я так понимаю, все должно быть примерно так же (Python-код должен работать в любом случае, разница может быть только с установкой и запуском Tor).
Итак, устанавливаем Tor:
sudo apt-get install tor
Убедиться, что Tor установлен и сервис работает, можно, выполнив команду:
/etc/init.d/tor status
В ответ получаем что-то, вроде:
tor.service - Anonymizing overlay network for TCP (multi-instance-master)
Loaded: loaded (/lib/systemd/system/tor.service; enabled; vendor preset: enabled)
Active: active (exited) since Sun 2016-11-27 19:04:18 CET; 47s ago
Main PID: 12564 (code=exited, status=0/SUCCESS)
Tasks: 0 (limit: 512)
CGroup: /system.slice/tor.service
В принципе, этого достаточно, чтобы им пользоваться. Сервис будет стартовать вместе с ОС, SOCKS-порт по умолчанию - 9050, управляющий порт - отключен (об этом - ниже). Если запуск по умолчанию не нужен, можно его отключить командой:
sudo systemctl disable tor.service
Еще несколько опций перечислены здесь, мне помогла только эта.
Если запуск сервиса по умолчанию устраивает, его поведение можно настроить, отредактировав файл /etc/tor/torrc. В частности, там можно выставить SOCKS-порт, управляющий порт, и настроить аутентификацию для управляющего порта. Управляющий порт позволяет контролировать открытое соединение Tor, например, поменять IP-адрес (поменять цепочку Tor-узлов, по которым проходит соединение), не открывая нового соединения. Если открыть его и не настроить аутентификацию, то любое локальное приложение сможет управлять открытым соединением.
Я запускаю Tor каждый раз самостоятельно, поэтому подробно не буду останавливаться на этом файле. Вся информация есть тут.
Далее, устанавливаем библиотеку PySocks для Python, которая и позволит использовать SOCKS-прокси (если нет pip3, устанавливаем и его, да):
pip3 install PySocks
Почти все готово, осталось запустить сервис Tor (если мы его остановили после установки) командой:
tor --RunAsDaemon 1 --CookieAuthentication 0 --HashedControlPassword "" --ControlPort 8118 --PidFile tor.pid --SocksPort 9050
Он ругнется, что у нас не выставлена аутентификация для управляющего порта, но оставим пока это.
Вот пример скрипта, который получает наш IP адрес:
import socks
import socket
import requests

socks.set_default_proxy(socks.SOCKS5, "localhost", 9050)
socket.socket = socks.socksocket

response = requests.get('http://icanhazip.com')
print(response.text)
Запускаем, смотрим вывод, потом вводим адрес http://icanhazip.com в браузере, смотрим, что отображается на странице. Если IP в бразуере и в командной строке получились разные, все работает правильно.
Теперь можно сменить IP, не перезапуская сервис Tor, командой:
echo -e 'AUTHENTICATE ""\r\nsignal NEWNYM\r\nQUIT' | nc 127.0.0.1 8118

(можно просто использовать telnet для этого, но такую команду легко вставить в скрипт).
Запускаем Python-скрипт еще раз, видим, что IP опять изменился.
Можно даже защитить паролем управляющий порт, чтобы только приложения, которые знают пароль, могли к нему обращаться. Для этого надо выполнить команду:
tor --hash-password mypassword
которая выдаст какую-нибудь такую строчку:
16:BD00F0CD00736C0960775D1DBC130E56AF226D81F21A61ACBC079BD843
Ее мы передаем в качестве параметра --HashedControlPassword, когда запускаем Tor (или копируем в файл torrc), а сам пароль надо будет указать, когда мы подключаемся к управляющему порту:
echo -e 'AUTHENTICATE "mypassword"\r\nsignal NEWNYM\r\nQUIT' | nc 127.0.0.1 8118
Вот, собственно, и все. По окончании работы, если запускали Tor вручную, надо бы не забыть его остановить:
killall -9 tor

2 комментария :

  1. Денис, расскажи лучше зачем тебе это надо было!

    ОтветитьУдалить
    Ответы
    1. Информацию с сайтов собирать в автоматическом режиме, очевидно же.

      Удалить