Skip to main content
 首页 » 编程设计

python之通过代理通过 python 连接到保管箱

2025年05月04日7xiaohuochai

我正在尝试使用 python 2.7.4 (x64 win7) 及其指南连接到 Dropbox 帐户 here帮了我很多。然而,当我在代理后面时,这段代码就不会这样做。 (在家里,代码运行良好,我不在代理后面)

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

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 上的代理,Dropbox 等待 433。就此而言,我无法连接到任何 https:// -地址。所以我找到了这段代码:

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

这行得通,但我缺乏使它适应套接字连接的技能。特别令人困惑的是,我将 proxyAdress 提供给连接,并且必须在 header 或某处写入请求,与通常的方式相比,我可以将最终地址提供给连接。

这是我读到 SOCKS 的时候对于 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 函数以使用代理。

请您参考如下方法:

我自己刚遇到这个问题,在寻找解决方案的过程中看到了这篇文章。

我已经通过对 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 或类似工具进行身份验证时才有效。

希望这对某人有帮助。