调用Twitter API出现SSLError证书验证失败的解决方法
Twitter API 调用SSL证书报错排查方案
问题复现
出于学习目的申请Twitter开发者平台API权限后,使用Tweepy编写内容爬取代码如下:
import tweepy import ssl ssl._create_default_https_context = ssl._create_unverified_context consumer_key = "" consumer_secret = "" access_token = "" access_token_secret = "" auth = tweepy.OAuth1UserHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api =tweepy.API(auth) results = [] keyword = "nft" tweet = api.search_tweets(keyword) for i in tweet: results.append(i.text) print(results)
运行时持续抛出SSL相关报错:
requests.exceptions.SSLError: HTTPSConnectionPool(host='free-proxy-list.net', port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1129)')))
尝试过搜索引擎检索到的通用SSL修复方案均无效。
核心根因定位
首先注意两个容易被忽略的关键点:
- 代码中写的
ssl._create_default_https_context = ssl._create_unverified_context仅对Python原生urllib生效,Tweepy依赖的requests库使用独立的certifi证书库做校验,这行配置完全不生效。 - 报错的请求目标域名是
free-proxy-list.net,并非Twitter官方API域名api.twitter.com,说明请求根本没有发送到Twitter服务器,问题和Twitter API本身无关。
分步解决流程
- 第一步:清理异常代理/篡改包
报错指向免费代理列表站点,首先排查环境中的代理配置:- 在代码最开头加入以下代码打印系统代理变量:
如果输出非空的代理地址,先执行import os print("HTTP_PROXY:", os.environ.get("HTTP_PROXY")) print("HTTPS_PROXY:", os.environ.get("HTTPS_PROXY")) print("ALL_PROXY:", os.environ.get("ALL_PROXY"))unset 对应变量名(Linux/macOS)或在系统环境变量设置中删除对应代理项后重试。 - 检查系统中运行的代理工具(Clash、V2Ray等)是否开启了全局模式、是否配置了自动拉取免费代理的规则,临时关闭代理或切到规则模式测试。
- 排查Python包环境:运行
pip list查看是否存在名称可疑的自动注入代理的第三方包,若有直接卸载。最稳妥的方式是新建干净虚拟环境安装官方版Tweepy:pip install virtualenv virtualenv twitter_venv # Windows执行 twitter_venv\Scripts\activate # Linux/macOS执行 source twitter_venv/bin/activate pip install tweepy
- 在代码最开头加入以下代码打印系统代理变量:
- 第二步:正确配置SSL校验规则
删掉代码中无效的全局ssl上下文修改代码,先升级requests依赖的证书库到最新版本:
如果本地调试时因为抓包工具(Fiddler、Charles等)需要临时关闭SSL校验,初始化Tweepy客户端时显式传入参数即可,不要做全局修改:pip install --upgrade certifi requests# *注意:仅本地调试临时使用,生产环境禁止关闭SSL校验,存在中间人攻击风险* api = tweepy.API(auth, verify=False) - 第三步:连通性验证
完成上述配置后,先调用凭证校验接口测试连通性,不要直接调用搜索接口:
该接口调用成功后,再执行关键词搜索逻辑即可正常运行。# 验证成功会返回你的开发者账号用户名 print(api.verify_credentials().screen_name)
内容的提问来源于stack exchange,提问作者Irene
相关产品推荐
相关产品推荐

