通过代理通过 python 连接到 Dropbox
Posted
技术标签:
【中文标题】通过代理通过 python 连接到 Dropbox【英文标题】:Connecting to dropbox via python over a proxy 【发布时间】:2013-04-18 12:46:45 【问题描述】:我正在尝试使用 python 2.7.4 (x64 win7) 连接到 Dropbox 帐户,他们的指南 here 帮助了我很多。但是,当我在代理后面时,这段代码就不会这样做。 (在家里,代码工作得很好,我不在代理后面)
我试图摆弄 dropbox/rest.py 中使用的 urllib2 和 httplib,但没有运气。我知道我必须更改连接代码,但我不确定如何为 Socket 执行此操作。
dropbox/rest.py [line:99]
def create_connection(address):
host, port = address
err = None
for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
af, socktype, proto, canonname, sa = res
sock = None
try:
sock = socket.socket(af, socktype, proto)
sock.connect(sa)
return sock
except socket.error, _:
err = _
if sock is not None:
sock.close()
if err is not None:
raise err
else:
raise socket.error("getaddrinfo returns an empty list")
我总是收到错误:[Errno 10060] SocketError。 我不太了解网络和端口,但我知道我可以连接到端口 3128 上的代理,并且保管箱在 433 上等待。就此而言,我无法连接到任何 https:// -地址。所以我找到了这段代码:
proxyHost = 'www.myProxy.adress.com'
proxyPort = 3128
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "https://www.google.com")
这可行,但我缺乏将其适应套接字连接的技能。特别令人困惑的是,与通常的方式相比,我将 proxyAdress 提供给连接并且必须将 Request 写入标头或某处,我可以将最终地址提供给连接。
这是当我阅读有关 python 的 SOCKS 并尝试它们时,但我无法轻松地将套接字代码替换为可以设置代理的新“socksocket”:
import socks
socks.setdefaultproxy(socks.PROXY_TYPE_SOCKS5,"www.myProxy.adress.com")
socket.socket = socks.socksocket
urllib.urlopen("https://www.google.com/")
非常感谢任何帮助,如何更改 rest.py 的 create_connection 函数以使用代理。
【问题讨论】:
【参考方案1】:我自己也遇到了这个问题,在寻找解决方案时偶然发现了这篇文章。
我已经设法通过对 dropbox/rest.py 代码的微小修改来解决此问题。
在RESTClientObject类的init方法改变:
self.pool_manager = urllib3.PoolManager(
num_pools=4, # only a handful of hosts. api.dropbox.com, api-content.dropbox.com
maxsize=max_reusable_connections,
block=False,
timeout=60.0, # long enough so datastores await doesn't get interrupted
cert_reqs=ssl.CERT_REQUIRED,
ca_certs=TRUSTED_CERT_FILE,
ssl_version=ssl.PROTOCOL_TLSv1,
)
到:
self.pool_manager = urllib3.ProxyManager(
num_pools=4, # only a handful of hosts. api.dropbox.com, api-content.dropbox.com
maxsize=max_reusable_connections,
block=False,
timeout=60.0, # long enough so datastores await doesn't get interrupted
cert_reqs=ssl.CERT_REQUIRED,
ca_certs=TRUSTED_CERT_FILE,
ssl_version=ssl.PROTOCOL_TLSv1,
proxy_url ='http://yourproxy.com:proxyport/',
)
注意使用 ProxyManager 而不是 PoolManager 的更改以及 proxy_url 的添加。
有一些方法可以针对代理进行身份验证,但我还没有探索过这些。因此,这只有在您已经通过 Internet Explorer 或类似方式进行身份验证时才有效。
希望这对某人有所帮助。
【讨论】:
不能只设置http_proxy和https_proxy环境变量吗?那不行吗?以上是关于通过代理通过 python 连接到 Dropbox的主要内容,如果未能解决你的问题,请参考以下文章
使用代理将 DataFlow 作业连接到 Cloud MySQL 是不是安全(通过 os.system)
Python stompest 无法通过 SSL 连接到 ActiveMQ