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

