Python requests 和 OpenSSL - HTTPSConnectionPool 最大重试次数 exceeded

3 投票
1 回答
7807 浏览
提问于 2025-04-18 11:07

我在Ubuntu 14.04上使用python的requests库时遇到了问题,执行以下脚本时:

import requests
import json

payload = {'code':'TG-000000000000000000000000', 'client_secret':'X0000000000000000000000000000000', 'grant_type':'authorization_code', 'client_id':'1111111111111111', 'redirect_uri':'http://127.0.0.1:8000/mercadolibre/process_ml_response/'}
headers = {'content-type': 'application/x-www-form-urlencoded'}
requests.post("https://api.mercadolibre.com:443/oauth/token", data=payload, headers=headers)

我得到了以下错误信息:

  File "<stdin>", line 1, in <module>
  File "/home/theuser/.virtualenvs/tumoto/local/lib/python2.7/site-packages/requests/api.py", line 88, in post
    return request('post', url, data=data, **kwargs)
  File "/home/theuser/.virtualenvs/tumoto/local/lib/python2.7/site-packages/requests/api.py", line 44, in request
    return session.request(method=method, url=url, **kwargs)
  File "/home/theuser/.virtualenvs/tumoto/local/lib/python2.7/site-packages/requests/sessions.py", line 456, in request
    resp = self.send(prep, **send_kwargs)
  File "/home/theuser/.virtualenvs/tumoto/local/lib/python2.7/site-packages/requests/sessions.py", line 559, in send
    r = adapter.send(request, **kwargs)
  File "/home/theuser/.virtualenvs/tumoto/local/lib/python2.7/site-packages/requests/adapters.py", line 375, in send
    raise ConnectionError(e, request=request)
requests.exceptions.ConnectionError: HTTPSConnectionPool(host='api.mercadolibre.com', port=443): Max retries exceeded with url: /oauth/token (Caused by <class 'socket.error'>: [Errno 104] Connection reset by peer)

如果我在Ubuntu 13.10上运行同样的代码,就没有问题。

我猜这个错误可能和openssl的版本(1.0.1f)以及requests库有关。

我尝试安装pyOpenSSL、ndg-httpsclient和pyasn1,正如在使用requests与TLS时不支持SNI中建议的那样,但还是不行。我还在运行脚本前应用了猴子补丁,但也失败了。

注意:当我使用pyOpenSSL时,出现的新错误是:

request.exceptions.SSLError: [Errno bad handshake](104, 'ECONNRESET') 

感谢任何建议。

1 个回答

-1

我找到一个可以在Ubuntu 14.04的OpenSSL版本上正常工作的requests的分支,链接是 https://github.com/joequery/requests-sslv3。只需要通过pip安装这个分支,requests就又能正常使用了。

撰写回答