如何使用discord.py让机器人给自己的消息添加反应实现身份验证功能
实现思路
整个功能分为三个核心逻辑模块:
- 监听用户触发的验证申请命令,收集申请人信息后向指定管理员发送带反应的通知私信
- 监听管理员对通知私信的反应事件,过滤非目标操作避免误触发
- 根据管理员的反应操作,执行分配验证角色/发送拒绝通知的对应逻辑
前置配置
首先需要在Discord开发者后台的Bot设置页开启以下三个权限开关,否则代码会报错:
- Server Members Intent
- Message Content Intent
- Reactions Intent
同时需要提前准备好几个固定ID替换代码中的占位符:
- 接收验证通知的管理员用户ID
- 服务器内「已验证」身份组的ID
- 目标服务器的ID
- 你的机器人Token
完整代码示例
以下代码基于discord.py 2.x版本编写:
import discord from discord.ext import commands # 初始化机器人配置 intents = discord.Intents.default() intents.members = True intents.message_content = True intents.reactions = True bot = commands.Bot(command_prefix='!', intents=intents) # 自定义配置项,替换为你自己的ID ADMIN_USER_ID = 1234567890 # 接收验证通知的管理员ID VERIFIED_ROLE_ID = 9876543210 # 已验证身份组ID TARGET_GUILD_ID = 112233445566 # 目标服务器ID # 验证申请命令 @bot.command(name="申请验证") async def submit_verify(ctx): # 禁止在私信触发命令 if ctx.guild is None: await ctx.send("请在目标服务器内发送验证申请") return # 检查是否已经验证 target_guild = bot.get_guild(TARGET_GUILD_ID) verified_role = target_guild.get_role(VERIFIED_ROLE_ID) if verified_role in ctx.author.roles: await ctx.send("你已完成验证,无需重复申请") return # 向管理员发送验证通知 admin = await bot.fetch_user(ADMIN_USER_ID) notify_msg = await admin.send( f"新验证申请:\n" f"申请人昵称:{ctx.author.display_name}\n" f"申请人账号:{ctx.author.name}#{ctx.author.discriminator}\n" f"申请人ID:{ctx.author.id}" ) # 自动添加反应 await notify_msg.add_reaction("✅") await notify_msg.add_reaction("❌") # 给申请人回执 await ctx.send("验证申请已提交,等待管理员审核") # 监听反应事件处理审核 @bot.event async def on_reaction_add(reaction, user): # 过滤机器人自己的反应、非管理员的反应、非验证通知的消息 if user.bot or user.id != ADMIN_USER_ID or reaction.message.author.id != bot.user.id: return if "新验证申请" not in reaction.message.content: return # 提取申请人ID for line in reaction.message.content.split("\n"): if line.startswith("申请人ID:"): applicant_id = int(line.replace("申请人ID:", "")) break target_guild = bot.get_guild(TARGET_GUILD_ID) applicant = target_guild.get_member(applicant_id) if not applicant: await reaction.message.channel.send("未找到该申请人,可能已退出服务器") await reaction.message.clear_reactions() return verified_role = target_guild.get_role(VERIFIED_ROLE_ID) # 处理同意/拒绝逻辑 if str(reaction.emoji) == "✅": await applicant.add_roles(verified_role) await reaction.message.channel.send(f"已同意【{applicant.display_name}】的验证申请,已分配验证角色") # 尝试给申请人发通知,没开私信会失败,加异常捕获 try: await applicant.send("你的验证申请已通过,已获得已验证身份组") except: pass elif str(reaction.emoji) == "❌": await reaction.message.channel.send(f"已拒绝【{applicant.display_name}】的验证申请") try: await applicant.send("你的验证申请未通过") except: pass # 清除反应避免重复触发 await reaction.message.clear_reactions() # 启动机器人 bot.run("你的机器人Token")
注意事项
- 请确保机器人在服务器中的角色排序高于「已验证」身份组,否则会因为权限不足无法分配角色
- 机器人需要拥有「管理角色」「发送消息」「添加反应」三个基础权限
- 如果需要处理大量验证申请,建议用临时字典或数据库存储通知消息ID和申请人的对应关系,比从消息文本提取ID更稳定
内容的提问来源于stack exchange,提问作者JJ Malovich
相关产品推荐
相关产品推荐

