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

Discord机器人调用guild.get_role报错:NoneType无get_role属性

问题解决:AttributeError: 'NoneType' object has no attribute 'get_role'

错误原因

你在bot还未完成Discord网关连接、未加载服务器数据时就调用了bot.get_guild(GUILD_ID),此时bot还没成功接入Discord平台,无法获取到目标服务器实例,因此guild变量是None,调用get_role自然会触发属性错误。

修复方案

必须等待bot完成启动(触发on_ready事件)后,再执行获取服务器、角色及成员的逻辑。on_ready事件是bot成功连接到Discord并完成初始化后的回调,此时才能正常访问服务器数据。

修正后的代码:

import discord
from discord.ext import commands

TOKEN    = "你的机器人令牌"
GUILD_ID = 123456789012345678  # 替换为你的服务器ID(整数类型)
ROLE_ID  = 987654321098765432  # 替换为你的角色ID(整数类型)

bot = commands.Bot(command_prefix='+', intents=discord.Intents.all())

@bot.event
async def on_ready():
    print(f"已以 {bot.user} 身份登录")
    # 此时bot已连接,可正常获取服务器
    guild = bot.get_guild(GUILD_ID)
    if not guild:
        print("无法找到目标服务器,请检查GUILD_ID是否正确,且bot已加入该服务器")
        return
    
    admin_role = guild.get_role(ROLE_ID)
    if not admin_role:
        print("无法找到目标角色,请检查ROLE_ID是否正确")
        return
    
    # 获取拥有该角色的所有用户
    role_members = admin_role.members
    print(f"拥有该角色的用户列表:")
    for member in role_members:
        print(f"- {member.name}#{member.discriminator}")

bot.run(TOKEN)

额外注意事项

  • 确保GUILD_ID和ROLE_ID是整数类型,不要用字符串包裹
  • 确认你的机器人已经加入了目标服务器
  • 若获取成员列表为空,需在Discord开发者后台的机器人页面,开启「Server Members Intent」权限(你代码中用了Intents.all(),已经包含该权限,但仍需后台开启)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 23:24:39