繁体   English   中英

通过Proxy通过python连接到Dropbox

[英]Connecting to dropbox via python over a proxy

我正在尝试使用python 2.7.4(x64 win7)连接到Dropbox帐户, 这里的指南对我有很大帮助。 但是,当我落后于代理服务器并且此代码将不会执行此操作。 (在家里,代码效果很好,我不在代理后面)

我试图摆弄在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:// -adress时遇到了麻烦。 所以我找到了这段代码:

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

哪个可行,但我缺乏使它适应套接字连接的技能。 尤其令人困惑的是,与通常可以将final-Adress提供给连接的方式相比,我将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函数以与代理一起使用。

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

我设法通过对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或类似工具进行身份验证的情况下才有效。

希望这对某人有帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM