Подтвердить что ты не робот

Выполнять запросы с использованием Python over Tor

Я хочу сделать несколько запросов GET, используя Tor для веб-страницы. Я хочу использовать другой ipaddress для каждого запроса.

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 для создания другого?

4b9b3361

Ответ 1

Вот код, который вы хотите использовать (загрузите пакет стека с помощью 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

Есть 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

Чтобы обновить IP-адрес Tor, т. NEWNYM новый видимый выходной 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 выше HashedControlPassword предназначен для пароля "password". Если вы хотите установить другой пароль, замените HashedControlPassword в torrc, отметив вывод tor --hash-password "<new_password>" где <new_password> - это пароль, который вы хотите установить.

................................................................................

Предупреждение для пользователей Windows: см. Пост здесь.

Существует проблема в окнах, где настройка для контрольного порта в файле torrc игнорируется, если tor был установлен с помощью следующей команды:

tor --service install

Чтобы решить эту проблему, после редактирования файла torrc введите следующие команды:

tor --service remove
tor --service install -options ControlPort 9051

................................................................................

Итак, теперь, когда у нас правильно настроен Tor, вам придется перезапустить Tor, если он уже запущен.

sudo service tor restart

Теперь Tor должен быть запущен на 9051 ControlPort через который мы можем отправлять ему команды. Я предпочитаю использовать официальную библиотеку стволов для управления Tor.

Монтаж -

pip install stem

Теперь вы можете обновить IP-адрес 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)

Ответ 3

Вы можете использовать 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

Ответ 4

Запросы поддерживают прокси, используя протокол 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)

Ответ 5

Этот ответ дополнен ответом Ашиша Нитина Патила для Windows (не стесняйтесь обновлять этот ответ)

Часть 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 выше HashedControlPassword - это пароль. Если вы хотите установить другой пароль в консоли, перейдите в \Tor Browser\Browser\TorBrowser\Tor и введите следующие команды: tor.exe --hash-password password_XYZ | more 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. По какой-то причине кажется, что вы должны остановить службу, чтобы использовать браузер (запустите services.msc)

РЕДАКТИРОВАТЬ: вы найдете много информации здесь (о номере порта и прокси, Tor, Privoxy, пользовательский агент автоматического переключения...).

Ответ 6

Этот код работает нормально. Используя Tor, он меняет 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()

Ответ 7

Вы можете попробовать реализацию протокола Torpy на чистом python tor. Нет необходимости в оригинальном Tor-клиенте или зависимости от Stem.

$ pip3 install torpy
...

$ python3.7
>>> from torpy.http.requests import TorRequests
>>> with TorRequests() as tor_requests:
...    print("build circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...    print("renew circuit")
...    with tor_requests.get_session() as sess:
...        print(sess.get("http://httpbin.org/ip").json())
...        print(sess.get("http://httpbin.org/ip").json())
...
build circuit
{'origin': '23.129.64.190, 23.129.64.190'}
{'origin': '23.129.64.190, 23.129.64.190'}
renew circuit
{'origin': '198.98.50.112, 198.98.50.112'}
{'origin': '198.98.50.112, 198.98.50.112'}

Поэтому каждый раз, когда вы получаете новую сессию, вы получаете новую личность (в основном вы получаете новую схему с новым выходным узлом). Смотрите другие примеры в файле readme https://github.com/torpyorg/torpy

Ответ 8

requests in 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 script.

import requests

proxies = {
  'http': 'http://127.0.0.1:8118',
}

print requests.get('http://httpbin.org/ip', proxies=proxies).text