使用Python requests模块进行Facebook图形GET请求时证书验证失败

3 投票
2 回答
3339 浏览
提问于 2025-04-17 11:12

我正在写一个简单的Python脚本,想要检查几个网页的点赞数量。为了实现这个,我使用了Python的requests模块。不过,下面出现了一个问题,跟证书有关。我对网页编程还比较陌生,所以不太清楚该怎么解决。r = requests.get("http://www.google.com/") 这个请求是正常的,返回了结果。

错误信息(最近的调用): r = requests.get("https://graph.facebook.com/cocacola") 错误原因:SSL3_GET_SERVER_CERTIFICATE:证书验证失败

谢谢!

2 个回答

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

3

这个错误看起来是来自OpenSSL的。你可能在环境中有一些配置,导致Requests把证书的位置设置成了一个不包含你需要的证书的地方。

你可以试着调查一下Requests可能是如何检查证书的:

  1. 它会查看环境变量REQUESTS_CA_BUNDLE中的配置。
  2. 它会检查是否有curl兼容性检查,使用的是CURL_CA_BUNDLE环境变量。
  3. 如果可以导入certifi包,它会尝试导入证书列表。

检查一下你的环境中是否有REQUESTS_CA_BUNDLECURL_CA_BUNDLE

env | egrep "REQUESTS_CA_BUNDLE|CURL_CA_BUNDLE"

如果其中一个被设置了,Requests可能会在验证证书时使用这个配置。如果没有,Requests可能会使用certifi。在这种情况下,更新一下certifi可能是个好主意:

pip install -U certifi

如果还是不行,可以尝试在requests.get中加上verify=False,这样就可以跳过验证步骤。我建议还是解决真正的问题,而不是简单地关闭验证,但这可能会帮助你找到问题的根源。

撰写回答