如何实现机器人在用户对消息添加反应后自动向该用户发送消息
on_reaction_add 功能修复方案
现有代码问题汇总
- 事件参数定义错误:discord.py 原生
on_reaction_add事件接收两个参数,分别是触发的反应对象reaction、添加反应的用户对象user,你当前定义的单参数message不符合事件要求,无法正确获取触发信息 - 错误手动触发事件:
on_reaction_add是 Discord 事件触发的回调函数,不需要你在on_message中手动调用,手动传入的message参数完全不符合事件入参规范,会直接报错 - emoji 匹配逻辑错误:自定义 emoji 的 ID 需要从
reaction.emoji.id属性获取,不能直接把反应对象和 ID 字符串做对比 - 缺少权限意图配置:要正常监听消息反应事件,需要在代码中开启
reactions和message_content意图,同时在 Discord 开发者后台对应应用的「Bot」设置页打开对应意图开关
修正后代码示例
# 首先需要正确配置意图,实例化 client 的时候就要加 import discord intents = discord.Intents.default() intents.message_content = True intents.reactions = True client = discord.Client(intents=intents) @client.listen() async def on_message(message): """ 检测用户发送的'bhwagon'和'missed wagon'指令,24分钟后发送冷却结束通知 :param message: 用户发送的消息对象 :return: 给用户发送冷却结束的私信 """ if message.content.startswith("bhwagon") or message.content.startswith("missed wagon"): await cool_down_ended(message) # 这里删掉手动调用on_reaction_add的逻辑,这个事件会自动触发 @client.event async def on_reaction_add(reaction, user): """ 检测用户给消息添加的反应,如果是指定表情就给添加反应的用户发私信 :param reaction: 用户添加的反应对象 :param user: 添加反应的用户对象 :return: 无 """ # 排除机器人自己添加的反应,避免触发死循环 if user.bot: return # 判断是否是目标自定义表情,对应你的表情ID 882814250710626405 if hasattr(reaction.emoji, 'id') and reaction.emoji.id == 882814250710626405: await user.send("你想要发送的消息内容")
补充说明
- 如果需要监听机器人启动之前发送的消息的反应,需要把
on_reaction_add替换成on_raw_reaction_add事件,避免因消息不在机器人缓存中导致事件不触发 - 给用户发私信的时候如果用户关闭了陌生人私信权限会报错,建议加异常捕获处理
内容的提问来源于stack exchange,提问作者yet-it-compiles
相关产品推荐
相关产品推荐

