我正在尝试使用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上连接到代理,而dropbox在433上等待。就此而言,我无法连接到任何 https:// -adress。所以我找到了这段代码:
proxyHost = 'www.myProxy.adress.com'
proxyPort = 3128
conn = httplib.HTTPConnection(proxyHost, proxyPort)
conn.request("POST", "https://www.google.com")
哪个有效但我缺乏使其适应套接字连接的技能。特别令人困惑的是,我将proxyAdress提供给连接,并且必须在标题或某处写入请求,与通常的方式相比,我可以将最终地址添加到连接中。
当我读到有关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函数以使用代理都非常感谢。
答案 0 :(得分: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或类似工具进行过身份验证后才能使用此功能。
希望这有助于某人。