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

Discord自机器人报错AttributeError: 'NoneType'无roles属性求助

解决discord.py中AttributeError: 'NoneType' object has no attribute 'roles'的问题

首先看你的错误信息,guild是NoneType,说明client.get_guild('GUILD_ID')根本没找到目标服务器,这是最核心的问题。我来一步步帮你修复:

1. 修正服务器ID的类型

client.get_guild()需要传入整数类型的服务器ID,而你现在传的是字符串(带引号的'GUILD_ID')。把引号去掉,换成纯数字的真实服务器ID:

guild = client.get_guild(123456789012345678)  # 替换成你实际的服务器ID,不要加引号

2. 确认你的账号在目标服务器内

因为你用的是自机器人(bot=False),你的个人Discord账号必须已经加入了目标服务器,否则get_guild会返回None。先检查一下你的账号是不是在那个服务器里。

3. 增加异常处理避免程序崩溃

你的代码现在没有处理无效ID、权限不足等异常情况,很容易中途崩溃。可以加一些判断和捕获逻辑:

  • 过滤掉ids.txt里的空行(比如换行导致的空字符串)
  • 捕获格式错误、成员不存在、权限不足等异常,让程序能继续运行

修正后的完整代码

import discord

client = discord.Client()

@client.event
async def on_ready():
    print(f"已登录为 {client.user}")
    
    # 读取ID并过滤空行和无效格式
    with open("ids.txt", "r") as f:
        ids = [id.strip() for id in f.read().split("\n") if id.strip()]

    # 替换成你真实的服务器ID(整数,无引号)
    target_guild_id = 123456789012345678
    guild = client.get_guild(target_guild_id)
    
    # 先检查服务器是否能被找到
    if not guild:
        print(f"找不到ID为{target_guild_id}的服务器,请检查ID是否正确,以及账号是否在该服务器内")
        await client.close()
        return

    # 获取目标角色
    target_role_name = "Customer"
    role = discord.utils.get(guild.roles, name=target_role_name)
    if not role:
        print(f"服务器中找不到名为{target_role_name}的角色")
        await client.close()
        return

    # 批量检查角色并写入文件(用with语句确保文件正确关闭)
    with open("roletrue.txt", "a") as f:
        for id_str in ids:
            try:
                member_id = int(id_str)
                member = await guild.fetch_member(member_id)
                if role in member.roles:
                    f.write(f"{member_id}\n")
                    print(f"Discord ID {member_id} 拥有角色 {role.name},已写入文件")
                else:
                    print(f"Discord ID {member_id} 没有角色 {role.name}")
            except ValueError:
                print(f"无效的ID格式:{id_str},已跳过")
            except discord.NotFound:
                print(f"服务器中找不到ID为{id_str}的成员,已跳过")
            except discord.Forbidden:
                print(f"没有权限获取ID为{id_str}的成员信息,已跳过")

# 替换成你的Discord账号Token
client.run("YOUR_ACCOUNT_TOKEN", bot=False)

额外提醒

虽然你清楚自机器人违反Discord服务条款,但还是要再强调:使用自机器人可能导致你的Discord账号被永久封禁,风险极高,请谨慎操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 10:40:39