Tweepy自定义StreamingClient子类报无user_agent属性错误排查
报错原因
AttributeError: 'StdOutListener' object has no attribute 'user_agent'由子类构造方法逻辑错误直接导致:
你重写StdOutListener的__init__方法时,完全覆盖了父类tweepy.StreamingClient的初始化流程。父类构造方法会自动完成请求会话初始化、user_agent参数配置、鉴权预处理等核心操作,这些操作被跳过之后,类实例不会生成user_agent等必备属性,后续调用add_rules()、filter()这类需要发起API请求的方法时,就会触发属性不存在的报错。
之前super调用未生效基本是传参错误导致:filename是子类自定义参数,不能传入父类构造方法,仅需将父类要求的bearer_token参数传入super调用即可。
代码修正说明
现有代码除初始化逻辑问题外,还有三处会触发运行错误的问题:
- 调用
open()时未指定打开模式,默认使用只读r模式,无法执行写入操作 - 未指定文件编码,遇到推文中的emoji、非英文字符时会触发编码报错
on_data返回的是原始字节格式数据,文件打开模式需要匹配二进制格式
修正后完整可运行代码:
import tweepy import credentials class StdOutListener(tweepy.StreamingClient): def __init__(self, bearer_token, filename): # 调用父类构造完成核心初始化 super().__init__(bearer_token) # 单独赋值子类自定义参数 self.filename = filename def on_data(self, data): # 用二进制追加模式打开文件,避免覆盖历史数据、匹配字节写入格式 with open(self.filename, 'ab') as file: file.write(data) # 写入换行符分隔每条推文,避免所有数据挤在同一行 file.write(b'\n') print("[+] File written!") return True def on_error(self, status): print(status) if __name__ == "__main__": filename = "tweets.json" listener = StdOutListener(credentials.BEARER_TOKEN, filename) # 可选:启动前清理历史流规则,避免规则重复导致拉取内容不符合预期 existing_rules = listener.get_rules().data if existing_rules: listener.delete_rules([rule.id for rule in existing_rules]) listener.add_rules(tweepy.StreamRule("Boston Celtics")) listener.filter()
可选优化
如果不想处理原始字节数据,可以重写on_response方法替代on_data,该方法会返回解析后的tweepy.Response对象,可以直接序列化后以文本格式写入json文件,处理更灵活。
内容的提问来源于stack exchange,提问作者Practical1
相关产品推荐
相关产品推荐

