Python调用Twitter API流式接口报HTTP 403错误如何解决
问题描述
- 运行环境:Python
- 前置条件:已获取Twitter API Elevated访问权限,完成开发者门户应用配置,走完OAuth 1.0认证流程
- 故障现象:调用流式接口固定返回错误
Stream encountered HTTP error: 403,无法定位问题原因 - 复现代码:
import tweepy api_key = "" api_key_secret = "" access_token = "" access_token_secret = "" stream = tweepy.Stream(api_key,api_key_secret, access_token, access_token_secret) stream.filter(track=["President"])
故障原因
你使用的tweepy.Stream类对接的是Twitter API v1.1版本的statuses/filter流式端点,返回403基本是以下三类问题导致:
- 应用未关联到持有Elevated权限的项目,独立创建的standalone应用默认只有基础权限,无v1.1接口访问资格
- 应用权限配置不匹配,或修改权限后未重新生成access token,旧token会自动失效
- 2023年之后新申请的Elevated权限对v1.1旧端点的访问限制收紧,部分账号即便有Elevated权限也无法调用旧版v1.1流接口
修复方案
按优先级从高到低排查操作:
- 优先切换到API v2版本流式接口
v1.1旧端点已进入逐步下线流程,新权限适配差,直接用tweepy对应v2接口的StreamingClient实现即可,只需要Bearer Token就能调用,不需要配置OAuth1.0的四个密钥,参考代码:
import tweepy # 替换为你自己应用的Bearer Token,在开发者门户应用的Keys and Tokens页面生成 bearer_token = "" class CustomStream(tweepy.StreamingClient): def on_tweet(self, tweet): # 这里写自定义的推文处理逻辑 print(tweet.text) if __name__ == "__main__": stream = CustomStream(bearer_token) # 清除已有规则避免重复匹配 existing_rules = stream.get_rules().data if existing_rules: stream.delete_rules([rule.id for rule in existing_rules]) # 添加过滤规则 stream.add_rules(tweepy.StreamRule("President")) # 启动流 stream.filter()
- 如果必须使用v1.1版本接口,按以下步骤校验配置:
- 打开开发者门户,确认当前使用的应用挂载在已开通Elevated权限的Project下,未关联项目的独立应用没有v1.1接口访问权限
- 进入应用的用户认证设置页,确认应用权限至少开启「Read」读权限;如果之前修改过权限等级,必须到Keys and Tokens页面重新生成
access_token和access_token_secret,旧token在权限变更后会直接失效 - 给Stream类加错误调试逻辑,打印完整错误响应定位具体问题,参考代码:
import tweepy api_key = "" api_key_secret = "" access_token = "" access_token_secret = "" class DebugStream(tweepy.Stream): def on_error(self, status_code): print(f"请求错误码:{status_code}") print(f"完整响应内容:{self.response.text}") # 返回False会直接终止流,方便排查 return False stream = DebugStream(api_key,api_key_secret, access_token, access_token_secret) stream.filter(track=["President"])
内容的提问来源于stack exchange,提问作者user17540557
相关产品推荐
相关产品推荐

