You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现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()

关键改动说明

  1. 记录已回复评论

    • 新增load_replied_commentssave_replied_comment函数,用文本文件存储已回复的评论ID,重启机器人后也不会丢失记录。
    • 每次检测评论前,先判断comment.id是否在已回复集合中,是就跳过。
  2. 避免自回复

    • 添加了判断comment.author and comment.author.name == BOT_USERNAME,如果评论是机器人自己发的,直接跳过。这里加上comment.author判断是为了避免处理已被删除作者的评论导致报错。
  3. 评论加载优化

    • 使用post.comments.replace_more(limit=0)加载所有嵌套评论,避免只检测到顶层评论而漏掉子评论。
    • 可以给subreddit.new()设置limit参数,控制每次读取的最新帖子数量,防止机器人处理过多内容导致性能问题。
  4. 修复代码疏漏

    • comment.save改成comment.save(),确保执行保存操作。
    • 加入了异常捕获,避免回复过程中出现错误导致机器人崩溃。

内容的提问来源于stack exchange,提问作者Tasrif Rahman

火山引擎 最新活动