我想让make 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 = 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()
答案 0 :(得分:2)
我认为这是你的问题,但我可能错了。
您依靠monkeypatching socket.socket
强制HTTPConnection
使用您的SOCKS5代理与TOR交谈。但HTTPConnection
调用socket.create_connection
,在调用socket.getaddrinfo
创建套接字之前调用socket.socket
来解析名称。并getaddrinfo
不使用socket
。所以,它没有打补丁,所以它不与你的SOCKS5代理交谈,因此它使用你的默认名称解析器。
这适用于代理连接到普通互联网主机的连接,因为TOR将返回与“普通名称解析器”相同的“my-ip.heroku.com”DNS结果。但它不适用于“od6j46sy5zg7aqze.onion”,因为您的普通名称解析器中没有.onion TLD。
如果您感到好奇,可以看到HTTPConnection.connect
,socket.create_connection
和getaddrinfo
的来源(C中的最后一个,并且根据您的平台分散在整个模块中)。
那么,你怎么解决这个问题?好吧,看看两个名为socks
的SOCKS5模块,其中一个模块可以直接用monkeypatched代替create_connection
(它的API不相同,但它足够接近HTTPConnection
socks.socksocket
1}}需要);另一个没有,但你可以很容易地写一个(只需调用connect
然后调用它的HTTPConnection
方法)。或者,您可以修改socket.socket
以创建connect
并调用其socks
方法。
最后,您可能想知道为什么大多数不同的setdefaultproxy
模块都有一个remote_dns
函数,其中一个名为socks.socksocket
的参数明确声称它会导致远程执行DNS解析,什么时候实际上没有用。好吧,如果您使用socket.getaddrinfo
, 会有效,但如果您使用{{1}}则无法正常工作。
顺便说一句,如果你还没有读过DnsResolver和TorifyHOWTO,那么在进一步阅读之前先阅读它们,因为只是试图将一些有效的代码拼凑起来而不知道它为什么会起作用几乎可以保证当您认为自己是匿名时,会导致您(或您的用户)泄露信息。
答案 1 :(得分:0)
您可以将端口80添加到洋葱地址以避免DNS查找。 例如readPage( “od6j46sy5zg7aqze.onion:80”)
使用urllib2你还需要指定协议(即http) e.g。
import urllib2
print urllib2.urlopen(“http://od6j46sy5zg7aqze.onion:80”)。read()