使用tweepy开发Twitter机器人无法更新新提及消息如何解决
问题根因与修复方案
核心问题点
- 提及数据仅拉取一次:
api.mentions_timeline()调用放在了while循环外部,程序启动后就再也不会请求新的提及数据,永远处理启动时拉取的历史数据 - 已回复ID存储逻辑错误:
add_already_responded函数使用w覆盖模式写入文件,每次调用都会清空之前存储的所有已回复ID,仅保留最新一条- 函数调用位置错误,仅在接口报错时才会存储ID,回复成功时没有把ID写入本地文件,仅存在内存的临时集合中,下轮循环就会丢失
- 从文件读取的ID为字符串类型,和接口返回的整数类型
tweetId类型不匹配,存在性判断永远返回True,导致重复回复
- 循环无延时:无限循环没有添加等待时间,会高频调用API触发平台速率限制
修复后代码
import tweepy import time from pprint import pprint def get_already_responded(file_name): seen = set() # 增加文件不存在的兼容处理 try: with open(file_name, "r") as file: for line in file: # 直接转成整数,和接口返回类型统一 seen.add(int(line.strip())) except FileNotFoundError: pass return seen def add_already_responded(responded_id, file_name): # 改用a追加模式,不会清空历史数据 with open(file_name, "a") as file: file.write(str(responded_id) + "\n") FILE = 'responded.txt' auth = tweepy.OAuthHandler('removed', 'removed') auth.set_access_token('removed-removed', 'removed') api = tweepy.API(auth) while True: seen = get_already_responded(FILE) # 每次循环重新拉取最新的提及数据 mentions = api.mentions_timeline() for mention in mentions: userScreenName = mention.user.screen_name tweetId = mention.id textMsg = mention.text.split()[1:] print(f'{userScreenName} - {tweetId} --> {textMsg}') if tweetId not in seen: try: api.update_status(status=f"@{userScreenName} ur msg ---> {' '.join(textMsg)}", in_reply_to_status_id=tweetId) # 回复成功后再写入已回复文件 add_already_responded(tweetId, FILE) except tweepy.error.TweepError as e: print(f"处理推文{tweetId}出错: {e.reason}") # 增加15秒延时,避免触发速率限制,可根据需求调整 time.sleep(15)
额外优化说明
- 把
textMsg列表转成了字符串拼接,避免回复内容直接输出列表格式 - 增加了文件不存在的兼容逻辑,首次运行无需手动创建
responded.txt - 调整了异常捕获的范围,仅捕获接口调用逻辑的异常,避免掩盖其他报错
- 增加了错误日志打印,方便排查问题
内容的提问来源于stack exchange,提问作者Mike_Ś
相关产品推荐
相关产品推荐

