2

我正在尝试使用 python 2.7.4 (x64 win7) 连接到 Dropbox 帐户,他们的指南我帮助很大。但是,当我在代理后面时,这段代码就不会这样做。(从家里代码效果很好,我不在代理后面)

我试图摆弄在dropbox/rest.py中使用的 urllib2 和 httplib,但没有运气。我知道我必须更改连接代码,但我不确定如何为套接字执行此操作。

保管箱/rest.py [行: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 上的代理,并且 dropbox 在 433 上等待。就此而言,我无法连接到任何https:// -adress。所以我找到了这段代码:

proxyHost = 'www.myProxy.adress.com'
proxyPort = 3128
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "https://www.google.com")

哪个有效,但我缺乏适应套接字连接的技能。特别令人困惑的是,与通常的方式相比,我将 proxyAdress 提供给连接,并且必须将 Request 写入标头或某处,我可以将最终地址提供给连接。

这是当我阅读SOCKS for python 并尝试它们时,但我无法轻松地将套接字代码替换为可以设置代理的新“ 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 函数以使用代理。

4

1 回答 1

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 或类似方式进行身份验证时才有效。

希望这可以帮助某人。

于 2014-05-23T04:12:33.943 回答