使用Tweepy创建Twitter线程时报错187状态重复如何解决
问题原因与修复方案
报错187的根因
tweepy.error.TweepError: [{'code': 187, 'message': 'Status is a duplicate.'}] 是推特平台的反垃圾机制触发,你要发布的推文内容和该账号历史发布过的内容完全重复,被系统拦截了。
现有代码的逻辑缺陷
你当前的实现有2个明显问题:
- 账号时间线
home是在循环开始前一次性拉取的,不会自动更新。你发布完第一条推文后,home[0]仍然是执行代码前的最新推文,不是刚发的第一条线程内容,后续回复的目标ID完全错误,很容易出现内容重复、线程串位的问题 - 拆分后的短语如果有重复,或者和历史发布内容撞车,就会触发187报错
修复后的实现方案
优化逻辑:每次发布完推文直接保存该条的ID作为下一条的回复目标,同时给每条内容加序号后缀,既避免重复报错,也方便读者阅读线程,代码示例如下:
import time # tweet_list 为拆分完成的短语列表 last_tweet_id = None for index, content in enumerate(tweet_list): # 拼接序号后缀,格式为「当前条数/总条数」 tweet_text = f"{content} {index + 1}/{len(tweet_list)}" if last_tweet_id is None: # 发布线程第一条内容 publish_resp = api.update_status(status=tweet_text) last_tweet_id = publish_resp.id else: # 回复上一条内容,接续线程 publish_resp = api.update_status( status=tweet_text, in_reply_to_status_id=last_tweet_id, auto_populate_reply_metadata=True ) # 更新为最新发布的推文ID last_tweet_id = publish_resp.id time.sleep(30)
额外排查建议
- 如果不需要显式展示序号,可以在内容末尾加无意义的随机字符(比如1位随机数字),同样可以避开重复校验
- 若修改后仍然报错187,检查你的拆分逻辑是否输出了完全一致的短语片段
- 不要通过拉取账号时间线的方式获取上一条推文ID,万一sleep间隔内账号发布了其他内容,会导致整个线程串到无关推文下,直接保存接口返回的ID是最稳妥的实现方式
内容的提问来源于stack exchange,提问作者Guilherme Goulart
相关产品推荐
相关产品推荐

