制作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
相关产品推荐
相关产品推荐

