我已经安装了Anaconda并尝试通过Jupyter笔记本进行API调用时遇到SSL问题:
import requests
import certifi
r = requests.get('https://github.com/')
print(r)
这首先产生了SSL连接错误。经过广泛的搜索和我们IT部门的帮助,我可以解决该问题。解决方案是将公司根证书添加到证书存储中。
不幸的是,现在对于其他请求,我仍然遇到相同的问题。使用google2pandas包调用Google Analytics API的示例代码:
from google2pandas import *
query = {
'reportRequests': [{
'viewId' : 37616054,
'dateRanges': [{
'startDate' : '8daysAgo',
'endDate' : 'today'}],
'dimensions' : [
{'name' : 'ga:date'},
{'name' : 'ga:pagePath'},
{'name' : 'ga:browser'}],
'metrics' : [
{'expression' : 'ga:pageviews'}],
'dimensionFilterClauses' : [{
'operator' : 'AND',
'filters' : [
{'dimensionName' : 'ga:browser',
'operator' : 'REGEXP',
'expressions' : ['Firefox']},
{'dimensionName' : 'ga:pagePath',
'operator' : 'REGEXP',
'expressions' : ['iPhone']}]
}]
}]
}
# Assume we have placed our client_secrets_v4.json file in the current
# working directory.
conn = GoogleAnalyticsQueryV4(secrets='Analytics.json')
df = conn.execute_query(query)
在这里,我仍然收到之前在简单调用中遇到的SSL错误:
C:\ ProgramData \ Anaconda3 \ lib \ ssl.py in _create(cls,sock,server_side, do_handshake_on_connect,suppress_ragged_eofs,server_hostname, 上下文,会话) 848#无阻塞 849提高ValueError(“ do_handshake_on_connect不应该为 非阻塞插座”) -> 850 self.do_handshake() 851除了(OSError,ValueError): 852 self.close()
do_handshake中的C:\ ProgramData \ Anaconda3 \ lib \ ssl.py(self,block)
1106如果超时== 0.0并阻止:1107
self.settimeout(无) -> 1108 self._sslobj.do_handshake()1109最后:1110 self.settimeout(timeout)SSLCertVerificationError:[SSL:CERTIFICATE_VERIFY_FAILED]证书 验证失败:无法获取本地发行者证书(_ssl.c:1045)
我相信还有一个不依赖证书的图书馆在使用中?但是我对在哪里以及如何添加根证书一无所知,因此所有iPython请求都可以使用。
任何想法都值得赞赏。
答案 0 :(得分:0)
您可以猴子修补__init__
的{{1}}方法,以便它始终通过强制使用ssl.SSLSocket
参数来忽略SSL证书验证。
将此添加到脚本的开头:
cert_reqs=CERT_NONE
答案 1 :(得分:0)
我已经取得了进步。 httplib2是导致问题的软件包。它有自己的cacerts.txt,我现在也在其中添加了根证书。
干杯
安德烈亚斯
答案 2 :(得分:0)
我花了几天的时间弄清楚如何解决这个问题。最后,我将我公司的CA证书添加到请求库使用的配置文件中。您可以通过以下方式检查该文件的路径:
import requests as r
print(r.certs.where())
只需在证书底部添加证书!