用python连接到.onion网络
我想让python从控制台进入.onion站点,下面的示例可以在python中使用tor,但当我尝试连接到.onion站点时,它会出现错误,例如“名称或服务未知”,如何修复此问题 示例代码:用python连接到.onion网络,python,proxy,tor,Python,Proxy,Tor,我想让python从控制台进入.onion站点,下面的示例可以在python中使用tor,但当我尝试连接到.onion站点时,它会出现错误,例如“名称或服务未知”,如何修复此问题 示例代码: import socket import socks import httplib def connectTor(): socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",9050,True) socket.socket =
import socket
import socks
import httplib
def connectTor():
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"127.0.0.1",9050,True)
socket.socket = socks.socksocket
print "Connected to tor"
def newIdentity():
HOST = '127.0.0.1'
socks.setdefaultproxy()
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST,9051))
s.send("AUTHENTICATE\r\n")
response = s.recv(128)
if response.startswith("250"):
s.send("SIGNAL NEWNYM\r\n"),
s.close()
connectTor()
def readPage(page):
conn = httplib.HTTPConnection(page)
conn.request("GET","/")
response = conn.getresponse()
print (response.read())
def main():
connectTor()
print "Tor Ip Address :"
readPage("my-ip.heroku.com")
print "\n\n"
readPage("od6j46sy5zg7aqze.onion")
return 0
if __name__ == '__main__':
main()
我想这是你的问题,但我可能错了 您正依赖monkeypatching
socket.socket
强制HTTPConnection
使用您的SOCKS5代理与TOR通话。但是HTTPConnection
调用socket.create\u connection
,它依次调用socket.getaddrinfo
解析名称,然后调用socket.socket
创建套接字。而且getaddrinfo
不使用socket
。所以,它没有补丁,所以它没有和你的SOCKS5代理对话,所以它使用你的默认名称解析器
这适用于代理连接到普通internet主机,因为TOR将为“my ip.heroku.com”返回与普通名称解析程序相同的DNS结果。但它不适用于“od6j46sy5zg7aqze.onion”,因为在您的普通名称解析程序中没有.onion TLD
如果您很好奇,您可以看到源代码to、and(最后一个在C中,根据您的平台分散在整个模块中)
那么,你如何解决这个问题呢?好的,看看两个被称为socks
的SOCKS5模块,其中一个模块有一个功能,可以直接用monkeypatch代替create\u connection
(它的API不完全相同,但它足够接近HTTPConnection
所需);另一个没有,但是您可以很容易地编写一个(只需调用socks.socksocket
,然后调用它的connect
方法)。或者您可以修改HTTPConnection
以创建socket.socket
并调用其connect
方法
最后,您可能想知道为什么大多数不同的socks
模块都有一个setdefaultproxy
函数,该函数带有一个名为remote\u dns
的参数,该参数特别声明它会导致在实际不起作用的情况下远程执行dns解析。好的,如果您使用socks.socksocket
,它确实可以工作,但是如果您使用socket.getaddrinfo
,它就不可能工作
顺便说一句,如果你还没有读过,在继续之前先读一遍,因为在不知道为什么的情况下尝试拼凑出有效的代码几乎肯定会导致你(或你的用户)在你认为自己是匿名的时候泄露信息。你可以在洋葱地址中添加端口80,以避免DNS查找。 e、 g.阅读页(“od6j46sy5zg7aqze.onion:80”) 对于urllib2,您还需要指定协议(即http) e、 g 导入urllib2
打印urlib2.urlopen(“”.read()最可能的问题是DNS解析发生在SOCKS之外。所以,“my ip.heroku.com”工作得很好,因为您的普通名称解析程序和TOR代理都将其解析为同一个ip,但是“od6j46sy5zg7aqze.onion”不能由您的普通名称解析程序解析。这并不能回答您的问题,但会帮助您集中精力进行调试,因此最好的第一步是确认这一点或排除它。另外,您使用的是哪个socks模块。其中至少有两个与您导入的运行时模块名相同,
socks
。您正在monkeypatchingsocket.socket
,但不是socket.getaddrinfo
。