使用 Python 通过 Tor 发出请求
Make requests using Python over Tor
我想使用 Tor 向网页发出多个 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
利用这个,我提出了一个要求。如何更改 ipaddress 以创建另一个?
这是你要使用的代码(使用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")
祝你好运,希望一切顺利。
你的问题有两个方面 -
- 使用 Tor 发出请求
- 根据要求更新连接(在您的情况下,在每次请求之后)
第 1 部分
第一个很容易使用最新的(v2.10.0 以上版本)requests
library with an additional requirement of requests[socks]
使用 socks 代理。
安装-
pip install 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 用户的警告: 请参阅 post 。
windows 上存在一个问题,如果使用以下命令安装 tor,则忽略 torrc 文件中控制端口的设置:
tor --service install
要解决此问题,请在编辑您的 torrc 文件后,键入以下命令:
tor --service remove
tor --service install -options ControlPort 9051
................................................ ...................................
好的,现在我们已经正确配置了 Tor,如果它已经 运行,您将不得不重新启动 Tor。
sudo service tor restart
Tor 现在应该已启动 & 运行 在 9051 ControlPort
上,我们可以通过它向它发送命令。我更喜欢使用 official stem library 来控制 Tor。
安装-
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 部分中的代码。出于某种我不知道的原因,您需要创建一个新的 session
对象才能使用新 IP。
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
requesocks
中的requests
太旧了,没有response.json()
和其他很多东西。
我想保持我的代码干净。但是,requests
目前还不支持 socks5(有关更多详细信息,请阅读此线程 https://github.com/kennethreitz/requests/pull/478)
所以我暂时使用 Privoxy
作为连接 Tor 的 http 代理。
在 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
Requests supports proxies 使用版本 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)
可以用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
这个答案完成了 Ashish Nitin Patil 对 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
就是密码。如果您想在控制台中设置不同的密码,请导航至 \Tor Browser\Browser\TorBrowser\Tor
并键入以下命令:tor.exe --hash-password password_XYZ | more
)。它会给你类似 HashedControlPassword 16:54C092A8...
This is your password 的信息。现在您可以将它添加到 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
)
编辑: 你会发现很多信息here(关于端口号和代理、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 协议实现 Torpy。根本不需要原始的 Tor 客户端或 Stem 依赖。
$ pip3 install torpy[requests]
...
$ 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'}
因此,每次获得新会话时,您都会获得新身份(基本上,您会获得带有新出口节点的新电路)。在自述文件 https://github.com/torpyorg/torpy
中查看更多示例
续IP的好功能。 Windows 例子
def renew_tor_ip():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="aAjkaI19!!laksjd")
controller.signal(Signal.NEWNYM)
用法示例
import requests
import time
from stem import Signal
from stem.control import Controller
def get_current_ip():
session = requests.session()
# TO Request URL with SOCKS over TOR
session.proxies = {}
session.proxies['http']='socks5h://localhost:9150'
session.proxies['https']='socks5h://localhost:9150'
try:
r = session.get('http://httpbin.org/ip')
except Exception as e:
print(str(e))
else:
return r.text
#16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15 to aAjkaI19!!laksjd
#cmd shell "C:\Users\Arthur\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe" --hash-password aAjkaI19!!laksjd | more
#Torcc config
#ControlPort 9051
#HashedControlPassword 16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15
def renew_tor_ip():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="aAjkaI19!!laksjd")
controller.signal(Signal.NEWNYM)
for i in range(5):
print(get_current_ip())
renew_tor_ip()
time.sleep(5)
我想使用 Tor 向网页发出多个 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
利用这个,我提出了一个要求。如何更改 ipaddress 以创建另一个?
这是你要使用的代码(使用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")
祝你好运,希望一切顺利。
你的问题有两个方面 -
- 使用 Tor 发出请求
- 根据要求更新连接(在您的情况下,在每次请求之后)
第 1 部分
第一个很容易使用最新的(v2.10.0 以上版本)requests
library with an additional requirement of requests[socks]
使用 socks 代理。
安装-
pip install 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 用户的警告: 请参阅 post
windows 上存在一个问题,如果使用以下命令安装 tor,则忽略 torrc 文件中控制端口的设置:
tor --service install
要解决此问题,请在编辑您的 torrc 文件后,键入以下命令:
tor --service remove
tor --service install -options ControlPort 9051
................................................ ...................................
好的,现在我们已经正确配置了 Tor,如果它已经 运行,您将不得不重新启动 Tor。
sudo service tor restart
Tor 现在应该已启动 & 运行 在 9051 ControlPort
上,我们可以通过它向它发送命令。我更喜欢使用 official stem library 来控制 Tor。
安装-
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 部分中的代码。出于某种我不知道的原因,您需要创建一个新的 session
对象才能使用新 IP。
session = get_tor_session()
print(session.get("http://httpbin.org/ip").text)
requesocks
中的requests
太旧了,没有response.json()
和其他很多东西。
我想保持我的代码干净。但是,requests
目前还不支持 socks5(有关更多详细信息,请阅读此线程 https://github.com/kennethreitz/requests/pull/478)
所以我暂时使用 Privoxy
作为连接 Tor 的 http 代理。
在 Mac
上安装和配置 Privoxybrew 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
上安装和配置 Privoxysudo 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
Requests supports proxies 使用版本 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)
可以用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
这个答案完成了 Ashish Nitin Patil 对 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
就是密码。如果您想在控制台中设置不同的密码,请导航至 \Tor Browser\Browser\TorBrowser\Tor
并键入以下命令:tor.exe --hash-password password_XYZ | more
)。它会给你类似 HashedControlPassword 16:54C092A8...
This is your password 的信息。现在您可以将它添加到 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
)
编辑: 你会发现很多信息here(关于端口号和代理、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 协议实现 Torpy。根本不需要原始的 Tor 客户端或 Stem 依赖。
$ pip3 install torpy[requests]
...
$ 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'}
因此,每次获得新会话时,您都会获得新身份(基本上,您会获得带有新出口节点的新电路)。在自述文件 https://github.com/torpyorg/torpy
中查看更多示例续IP的好功能。 Windows 例子
def renew_tor_ip():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="aAjkaI19!!laksjd")
controller.signal(Signal.NEWNYM)
用法示例
import requests
import time
from stem import Signal
from stem.control import Controller
def get_current_ip():
session = requests.session()
# TO Request URL with SOCKS over TOR
session.proxies = {}
session.proxies['http']='socks5h://localhost:9150'
session.proxies['https']='socks5h://localhost:9150'
try:
r = session.get('http://httpbin.org/ip')
except Exception as e:
print(str(e))
else:
return r.text
#16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15 to aAjkaI19!!laksjd
#cmd shell "C:\Users\Arthur\Desktop\Tor Browser\Browser\TorBrowser\Tor\tor.exe" --hash-password aAjkaI19!!laksjd | more
#Torcc config
#ControlPort 9051
#HashedControlPassword 16:8EE7AEE3F32EEEEB605C6AA6C47B47808CA6A81FA0D76546ADC05F0F15
def renew_tor_ip():
with Controller.from_port(port = 9051) as controller:
controller.authenticate(password="aAjkaI19!!laksjd")
controller.signal(Signal.NEWNYM)
for i in range(5):
print(get_current_ip())
renew_tor_ip()
time.sleep(5)