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

如何让Discord机器人仅退出指定服务器?现有代码存在随机退服问题

解决Discord机器人随机退出服务器的问题

看起来你遇到的问题核心是初始化时机错误,再加上可能用了过时的Discord.py API方法,导致机器人无法正确识别要保留的服务器,进而出现随机退出的情况。我来帮你一步步解决:

问题根源分析

  • 过早调用服务器获取方法:你在on_ready事件触发前就调用了client.get_server('server id'),这时候Discord客户端还没完成初始化,还没加载机器人所在的服务器列表,所以my_server的值是None。当on_ready里的循环判断server != my_server时,所有服务器都会满足这个条件,机器人就会尝试退出所有服务器——但Discord的API有请求频率限制,所以每次运行只能成功退出部分服务器,看起来就是"随机退出2个"。
  • 过时的API方法:如果你用的是Discord.py v1.0及以上版本,get_server、client.servers、leave_server这些方法都已经被弃用,对应替换成get_guild、client.guilds、leave_guild。

修正后的代码

下面是适配新版本且逻辑正确的代码:

import discord
from discord.ext import commands

# 用commands.Bot比直接用Client更灵活,也兼容原有逻辑
client = commands.Bot(command_prefix="!")  # 前缀可自定义,仅作示例
TARGET_GUILD_ID = 451765543236566556  # 你要保留的服务器ID

@client.event
async def on_ready():
    print(f"Logged in as {client.user}")
    # 遍历机器人所在的所有服务器
    for guild in client.guilds:
        if guild.id != TARGET_GUILD_ID:
            print(f"Leaving guild: {guild.name}")
            await client.leave_guild(guild)

@client.event
async def on_guild_join(guild):
    if guild.id != TARGET_GUILD_ID:
        print(f"Auto-leaving new guild: {guild.name}")
        await client.leave_guild(guild)

# 替换成你的机器人Token
client.run("YOUR_BOT_TOKEN_HERE")

关键改进点

  • 把服务器判断逻辑放到on_ready内:确保客户端已经完全加载所有服务器数据后,再执行退出操作。
  • 直接用ID判断:相比先获取服务器对象,直接对比ID更可靠,避免对象获取失败的问题。
  • 使用最新API方法:适配Discord.py新版本,避免因方法弃用导致的异常。
  • 增加打印日志:方便你查看机器人正在退出哪些服务器,排查问题更直观。

额外注意事项

  • 确保机器人在目标服务器里有足够权限,且你拥有操作机器人退出服务器的权限。
  • 如果你还在使用旧版Discord.py(v0.16.x),可以把代码里的guild改回server,client.guilds改回client.servers,leave_guild改回leave_server,但还是建议升级到最新版本,旧版本已不再维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:58:08