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
相关产品推荐
相关产品推荐

