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

discord.py如何获取角色并添加给用户,触发400 Bad Request报错怎么解决

错误原因分析
  • payload.member 取值逻辑错误:在公会内触发的反应事件中,payload.member 本身就是已构造好的 discord.Member 对象,不需要再调用bot.fetch_user获取。而bot.fetch_user要求传入的是数字类型的用户ID(雪花ID),你直接传入Member对象才会触发「不是合法雪花ID」的报错。
  • API调用规则错误:discord.utils.get 是同步工具方法,不需要加await;另外discord.py v1.0以上版本已经废弃server属性,统一改为guild。
  • 缺失核心逻辑:你当前代码只获取了角色,没有执行给用户分配角色的调用,即使前面修复也不会完成加角色的需求。
修正后的完整代码
@bot.event
async def on_raw_reaction_add(payload):
    # 监听的目标频道ID
    target_channel_id = 888832144607166505
    # 非目标频道的事件直接跳过
    if payload.channel_id != target_channel_id:
        return
    # 直接取payload自带的Member对象,无需额外请求用户信息
    reactor = payload.member
    # 排除机器人自己触发的反应
    if reactor.bot:
        return
    print('Reaction added.', reactor)
    # 从公会角色列表匹配Member角色,不需要加await
    role = discord.utils.get(reactor.guild.roles, name="Member")
    print(role)
    # 角色存在的情况下给用户分配角色
    if role:
        await reactor.add_roles(role)
额外注意事项
  • 要确保机器人的自身角色权限等级高于你要分配的Member角色,不然会触发权限不足报错
  • 要给机器人开启「管理角色」的权限,否则无法执行角色分配操作
  • 要开启公会成员相关的网关意图,代码初始化时需要做如下配置:
intents = discord.Intents.default()
intents.members = True
intents.message_content = True
# 用你实际的初始化方式替换即可,核心是传入配置好的intents
bot = commands.Bot(command_prefix="!", intents=intents)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 08:27:05