Выполнение запросов с использованием 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 аспекта вашего вопроса -

  1. выполнение запросов с помощью Tor
  2. обновление связи согласно требованию (в вашем случае, после каждого запроса)

Часть 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()