web-dev-qa-db-ja.com

TorでPythonを使用してリクエストを行う

Torを使用してWebページに複数のGETリクエストを送信したい。リクエストごとに異なる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

これを使用して、1つの要求を行いました。 IPアドレスを変更して別のものを作成するにはどうすればよいですか?

48
Sachin Kelkar

使用するコードは次のとおりです(pip install stemを使用して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")

頑張って、うまくいけばうまくいく。

26
jamescampbell

質問には2つの側面があります-

  1. Torを使用してリクエストを行う
  2. 要件ごとに接続を更新します(あなたの場合、すべての要求の後)

パート1

最初の方法は、最新の(v2.10.0以降) requests で追加の要件があり、socksプロキシを使用するために requests[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を使用するには、ControlPortを介してTorサービスに接続し、NEWNYM信号を送信できる必要があります。

通常のTorインストールでは、デフォルトでControlPortが有効になりません。 torrc file を編集し、対応する行のコメントを解除する必要があります。

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"用です。別のパスワードを設定する場合は、tor --hash-password "<new_password>"からの出力に注意して、torrcのHashedControlPasswordを置き換えます。ここで、<new_password>は設定するパスワードです。

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

Windowsユーザーへの警告:投稿 ここ を参照してください。

次のコマンドを使用してtorがインストールされた場合、torrcファイル内のコントロールポートの設定が無視されるWindowsで問題があります。

tor --service install

この問題を解決するには、torrcファイルを編集した後、次のコマンドを入力します。

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

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

さて、Torが適切に構成されたので、Torが既に実行されている場合は再起動する必要があります。

Sudo service tor restart

これでTorは9051 ControlPortで稼働し、コマンドを送信できます。 Torを制御するには official stem library を使用することを好みます。

インストール-

pip install stem

次の関数を呼び出して、Tor IPを更新できます。

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のコードを再実行します。何らかの理由で、新しいIPを使用するには、新しいsessionオブジェクトを作成する必要があります。

session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
78
shad0w_wa1k3r

torrequest library(恥知らずのプラグ)を使用できます。 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
15
Erdi Aker

リクエストはプロキシをサポートしています バージョン2.10.0以降のSOCKSプロトコルを使用しています。

import requests
proxies = {
    'http': 'socks5://localhost:9050',
    'https': 'socks5://localhost:9050'
}
url = 'http://httpbin.org/ip'
print(requests.get(url, proxies=proxies).text)
7
Karimov Dmitriy

この回答は、windowsのAshish Nitin Patilのいずれかを完了します(この回答を自由に更新してください)

パート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を作成することに注意してください。何らかの理由で、ブラウザを使用するにはサービスを停止する必要があるようですservices.mscを実行)

EDIT:多くの情報が見つかります ここ (ポート番号とプロキシ、Tor、Privoxy、ユーザーエージェントの自動切り替え...)。

3
JinSnow

このコードは正常に機能します。 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()
3
N.G.Searching

Pure-python torプロトコルの実装を試すことができます Torpy 。オリジナルの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'}

したがって、新しいセッションを取得するたびに、新しいIDを取得します(基本的に、新しい出口ノードで新しい回線を取得します)。 readmeファイルで他の例を参照してください https://github.com/torpyorg/torpy

2
James Brown

requestsrequesocksは非常に古く、response.json()およびその他多くのものはありません。

コードをきれいに保ちたいです。ただし、requestsは現在、socks5をまだサポートしていません(詳細については、このスレッドをお読みください https://github.com/kennethreitz/requests/pull/478

そこで、今のところTorを接続するhttpプロキシとしてPrivoxyを使用しました。

MacにPrivoxyをインストールして構成する

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

UbuntuにPrivoxyをインストールして設定します

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

これで、HTTPプロキシのようにTorを使用できます。以下は私のpythonスクリプトです。

import requests

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

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