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>