通过代理隧道 httplib

Posted

技术标签:

【中文标题】通过代理隧道 httplib【英文标题】:Tunneling httplib Through a Proxy 【发布时间】:2012-08-02 02:17:30 【问题描述】:

我想弄清楚如何通过代理将数据发送到服务器。我希望通过 tor 可以做到这一点,但是由于 tor 使用 SOCKS,所以使用 httplib 显然是不可能的(如果我错了,请纠正我)

这就是我现在拥有的

import httplib
con = httplib.HTTPConnection("google.com")
con.set_tunnel(proxy, port)
con.send("Sent Stuff")

问题是,设置隧道时它似乎冻结了。感谢您的帮助。

【问题讨论】:

“代理”的值是多少?名称或 IP 地址? IP 地址。我试图在这个例子中使用一个 http 代理。 【参考方案1】:

作为 Khue Vu 回答的后续,这里有一个完整的示例,使用 SOCKS 代理进行此操作的细节比预期的要复杂。

首先安装 PySocks:

pip install PySocks

然后你需要在实例化你的 HTTPConnection 之后手动设置你的 SOCKS 代理并通知它它将使用代理:

from http.client import HTTPConnection
from urllib.parse import urlparse, urlencode

import socks

url = urlparse("http://final.destination.example.com:8888/")

conn = HTTPConnection('127.0.0.1', 9000) # use socks proxy address
conn.set_tunnel(url.netloc, url.port) # remote host and port that you actually want to talk to
conn.sock = socks.socksocket() # manually set socket
conn.sock.set_proxy(socks.PROXY_TYPE_SOCKS5, "127.0.0.1", 9000) # use socks proxy address
conn.sock.connect((url.netloc, url.port)) # remote host and port that you actually want to talk to

request_path = "%s?%s" % (url.path, url.query)
conn.request("POST", request_path, post_data)

注意上面的导入是python3.x

【讨论】:

【参考方案2】:

看起来正确的答案是:

http://bugs.python.org/issue11448#msg130413

import httplib
con = httplib.HTTPConnection(proxyHost, proxyPort)
con.set_tunnel("www.google.com", 80)
con.send("Sent Stuff")

【讨论】:

【参考方案3】:

如果要使用http代理,应该是这样的:

import httplib
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "http://www.google.com", params)

如果你想使用 SOCKS 代理,你可以使用 SocksiPy,如下问题:How can I use a SOCKS 4/5 proxy with urllib2?

【讨论】:

啊,我明白了,我有轻微的偏差。 这种行为很容易将 python 带入与 php 相同的模糊或令人困惑的语言特性联盟......该死!

以上是关于通过代理隧道 httplib的主要内容,如果未能解决你的问题,请参考以下文章

无法通过代理进行隧道传输。代理通过 https 返回“HTTP/1.1 407”

使用 JSch 创建一个通过 SSH 隧道化的 SOCKS 代理

通过代理使用 Telnet 隧道 HTTP

Gcloud SSH 隧道代理始终通过美国,甚至来自其他地区

Java Web Start:自 Java 8 Update 111 以来无法通过代理隧道

如何配置系统通过 ssh 反向隧道/代理使用 git?