You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 19:24:03