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

制作Discord反应角色分配机器人时遇到无法自行解决的问题求助

Discord反应分配身份组机器人代码修复方案

现有代码存在的问题

  • 频道ID传参为字符串格式,get_channel方法仅接收整数类型ID,会返回空值触发报错
  • 使用了discord.py v0.16.x的废弃API,包括client.send_message、client.add_reaction、client.add_roles、user.server,在v1.x及以上版本中已全部移除
  • 未排除机器人自身触发的反应事件,会触发无效逻辑
  • on_reaction_add仅对机器人启动后缓存的消息生效,重启后之前发送的验证消息的反应不会触发分配逻辑

修复后可用代码

import discord
from discord.ext import commands

# 配置参数
VERIFY_CHANNEL_ID = 904620745462804520
VERIFY_ROLE_NAME = "Verified"
# 如果你已经发送过验证消息,直接填消息ID即可,不需要重复发
VERIFY_MSG_ID = None

# 开启必要意图
intents = discord.Intents.default()
intents.members = True
intents.message_content = True

client = commands.Bot(command_prefix="!", intents=intents)

@client.event
async def on_ready():
    print(f"登录成功:{client.user}")
    verify_channel = client.get_channel(VERIFY_CHANNEL_ID)
    global VERIFY_MSG_ID
    # 没有指定已有消息ID则自动发送验证消息
    if not VERIFY_MSG_ID:
        verify_msg = await verify_channel.send("React to get Verified!")
        VERIFY_MSG_ID = verify_msg.id
        await verify_msg.add_reaction("✅")

@client.event
async def on_raw_reaction_add(payload):
    # 过滤机器人自身的反应
    if payload.user_id == client.user.id:
        return
    # 匹配对应频道、消息、表情
    if payload.channel_id != VERIFY_CHANNEL_ID or payload.message_id != VERIFY_MSG_ID:
        return
    if str(payload.emoji) == "✅":
        guild = client.get_guild(payload.guild_id)
        target_role = discord.utils.get(guild.roles, name=VERIFY_ROLE_NAME)
        target_user = await guild.fetch_member(payload.user_id)
        await target_user.add_roles(target_role)

# 替换为你的机器人Token运行
client.run("YOUR_BOT_TOKEN")

部署注意事项

  • 需要先进入Discord开发者平台的机器人管理页,在Privileged Gateway Intents板块开启Server Members Intent和Message Content Intent权限,否则无法正常拉取成员信息
  • 机器人在服务器中的身份组排序必须高于Verified身份组,且拥有管理角色权限,否则会提示无权限分配身份组

内容的提问来源于stack exchange,提问作者Rainygan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 10:24:02