You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何编写discord.py反应角色代码?Discord Bot开发新手求助

嘿,作为刚接触Discord Bot开发的新手,这个角色分配需求其实非常常见,我用discord.py库给你整理一套完整的实现方案,一步步来很容易上手~

准备工作

首先确保你已经安装了discord.py库,如果还没装,在终端里运行:

pip install discord.py

另外,记得去Discord开发者门户给你的机器人开启服务器成员意图消息内容意图,不然机器人没法正确处理反应事件和读取命令。

核心代码实现

下面是完整的功能代码,我会在代码里加注释解释关键部分:

import discord
from discord.ext import commands

# 设置机器人需要的权限意图
intents = discord.Intents.default()
intents.members = True  # 开启成员管理意图,用于给用户添加角色
intents.message_content = True  # 开启消息内容意图,用于读取命令

# 初始化机器人,前缀设为!,你可以改成自己喜欢的前缀
bot = commands.Bot(command_prefix='!', intents=intents)

# 这里替换成你需要的配置:目标消息ID、反应表情、对应角色ID
# 后续可以扩展成多个表情对应多个角色的字典
ROLE_CONFIG = {
    "🎉": 123456789012345678,  # 表情符号: 角色ID
    "🎮": 987654321098765432
}
# 存储用于角色分配的消息ID,后续可以通过命令动态设置
target_message_id = None

@bot.event
async def on_ready():
    print(f'Logged in as {bot.user.name} (ID: {bot.user.id})')
    print('------')

# 发送用于角色分配的消息并添加反应的命令
@bot.command(name='setup_role')
@commands.has_permissions(manage_roles=True)  # 只有有管理角色权限的用户才能用这个命令
async def setup_role_message(ctx):
    global target_message_id
    # 发送提示消息
    msg = await ctx.send('点击下方表情获取对应角色:\n🎉 -> 普通成员\n🎮 -> 游戏爱好者')
    target_message_id = msg.id
    # 给消息添加配置里的所有表情
    for emoji in ROLE_CONFIG.keys():
        await msg.add_reaction(emoji)
    await ctx.send('角色分配消息已设置完成!')

# 处理用户添加反应的事件
@bot.event
async def on_raw_reaction_add(payload):
    # 只处理我们设置的目标消息的反应
    if payload.message_id != target_message_id:
        return
    # 排除机器人自己的反应
    if payload.user_id == bot.user.id:
        return
    
    guild = bot.get_guild(payload.guild_id)
    if not guild:
        return
    
    # 获取对应角色
    role_id = ROLE_CONFIG.get(str(payload.emoji))
    if not role_id:
        return
    role = guild.get_role(role_id)
    if not role:
        return
    
    # 获取用户
    member = guild.get_member(payload.user_id)
    if member:
        await member.add_roles(role)
        # 可选:给用户发私信通知
        try:
            await member.send(f'你已成功获取角色:{role.name}')
        except discord.Forbidden:
            # 用户关闭了私信,忽略即可
            pass

# 处理用户移除反应的事件(可选,如果需要移除角色的话)
@bot.event
async def on_raw_reaction_remove(payload):
    if payload.message_id != target_message_id:
        return
    if payload.user_id == bot.user.id:
        return
    
    guild = bot.get_guild(payload.guild_id)
    if not guild:
        return
    
    role_id = ROLE_CONFIG.get(str(payload.emoji))
    if not role_id:
        return
    role = guild.get_role(role_id)
    if not role:
        return
    
    member = guild.get_member(payload.user_id)
    if member:
        await member.remove_roles(role)
        try:
            await member.send(f'你已移除角色:{role.name}')
        except discord.Forbidden:
            pass

# 替换成你的机器人Token
bot.run('YOUR_BOT_TOKEN_HERE')
关键细节说明
  1. 为什么用on_raw_reaction_add而不是on_reaction_add
    后者依赖机器人的消息缓存,如果机器人重启或者消息不在缓存里,就无法触发事件;而on_raw_reaction_add直接监听Discord的原始事件,不受缓存限制,更可靠。
  2. 权限配置
    你的机器人需要在服务器里拥有管理角色发送消息添加反应的权限,不然无法正常执行命令和添加角色。
  3. 扩展功能
    你可以把ROLE_CONFIG改成更灵活的结构,比如通过命令动态添加表情和角色的对应关系,或者支持多个消息的角色分配。
测试步骤
  1. 把代码里的YOUR_BOT_TOKEN_HERE替换成你在Discord开发者门户获取的机器人Token。
  2. 修改ROLE_CONFIG里的角色ID为你服务器里的实际角色ID。
  3. 运行代码,然后在服务器里用!setup_role命令发送角色分配消息。
  4. 点击消息上的表情,就能看到角色被自动添加啦~

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

火山引擎 最新活动