通过代理通过 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

无法通过代理连接到 websocket

使用 Python Paramiko 通过双 SSH 隧道连接到数据库

如何使用 WinINet 通过代理连接到 HTTPS

通过http代理连接到FTP服务器