使用discord.py开发机器人时如何为自身发送的消息添加反应
问题修复方案
1. 无法给消息添加反应的修复
- 问题原因:discord.py的
add_reaction方法不支持直接传入冒号包裹的表情别名,需要传入Unicode原生表情或者官方Emoji对象 - 修复方法:将你代码中添加反应的两行替换为直接使用Unicode表情:
await dm.add_reaction('✅') await dm.add_reaction('⛔')
注意:必须提前在Discord开发者后台开启Message Content Intent、Guild Reactions Intent权限,否则机器人无法读取消息内容和监听反应事件
2. 点击确认反应后分配角色的实现
你可以使用wait_for方法监听当前这条验证私信的反应事件,过滤掉机器人自身的反应,仅响应指定管理员的操作,拿到结果后给用户分配对应角色,完整修改后代码如下:
@client.command() async def verify(ctx): # 跳过私聊触发命令的情况,避免报错 if ctx.guild is None: return verifier = ctx.author admin = await client.fetch_user(270397954773352469) await ctx.send(f'{verifier.mention} 正在等待验证,验证通过后你将收到私信通知') # 给管理员发验证私信 verify_dm = await admin.send(f'{verifier.mention} 申请进入服务器,是否通过验证?') # 添加指定反应 await verify_dm.add_reaction('✅') await verify_dm.add_reaction('⛔') # 定义反应检查规则:仅监听管理员对这条验证消息的两个指定反应 def check(reaction, user): return user == admin and str(reaction.emoji) in ['✅', '⛔'] and reaction.message.id == verify_dm.id try: # 等待管理员反应,超时时间可自行调整,此处设为1天 reaction, user = await client.wait_for('reaction_add', timeout=86400.0, check=check) except TimeoutError: await admin.send('验证请求已超时') await verifier.send('验证请求超时,请重新输入.verify申请验证') return # 处理反应结果 if str(reaction.emoji) == '✅': # 替换为你服务器内验证通过角色的数字ID verified_role = ctx.guild.get_role(1234567890) await verifier.add_roles(verified_role) await verifier.send('你已通过服务器验证,现在可以正常访问服务器内容') await admin.send(f'已通过{verifier.mention}的验证申请') else: await verifier.send('你的验证申请被拒绝') await admin.send(f'已拒绝{verifier.mention}的验证申请')
- 额外注意事项:
- 确保机器人在服务器内拥有
管理角色权限,且其自身角色排序高于你要分配的验证通过角色,否则会出现权限不足无法分配角色的问题 - 必须开启
Server Members Intent权限,否则无法正常获取成员对象执行添加角色操作
- 确保机器人在服务器内拥有
内容的提问来源于stack exchange,提问作者JJ Malovich
相关产品推荐
相关产品推荐

