部署于Heroku的Tweepy Bot遭遇重复推文时崩溃问题咨询
Tweepy Bot部署Heroku防重复发送及防崩溃解决方案
1. 新增发送前置校验逻辑,从根源避免重复发送请求
优先通过状态校验拦截重复发送请求,可选两种实现方式:
- 调用Twitter官方接口拉取账号最近24小时内的推文,和待发送的固定内容做比对,若匹配到已发送的相同内容则直接跳过本次执行。示例代码如下:
import tweepy from datetime import datetime, timedelta def check_daily_tweet_exist(api, target_content): # 拉取本账号最新10条非回复、非转发推文 recent_tweets = api.user_timeline(count=10, exclude_replies=True, include_rts=False) last_24h = datetime.utcnow() - timedelta(days=1) for tweet in recent_tweets: if tweet.text.strip() == target_content.strip() and tweet.created_at > last_24h: return True return False
- 也可借助Heroku免费的Postgres/Redis存储每日发送标记,每次触发执行时先读取标记判断是否已完成当日发送,发送成功后更新对应日期的标记即可。
2. 新增异常捕获兜底机制,避免单次错误导致服务崩溃
Twitter平台重复发送相同内容会返回错误码187(重复状态),针对该场景做异常捕获即可避免服务中断,示例代码如下:
def safe_post_tweet(api, content): try: api.update_status(content) print("当日推文发送成功") return True except tweepy.TweepyException as e: # 捕获重复推文错误,直接跳过不抛出异常 if e.api_code == 187 or "duplicate" in str(e).lower(): print("当日已发送过目标推文,跳过本次执行") return False # 其他错误仅打印日志,不中断服务 print(f"发送异常:{str(e)}") return False
实际执行时先调用校验逻辑,确认未发送后再调用安全发送接口即可。
3. 可选优化方案:减少冗余触发
如果你的Bot除每日定时发推外无其他实时响应需求,可直接使用Heroku Scheduler免费插件,设置每日固定时间触发一次发推任务,无需每30分钟唤醒一次dyno,从根源降低重复触发概率。
内容的提问来源于stack exchange,提问作者user16529600
相关产品推荐
相关产品推荐

