Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python连接到.onion网络_Python_Proxy_Tor - Fatal编程技术网

用python连接到.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 =

我想让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()

我想这是你的问题,但我可能错了

您正依赖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
。您正在monkeypatching
socket.socket
,但不是
socket.getaddrinfo