如何修改Reddit评论机器人代码以支持多Subreddit与多关键词?
解决Reddit机器人多Subreddit与多关键词的问题
我来帮你搞定这个问题!你的代码里有两个关键逻辑错误,我一步步给你拆解并修正:
错误1:多Subreddit的调用方式不对
你用r.subreddit(any(subreddits))是完全错误的——PRAW(Reddit的Python SDK)要求多个子reddit用加号(+)分隔的字符串来指定,比如"test+bottest"。正确的做法是把你的子reddit列表转成符合要求的格式:
subreddits = ["test", "bottest"] # 把列表转为"test+bottest"格式 subreddits_str = "+".join(subreddits) # 然后传入subreddit方法 r.subreddit(subreddits_str)
错误2:多关键词的判断逻辑错误
any(keywords) in comment.body这个写法逻辑完全不通:any(keywords)会直接返回True(因为你的关键词列表非空),相当于判断True in comment.body,这肯定匹配不到任何内容。
正确的逻辑是遍历每个关键词,检查是否有任意一个出现在评论内容中,建议统一转成小写来避免大小写敏感(比如用户发"Hello"也能匹配到你的"hello"关键词):
# 先把评论内容转小写,避免大小写问题 comment_body_lower = comment.body.lower() # 检查是否有任意一个关键词在评论里 has_keyword = any(keyword.lower() in comment_body_lower for keyword in keywords)
完整修正后的代码示例
import praw import time # 初始化Reddit机器人(替换成你的凭证!) r = praw.Reddit( client_id="你的Client ID", client_secret="你的Client Secret", username="机器人用户名", password="机器人密码", user_agent="自定义用户代理(比如:my-comment-bot/v1.0 by u/你的用户名)" ) # 配置你的关键词和目标子reddit keywords = ["hello", "okay"] subreddits = ["test", "bottest"] subreddits_str = "+".join(subreddits) # 转成PRAW支持的格式 # 存储已回复过的评论ID,避免重复回复 comments_replied_to = set() while True: try: # 遍历多个子reddit的最新100条评论 for comment in r.subreddit(subreddits_str).comments(limit=100): comment_body_lower = comment.body.lower() # 三重判断:未回复过、不是机器人自己发的、包含任意关键词 if (comment.id not in comments_replied_to and comment.author != r.user.me() and any(keyword.lower() in comment_body_lower for keyword in keywords)): # 替换成你想回复的内容 comment.reply("Hey, I spotted your keyword! 😊") print(f"已回复评论ID: {comment.id}") comments_replied_to.add(comment.id) # 避免触发Reddit的速率限制,回复后暂停10秒 time.sleep(10) # 一轮扫描结束后暂停30秒再继续,减少请求频率 time.sleep(30) # 捕获异常并打印,避免机器人崩溃 except Exception as e: print(f"出错了: {str(e)}") time.sleep(60)
额外注意事项
- 一定要替换代码里的机器人凭证(Client ID、Secret等),这些可以在Reddit开发者后台申请
- 加入了延迟和异常处理,避免被Reddit判定为恶意请求而限制账号
- 用集合存储已回复的评论ID,比列表查询速度更快
- 统一转小写匹配关键词,能提升命中率
内容的提问来源于stack exchange,提问作者Matcha
相关产品推荐
相关产品推荐

