Python 脚本通过 Tor 网络
Python script through the Tor network
我写了一个简单的 python 脚本来获取我的 ip。
import urllib
import socks
import socket
#set the proxy and port
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
#initialize the socket
socket.socket = socks.socksocket
#store the URL that we want
url = 'https://check.torproject.org/'
#open the URL and store it into 'response'
response = urllib.urlopen(url)
#parse the response
html = response.read()
#print to console
print html
没什么太复杂,但是在分析来自 check.torbrowser 的响应时问题就开始了。该站点将始终给我一个地址,该地址与我当前在同一页面上的 运行 Tor 浏览器不同。然而,html 响应会说我正在通过 Tor 网络路由,但它看起来不是来自 'standard' tor 浏览器。后半部分我理解,虽然我没有在上面的代码中包含它,但我正在玩 User-Agent 字符串和其他 headers,所以我将把它归结为主要原因。我不明白的是 h-e-double hockey sticks 中的 IP 是从哪里来的,作为 py 脚本的响应?
我的下一个问题是如何将 python 脚本正确连接到 Tor 网络?稍微谷歌搜索后,我发现 tor 会阻止除 socks 协议以外的所有流量,并且另一种方法是将 privoxy 与 tor 结合使用。我最初的想法是做某种会导致软件分层的路由。在我看来,它看起来像:
Python -> Privoxy -> Tor -> 目的地
我所有这一切的最终目标是获取一个基于 .onion 的地址并 save/read 它。然而,在所有这些问题开始出现之后,我把它放在一边。一些有助于获得更好答案的信息:我正在使用 Windows 机器,尽管我有一台 Linux 机器,如果那里可能存在一些有助于此过程的功能,我正在使用Python 2.7 同样,这很容易改变。
我想要求列出实现这一切的步骤 - 或者至少列出一些 links/direction,我绝不害怕阅读一些关于 blogs/tutorials主题。然而,我觉得这真的是几个独立的问题,需要一个安静的冗长答案,所以我很乐意在我扯掉更多头发之前知道我走在正确的道路上:)
您的代码是正确的,但是您假设 Tor 将始终为您提供相同的 IP 地址是不正确的。由于电路隔离,Tor 的一项隐私功能可确保您打开的连接之间的隔离,您通过与 Tor 浏览器不同的出口节点路由请求。
可靠地模拟 Tor 浏览器的行为很难,我建议不要这样做。您连接到 Tor 网络的方法看起来是正确的。
Tor 将允许您使用任何您想要的协议,但是是的,您需要通过 SOCKS 协议进行连接。不过这很好:几乎所有网络协议(包括 http)都可以很好地与 SOCKS 配合使用。
使用 torpy 库,您可以根据需要更新电路。
>>> from torpy.http.requests import TorRequests
>>>
>>> def show_ip(resp):
... for line in resp.text.splitlines():
... if 'Your IP address appears to be' in line:
... print(line)
...
>>> with TorRequests() as tor_requests:
... print("build circuit")
... with tor_requests.get_session() as sess:
... show_ip(sess.get("https://check.torproject.org/"))
... show_ip(sess.get("https://check.torproject.org/"))
... print("renew circuit")
... with tor_requests.get_session() as sess:
... show_ip(sess.get("https://check.torproject.org/"))
... show_ip(sess.get("https://check.torproject.org/"))
...
build circuit
<p>Your IP address appears to be: <strong>178.17.171.102</strong></p>
<p>Your IP address appears to be: <strong>178.17.171.102</strong></p>
renew circuit
<p>Your IP address appears to be: <strong>49.50.66.209</strong></p>
<p>Your IP address appears to be: <strong>49.50.66.209</strong></p>
我写了一个简单的 python 脚本来获取我的 ip。
import urllib
import socks
import socket
#set the proxy and port
socks.set_default_proxy(socks.SOCKS5, "127.0.0.1", 9150)
#initialize the socket
socket.socket = socks.socksocket
#store the URL that we want
url = 'https://check.torproject.org/'
#open the URL and store it into 'response'
response = urllib.urlopen(url)
#parse the response
html = response.read()
#print to console
print html
没什么太复杂,但是在分析来自 check.torbrowser 的响应时问题就开始了。该站点将始终给我一个地址,该地址与我当前在同一页面上的 运行 Tor 浏览器不同。然而,html 响应会说我正在通过 Tor 网络路由,但它看起来不是来自 'standard' tor 浏览器。后半部分我理解,虽然我没有在上面的代码中包含它,但我正在玩 User-Agent 字符串和其他 headers,所以我将把它归结为主要原因。我不明白的是 h-e-double hockey sticks 中的 IP 是从哪里来的,作为 py 脚本的响应?
我的下一个问题是如何将 python 脚本正确连接到 Tor 网络?稍微谷歌搜索后,我发现 tor 会阻止除 socks 协议以外的所有流量,并且另一种方法是将 privoxy 与 tor 结合使用。我最初的想法是做某种会导致软件分层的路由。在我看来,它看起来像:
Python -> Privoxy -> Tor -> 目的地
我所有这一切的最终目标是获取一个基于 .onion 的地址并 save/read 它。然而,在所有这些问题开始出现之后,我把它放在一边。一些有助于获得更好答案的信息:我正在使用 Windows 机器,尽管我有一台 Linux 机器,如果那里可能存在一些有助于此过程的功能,我正在使用Python 2.7 同样,这很容易改变。
我想要求列出实现这一切的步骤 - 或者至少列出一些 links/direction,我绝不害怕阅读一些关于 blogs/tutorials主题。然而,我觉得这真的是几个独立的问题,需要一个安静的冗长答案,所以我很乐意在我扯掉更多头发之前知道我走在正确的道路上:)
您的代码是正确的,但是您假设 Tor 将始终为您提供相同的 IP 地址是不正确的。由于电路隔离,Tor 的一项隐私功能可确保您打开的连接之间的隔离,您通过与 Tor 浏览器不同的出口节点路由请求。
可靠地模拟 Tor 浏览器的行为很难,我建议不要这样做。您连接到 Tor 网络的方法看起来是正确的。
Tor 将允许您使用任何您想要的协议,但是是的,您需要通过 SOCKS 协议进行连接。不过这很好:几乎所有网络协议(包括 http)都可以很好地与 SOCKS 配合使用。
使用 torpy 库,您可以根据需要更新电路。
>>> from torpy.http.requests import TorRequests
>>>
>>> def show_ip(resp):
... for line in resp.text.splitlines():
... if 'Your IP address appears to be' in line:
... print(line)
...
>>> with TorRequests() as tor_requests:
... print("build circuit")
... with tor_requests.get_session() as sess:
... show_ip(sess.get("https://check.torproject.org/"))
... show_ip(sess.get("https://check.torproject.org/"))
... print("renew circuit")
... with tor_requests.get_session() as sess:
... show_ip(sess.get("https://check.torproject.org/"))
... show_ip(sess.get("https://check.torproject.org/"))
...
build circuit
<p>Your IP address appears to be: <strong>178.17.171.102</strong></p>
<p>Your IP address appears to be: <strong>178.17.171.102</strong></p>
renew circuit
<p>Your IP address appears to be: <strong>49.50.66.209</strong></p>
<p>Your IP address appears to be: <strong>49.50.66.209</strong></p>