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アドレスを変更して別のものを作成するにはどうすればよいですか?
使用するコードは次のとおりです(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")
頑張って、うまくいけばうまくいく。
質問には2つの側面があります-
最初の方法は、最新の(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)
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)
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
リクエストはプロキシをサポートしています バージョン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)
この回答は、windowsのAshish Nitin Patilのいずれかを完了します(この回答を自由に更新してください)
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、ユーザーエージェントの自動切り替え...)。
このコードは正常に機能します。 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()
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
requests
のrequesocks
は非常に古く、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