如何实现Reddit机器人按最新排序评论并避免重复回复与自回复
解决Reddit机器人重复回复与自回复问题
嘿,我来帮你搞定这两个头疼的问题!你的机器人目前遇到的重复回复和自回复问题,其实都是因为缺少两个关键的判断逻辑,加上一点小的代码疏漏。咱们一步步来改:
问题根源与解决方案思路
- 重复回复:每次运行代码时,机器人会重新遍历所有符合条件的评论,没有记录已经回复过的评论ID,所以会重复操作。我们需要把已回复的评论ID存储下来,每次检测前先检查这个列表。
- 自回复:机器人遍历评论时会包含自己发出的评论,只要判断评论的作者是不是机器人账号本身,就能跳过这类评论。
- 另外你代码里的
comment.save少了括号,应该是comment.save(),不然不会执行保存操作。
修改后的完整代码
import time import praw # 初始化reddit实例(这里假设你已经正确配置了认证信息) reddit = praw.Reddit( client_id="YOUR_CLIENT_ID", client_secret="YOUR_CLIENT_SECRET", user_agent="YOUR_USER_AGENT", username="YOUR_BOT_USERNAME", password="YOUR_BOT_PASSWORD" ) BOT_USERNAME = "YOUR_BOT_USERNAME" REPLIED_COMMENTS_FILE = "replied_comments.txt" TARGET_SUBREDDIT = "Gintama" KEYWORD = " zura " def load_replied_comments(): """加载已经回复过的评论ID""" try: with open(REPLIED_COMMENTS_FILE, "r") as f: return set(f.read().splitlines()) except FileNotFoundError: return set() def save_replied_comment(comment_id): """保存已回复的评论ID到文件""" with open(REPLIED_COMMENTS_FILE, "a") as f: f.write(f"{comment_id}\n") def main(): replied_comments = load_replied_comments() subreddit = reddit.subreddit(TARGET_SUBREDDIT) for post in subreddit.new(limit=10): # 可以设置limit控制每次读取的最新帖子数量,避免过载 # 加载所有评论(包括嵌套评论),避免只检测顶层评论 post.comments.replace_more(limit=0) for comment in post.comments.list(): # 跳过没有body的评论(比如被删除的评论) if not hasattr(comment, "body"): continue # 1. 跳过机器人自己的评论 if comment.author and comment.author.name == BOT_USERNAME: continue # 2. 跳过已经回复过的评论 if comment.id in replied_comments: continue comment_lower = comment.body.lower() if KEYWORD in comment_lower: print("_________________") print(f"找到目标评论:{comment.body}") try: comment.reply("Zura janai, Katsura da!!") comment.save() save_replied_comment(comment.id) replied_comments.add(comment.id) print("回复成功,已记录评论ID") time.sleep(600) # 回复后休眠,避免触发Reddit的速率限制 except Exception as e: print(f"回复时出错:{e}") if __name__ == "__main__": main()
关键改动说明
记录已回复评论:
- 新增
load_replied_comments和save_replied_comment函数,用文本文件存储已回复的评论ID,重启机器人后也不会丢失记录。 - 每次检测评论前,先判断
comment.id是否在已回复集合中,是就跳过。
- 新增
避免自回复:
- 添加了判断
comment.author and comment.author.name == BOT_USERNAME,如果评论是机器人自己发的,直接跳过。这里加上comment.author判断是为了避免处理已被删除作者的评论导致报错。
- 添加了判断
评论加载优化:
- 使用
post.comments.replace_more(limit=0)加载所有嵌套评论,避免只检测到顶层评论而漏掉子评论。 - 可以给
subreddit.new()设置limit参数,控制每次读取的最新帖子数量,防止机器人处理过多内容导致性能问题。
- 使用
修复代码疏漏:
- 把
comment.save改成comment.save(),确保执行保存操作。 - 加入了异常捕获,避免回复过程中出现错误导致机器人崩溃。
- 把
内容的提问来源于stack exchange,提问作者Tasrif Rahman




