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

如何在discord.py中为用户赋予角色?反应触发角色功能不生效如何解决?

代码问题汇总

  • 事件参数错误:on_reaction_add 是discord.py内置事件,原生仅接收reaction、user两个参数,不存在ctx参数,你额外添加的ctx会导致参数匹配错误,事件无法触发
  • 缩进与逻辑顺序错误:通道不匹配的return语句写在了表情判断代码的外层,且判断emoji的代码缩进层级错误,永远不会被执行
  • 通道判断逻辑错误:bot.get_channel()返回的是频道对象,你将其和reaction.message.channel.name字符串直接对比,结果永远不相等,会直接触发return
  • 缺少赋值角色的核心逻辑:仅完成了角色查询/创建步骤,没有调用给用户添加角色的方法
  • 未过滤机器人自身触发的事件:机器人自己加反应的时候也会触发该事件,会产生无效执行

修正后可运行代码

import discord
from discord.ext import commands

# 机器人权限配置,必须开启members、message_content、reactions权限
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
intents.reactions = True

bot = commands.Bot(command_prefix='!', intents=intents)

@bot.command(name='rolecreate', help='creates all the default roles')
async def rolecreate(ctx):
    text = "React with :heart: to get the He/Him role!"
    moji1 = await ctx.send(text)
    reaction = '❤️'
    await moji1.add_reaction(reaction)

@bot.event
async def on_raw_reaction_add(payload):
    # 过滤机器人自身的反应
    if payload.user_id == bot.user.id:
        return
    # 匹配指定频道ID
    target_channel_id = 881380132789583892
    if payload.channel_id != target_channel_id:
        return
    # 匹配指定表情
    if payload.emoji.name == "❤️":
        guild = bot.get_guild(payload.guild_id)
        he_him = discord.utils.get(guild.roles, name="He/Him")
        # 角色不存在则先创建
        if not he_him:
            he_him = await guild.create_role(name="He/Him")
        # 获取触发事件的用户
        member = guild.get_member(payload.user_id)
        # 给用户添加角色
        await member.add_roles(he_him)

# 替换为你的机器人Token即可运行
bot.run("你的机器人Token")

额外注意事项

  • 必须在Discord开发者后台的机器人设置页开启Server Members Intent、Message Content Intent权限,否则事件无法触发
  • 机器人的角色排序必须高于你要分配的角色,否则没有权限给用户加角色

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 16:39:03