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

开发Discord Bot遇角色未找到错误,寻求解决方案

问题分析与解决方法

你遇到的AttributeError: 'NoneType' object has no attribute 'id'报错,核心原因是代码里的role变量为None(bot没找到指定ID的角色),同时add_roles的调用也存在参数错误。下面是具体的修复步骤:

1. 修正add_roles的参数错误

你当前的代码里多传了message.author参数,add_roles方法只需要传入要添加的角色即可,不需要重复传成员对象。正确写法:

await message.author.add_roles(role, reason="You said the magic words!", atomic=True)

2. 确保角色能被bot正确获取

  • 核对角色ID:打开Discord开发者模式,右键Baguette_Team角色复制ID,确认代码里的1085983212855115887完全一致,避免手动输入错误。
  • 检查bot权限:确保bot在服务器中拥有「管理角色」和「读取服务器成员」权限,且bot的角色位置要高于Baguette_Team角色(否则bot没有权限给用户添加这个角色)。
  • 过滤DM消息:如果用户在DM里发送触发消息,message.guild会是None,此时get_role必然失败,建议先做判断:
if message.guild is None:
    await message.channel.send("这个功能只能在服务器内使用!")
    return

3. 完善错误处理与命令兼容

在on_message事件里添加角色不存在的判断,同时因为你用的是commands.Bot,需要补充命令处理逻辑避免后续命令失效:

@client.event
async def on_message(message):
    print("message was: " + message.content)
    if message.author == client.user:
        return
    
    # 过滤DM消息
    if message.guild is None:
        await message.channel.send("这个功能只能在服务器内使用!")
        return
    
    if message.content == 'I love baguettes!':
        role = message.guild.get_role(1085983212855115887)
        # 检查角色是否存在
        if role is None:
            await message.channel.send("找不到Baguette_Team角色,请检查角色ID是否正确!")
            return
        await message.author.add_roles(role, reason="You said the magic words!", atomic=True)
        await message.channel.send('So do I! In fact, I have given you the Baguette Team role!')
    
    # 处理其他bot命令(必须保留,否则命令会失效)
    await client.process_commands(message)

4. 确认Discord平台的Intents配置

虽然代码里用了discord.Intents.all(),但要去Discord开发者平台的应用设置里,开启「服务器成员意图」和「消息内容意图」,否则bot无法正常读取消息内容或获取成员信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 14:22:21