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

Discord机器人上线触发on_guild_remove事件名称显示None如何修复

问题原因

这个问题是Discord机器人网关同步机制和Intent配置异常导致的:

  • 你没有启用必要的Guilds Intent,导致机器人启动时和Discord网关同步服务器列表信息不全,触发虚假的on_guild_remove事件
  • 机器人启动后没有等待内部缓存完全加载就开始响应事件,此时拿到的Guild对象信息不完整,所以会出现服务器名称为None、ID固定的异常情况
  • 原代码没有做异常校验,无效事件也会被正常处理,还会触发prefixes.json操作的潜在报错
修复步骤

步骤1:启用必要的网关Intent

  1. 打开Discord开发者平台,进入你的机器人应用页面,切换到「Bot」标签页
  2. 向下滚动到Privileged Gateway Intents区域,开启Guilds Intent,如果你的机器人有其他功能需求也可以同步开启Message Content Intent等其他权限
  3. 初始化客户端时声明启用对应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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:15:03