Выполнение запросов с использованием Python через Tor
Я хочу сделать несколько запросов GET с помощью Tor на веб-страницу. Я хочу использовать другой IP-адрес для каждого запроса.
import socks
import socket
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
socket.socket = socks.socksocket
import requests
print (requests.get('http://icanhazip.com')).content
используя это, я сделал один запрос. Как я могу изменить ipaddress, чтобы сделать другой?
7 ответов
вот код, который вы хотите использовать (загрузите пакет stem с помощью pip install stem
)
from stem import Signal
from stem.control import Controller
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password='your password set for tor controller port in torrc')
print("Success!")
controller.signal(Signal.NEWNYM)
print("New Tor connection processed")
удачи и, надеюсь, это сработает.
есть 2 аспекта вашего вопроса -
- выполнение запросов с помощью Tor
- обновление связи согласно требованию (в вашем случае, после каждого запроса)
Часть 1
первый из них легко сделать с последним (выше v2.10.0)requests
библиотека с дополнительным требованием requests[socks]
для использования прокси-сервера socks.
установка -
pip install requests requests[socks]
основное использование -
import requests
def get_tor_session():
session = requests.session()
# Tor uses the 9050 port as the default socks port
session.proxies = {'http': 'socks5://127.0.0.1:9050',
'https': 'socks5://127.0.0.1:9050'}
return session
# Make a request through the Tor connection
# IP visible through Tor
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
# Above should print an IP different than your public IP
# Following prints your normal public IP
print(requests.get("http://httpbin.org/ip").text)
Часть 2
чтобы обновить Tor IP, т. е. иметь свежий видимый выход IP, вы должны иметь возможность подключиться к службе Tor через это ControlPort
и затем отправить NEWNYM
сигнал.
обычная установка Tor не включает ControlPort
по умолчанию. Вам придется отредактировать свой 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:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
обратите внимание:HashedControlPassword
выше для пароля "password"
. Если вы хотите установить другой пароль, заменить HashedControlPassword
в torrc, отметив выход из tor --hash-password "<new_password>"
здесь <new_password>
- это пароль, который вы хотите установить.
хорошо, теперь, когда мы настроили Tor правильно, вам придется перезапустить Tor, если он уже запущен.
sudo service tor restart
предупреждение для пользователей Windows: см. пост здесь.
существует проблема в windows, где параметр для controlport в файле torrc игнорируется, если tor был установлен с помощью следующей команды:
tor --service install
чтобы устранить проблему, после редактирования файла torrc введите следующие команды:
tor --service remove
tor --service install -options ControlPort 9051
Tor теперь должен быть запущен и запущен на 9051 ControlPort
через который мы можем отправлять команды на него. Я предпочитаю использовать официальная библиотека stem для управления Тор.
установки -
pip install stem
теперь вы можете обновить Tor IP, вызвав следующую функцию.
from stem import Signal
from stem.control import Controller
# signal TOR for a new connection
def renew_connection():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="password")
controller.signal(Signal.NEWNYM)
чтобы убедиться, что Tor имеет новый IP выхода, просто повторите код из части 1. По какой-то неизвестной мне причине вам нужно создать новый session
объект для использования нового IP.
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
можно использовать torrequest
библиотека (промоушен). Он доступен на PyPI.
from torrequest import TorRequest
with TorRequest() as tr:
response = tr.get('http://ipecho.net/plain')
print(response.text) # not your IP address
tr.reset_identity()
response = tr.get('http://ipecho.net/plain')
print(response.text) # another IP address, not yours
запросы поддерживает прокси использование протокола SOCKS версии 2.10.0.
import requests
proxies = {
'http': 'socks5://localhost:9050',
'https': 'socks5://localhost:9050'
}
url = 'http://httpbin.org/ip'
print(requests.get(url, proxies=proxies).text)
этот ответ завершить один из Ашиш Нитин Патил для окна (не стесняйтесь обновлять этот ответ)
Часть 2
ControlPort 9051
## If you enable the controlport, be sure to enable one of these
## authentication methods, to prevent attackers from accessing it.
HashedControlPassword 16:05834BCEDD478D1060F1D7E2CE98E9C13075E8D3061D702F63BCD674DE
на HashedControlPassword
выше-пароль. Если вы хотите установить другой пароль в консоли перейдите в папку \Tor Browser\Browser\TorBrowser\Tor
и введите следующие команды: tor.exe --hash-password password_XYZ | more
). Это даст вам что-то вроде HashedControlPassword 16:54C092A8...
Это ваш пароль. Теперь вы можете добавить его в файл torrc (Tor Browser\Browser\TorBrowser\Data\Tor\torrc
).
вам будет нужно после этого перезапустить Tor:
tor --service remove
tor --service install -options ControlPort 9051
чтобы проверить, работает ли это тип netstat -an
теперь вы увидите, что порт 9051 открыт.
обратите внимание, что tor --service install -...
создать Tor Win32 Service
. Почему-то, кажется вы должны остановить службу, чтобы использовать браузер (run services.msc
)
EDIT: вы найдете много частей информации здесь (про номер порта и прокси, Тор, с Privoxy, автоматический переключатель агента пользователя...).
на requests
на requesocks
супер старый, он не имеет response.json()
и многие другие вещи.
Я хотел бы сохранить свой код в чистоте. Однако,requests
В настоящее время еще не поддерживается socks5 (для более подробной информации прочитайте этот поток https://github.com/kennethreitz/requests/pull/478)
поэтому я использовал Privoxy
как HTTP-прокси, который соединяет Tor на данный момент.
установка и настройка Privoxy на Mac
brew install privoxy
vim /usr/local/etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
privoxy /usr/local/etc/privoxy/config
установка и настройка Privoxy на Ubuntu
sudo apt-get install privoxy
sudo vim /etc/privoxy/config
# put this line in the config
forward-socks5 / localhost:9050 .
sudo /etc/init.d/privoxy restart
теперь я могу использовать Tor как прокси-http. Ниже приведен мой скрипт python.
import requests
proxies = {
'http': 'http://127.0.0.1:8118',
}
print requests.get('http://httpbin.org/ip', proxies=proxies).text
этот код работает нормально. Через Тор меняет IP адрес после каждого запроса.
import time, socks, socket
from urllib2 import urlopen
from stem import Signal
from stem.control import Controller
nbrOfIpAddresses=3
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password = 'my_pwd')
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9050)
socket.socket = socks.socksocket
for i in range(0, nbrOfIpAddresses):
newIP=urlopen("http://icanhazip.com").read()
print("NewIP Address: %s" % newIP)
controller.signal(Signal.NEWNYM)
if controller.is_newnym_available() == False:
print("Waitting time for Tor to change IP: "+ str(controller.get_newnym_wait()) +" seconds")
time.sleep(controller.get_newnym_wait())
controller.close()