You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 02:06:23