基于Tweepy StreamListener的Twitter bot触发推文无响应问题
解决你的Twitter Bot无响应问题
看起来你的Bot逻辑方向是对的,但几个关键细节没处理到位,导致它没法正常监听目标账号的推文。我帮你逐一排查并修复:
1. 监听器实例传递错误
你已经创建了myStreamListener对象,但初始化tweepy.Stream时却重新实例化了MyStreamListener(),这会导致你定义的on_status方法没被真正使用。应该传入已经创建好的myStreamListener实例。
2. 错误使用track参数
track参数是用来监听包含指定关键词的所有推文,而你要监听特定用户的推文,应该改用follow参数,并且需要传入目标用户的数字ID(不是屏幕名)。你可以通过以下代码获取目标用户的ID:
user = api.get_user(screen_name='xxxxxx') print(user.id_str)
3. Listener内部无法访问api对象
在MyStreamListener的on_status方法里直接调用api.update_status会有问题,因为类内部没有持有api的引用。需要在初始化Listener时把api对象传进去并保存。
4. Python版本兼容性(可选)
你的代码用了Python2的print语法(无括号),如果后续切换到Python3环境会报错,建议改成兼容写法print("Test Message")。
修正后的完整代码
import tweepy import time # 替换成你的API密钥 consumer_key = 'xxxxxxx' consumer_secret = 'xxxxxxxx' access_token = 'xxxxxxx' access_token_secret = 'xxxxxxxx' auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) auth.secure = True print("Test Message") api = tweepy.API(auth) class MyStreamListener(tweepy.StreamListener): def __init__(self, api): self.api = api # 保存API实例到类内部 super().__init__(api) def on_status(self, status): # 检查推文作者的屏幕名(统一转小写避免大小写问题) if status.user.screen_name.lower() == 'xxxxxx': # 避免Bot转发自己的推文(可选但推荐) if status.user.id != self.api.me().id: try: self.api.update_status('Test Tweet') print("Bot successfully sent a tweet!") except tweepy.TweepError as e: print(f"Error sending tweet: {e.reason}") # 初始化Listener并传入API对象 myStreamListener = MyStreamListener(api) myStream = tweepy.Stream(auth=api.auth, listener=myStreamListener) # 替换成你获取到的目标用户数字ID target_user_id = '123456789' # 使用follow参数监听目标用户的推文 myStream.filter(follow=[target_user_id])
额外注意事项
- API权限检查:确保你的Twitter开发者项目已经开启了读写权限(默认是只读),否则无法发布推文。可以在开发者平台的「项目设置」里修改权限。
- 错误捕获:加上
tweepy.TweepError的捕获,能帮你排查比如重复推文、限流等问题。 - 测试验证:修改后先手动给目标账号发一条测试推文,查看控制台输出,确认Bot是否进入
on_status方法并成功发推。
内容的提问来源于stack exchange,提问作者heroZero
相关产品推荐
相关产品推荐

