使用Python requests模块进行Facebook图形GET请求时证书验证失败
我正在写一个简单的Python脚本,想要检查几个网页的点赞数量。为了实现这个,我使用了Python的requests模块。不过,下面出现了一个问题,跟证书有关。我对网页编程还比较陌生,所以不太清楚该怎么解决。r = requests.get("http://www.google.com/")
这个请求是正常的,返回了结果。
错误信息(最近的调用): r = requests.get("https://graph.facebook.com/cocacola") 错误原因:SSL3_GET_SERVER_CERTIFICATE:证书验证失败
谢谢!
2 个回答
你安装过 certifi 吗?我最近也遇到过类似的问题。因为GPL许可证的问题,Kenneth Reitz和他的团队不得不把SSL许可证包移到另一个仓库。
我刚刚用最新的从pypi安装的 certifi
试了一下,结果一切正常:
>>> import requests
>>> r = requests.get("https://graph.facebook.com/cocacola")
>>> r
<Response [200]>
关于许可证的问题还有更多讨论,可以在这个 Github问题讨论串 中找到(特别说明:我是这个讨论串的发起人)。
如果新的 certifi
还是不能解决问题,你可以试试 Requests的Github问题页面。他们的社区非常友好,反应也很快!
编辑:如果最新的 certifi
还是不行,我强烈推荐另一个发帖者的建议,试试 verify=False
。
这个错误看起来是来自OpenSSL的。你可能在环境中有一些配置,导致Requests把证书的位置设置成了一个不包含你需要的证书的地方。
你可以试着调查一下Requests可能是如何检查证书的:
- 它会查看环境变量
REQUESTS_CA_BUNDLE
中的配置。 - 它会检查是否有curl兼容性检查,使用的是
CURL_CA_BUNDLE
环境变量。 - 如果可以导入
certifi
包,它会尝试导入证书列表。
检查一下你的环境中是否有REQUESTS_CA_BUNDLE
或CURL_CA_BUNDLE
:
env | egrep "REQUESTS_CA_BUNDLE|CURL_CA_BUNDLE"
如果其中一个被设置了,Requests可能会在验证证书时使用这个配置。如果没有,Requests可能会使用certifi
。在这种情况下,更新一下certifi
可能是个好主意:
pip install -U certifi
如果还是不行,可以尝试在requests.get
中加上verify=False
,这样就可以跳过验证步骤。我建议还是解决真正的问题,而不是简单地关闭验证,但这可能会帮助你找到问题的根源。