9

我正在尝试使用 Mike Lewis 的 Python 包装器向 Foursquare API 发出无用户请求 - https://github.com/mLewisLogic/foursquare

client = foursquare.Foursquare(client_id=Client_ID, client_secret=Client_Secret)
categs = client.venues.categories()

间歇性地,我收到“连接到 Foursquare API 时出错”的消息。运行记录器以捕获更详细的消息会产生:

“SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败”

这在我的本地 Windows 开发机器和运行 ubuntu 的服务器上都没有发生过。我在这里遗漏了一些关于安全证书的基本知识吗?问题是间歇性的,有时只需稍等片刻,然后重试即可暂时解决问题。

我已经下载了最新的 20120716 版本的包装器,尽管在 init.py 的代码中它仍然显示 API_VERSION = '20120608'。我正在使用 Python 2.73,并且还使用上述代码中的 id 和 secret 注册了 Foursquare API 密钥。我列出了网址,使用我的本地 IP:8000 并尝试为本地和开发机器使用单独的密钥,但这似乎没有什么区别。

非常感谢帮助。谢谢。

4

2 回答 2

23

我昨天遇到了完全相同的问题。我进行了很多搜索并尝试了很多,并且似乎以下策略适用于我的情况(我不是 100% 确定,但它不再报告错误)。

1)下载http://curl.haxx.se/ca/cacert.pem

wget http://curl.haxx.se/ca/cacert.pem

2) 转到您的 Python httplib2 目录。我的在 /usr/local/lib/python2.7/dist-packages/httplib2

cd /usr/local/lib/python2.7/dist-packages/httplib2

3)备份当前证书

cp cacerts.txt backup_cacerts.txt

4)然后将下载的文件复制到那里并将其重命名为cacerts.txt

mv cacert.pem cacerts.txt

就是这样。

希望能帮助到你。如果不能从备份文件中恢复并尝试其他方法。

更改后,我的foursquare脚本可以正常工作:)

于 2012-11-11T15:48:35.517 回答
0

安装或升级certifi包:

pip install --upgrade certifi

这是推荐的解决方案urllib3(许多项目都使用requests它,包括 ,上面链接的foursquare库和许多其他库又使用它):http://urllib3.readthedocs.io/en/latest/user-guide。 html#证书验证

如果您需要将它用于不使用 urllib3 而是 httplib2 的包,例如,您将certifi/cacerts.pem文件复制到httplib2/cacerts.txt. 要从/复制到的目录可以通过执行以下操作找到:

python -c 'import httplib2; import os.path; print(os.path.dirname(httplib2.__file__))'

python -c 'import certifi; import os.path; print(os.path.dirname(certifi.__file__))' 

如果您只是使用urllib2httplib2/则不使用目录,而是使用系统位置。您可以使用以下内容检查正在查看的文件:

strace python -c "import urllib2; urllib2.urlopen(urllib2.Request('https://google.com/'))" 2>&1 | grep 'open' | grep 'cert'
于 2016-08-21T11:53:43.813 回答