Discord机器人上线触发on_guild_remove事件名称显示None如何修复
问题原因
这个问题是Discord机器人网关同步机制和Intent配置异常导致的:
- 你没有启用必要的Guilds Intent,导致机器人启动时和Discord网关同步服务器列表信息不全,触发虚假的
on_guild_remove事件 - 机器人启动后没有等待内部缓存完全加载就开始响应事件,此时拿到的Guild对象信息不完整,所以会出现服务器名称为
None、ID固定的异常情况 - 原代码没有做异常校验,无效事件也会被正常处理,还会触发prefixes.json操作的潜在报错
修复步骤
步骤1:启用必要的网关Intent
- 打开Discord开发者平台,进入你的机器人应用页面,切换到「Bot」标签页
- 向下滚动到Privileged Gateway Intents区域,开启
Guilds Intent,如果你的机器人有其他功能需求也可以同步开启Message Content Intent等其他权限 - 初始化客户端时声明启用对应Intent,示例代码:
import discord intents = discord.Intents.default() intents.guilds = True # 其他需要的权限可以在这里加,比如intents.message_content = True # 替换你原来的client初始化代码 client = discord.Client(intents=intents) # 如果你用的是commands.Bot,就用下面的写法 # from discord.ext import commands # client = commands.Bot(command_prefix="你的前缀", intents=intents)
步骤2:添加就绪状态判断,过滤虚假事件
添加全局就绪标记,确保机器人完全启动、缓存加载完成后再响应on_guild_remove事件,同时添加参数校验避免处理无效数据,修改后的完整事件代码如下:
import datetime import json # 新增全局就绪标记 client_ready = False @client.event async def on_ready(): global client_ready # 等待客户端所有内部缓存加载完成 await client.wait_until_ready() try: client.loop.create_task(status_task()) print('Hellooo! Detective') timestamp = datetime.datetime.now() embedVar = discord.Embed(title="I am now Online!", description=timestamp.strftime("%d-%m-%Y %H:%M:%S %p"), color=0xe74c3c) channel = client.get_channel(864074870441639936) await channel.send(embed=embedVar) # 标记客户端已就绪 client_ready = True except Exception as ex: print(f"Error found: {ex}") @client.event async def on_guild_remove(guild): # 未就绪直接跳过事件 if not client_ready: return # 校验Guild对象有效,避免处理空数据 if not guild or not guild.id or not guild.name: return embedleave = discord.Embed(title="Left a server", description=f"just left {guild.name}\n{str(len(client.guilds))}", color=0x71368a) embedleave.set_footer(text=f"{guild.id}") channel = client.get_channel(865213199917908016) await channel.send(embed=embedleave) with open('prefixes.json', 'r') as f: prefixes = json.load(f) # 新增存在性判断,避免key不存在报错 guild_id_str = str(guild.id) if guild_id_str in prefixes: prefixes.pop(guild_id_str) with open('prefixes.json','w') as f: json.dump(prefixes, f, indent=4)
步骤3:额外优化
如果修改后仍然有问题,可以先删除本地的prefixes.json文件重新生成,排除旧缓存的无效ID导致的异常。
内容的提问来源于stack exchange,提问作者RainbowGuy
相关产品推荐
相关产品推荐

