如何获取Discord机器人已连接服务器列表?代码失效求助
解决Discord机器人获取服务器列表的问题
嘿,我来帮你排查下代码里的问题,主要有两个关键点导致你的服务器列表无法正常输出:
1. Discord.py版本兼容性问题
在discord.py v1.0及以上版本中,bot.servers这个属性已经被官方移除了,取而代之的是bot.guilds(现在官方统一把“服务器”称为Guild)。你用了废弃的属性,自然无法正确获取到服务器列表。
2. 循环索引逻辑错误
你原来的循环写法for x in range(len(servers)): print(' ' + servers[x-1].name)存在明显问题:
- 当
x从0开始时,x-1会变成-1,这时候取的是列表最后一个元素,导致输出顺序完全混乱 - 如果服务器列表为空,还会直接抛出索引越界的错误
- 正确的做法是直接遍历列表里的每个Guild对象,不需要通过索引来访问
修正后的完整代码
我把获取服务器列表的逻辑整合到on_ready事件里(机器人上线时自动打印),同时新增了一个自定义命令servers,让你可以随时通过指令查看服务器列表:
token = "你的机器人Token" # 替换成你的真实Token prefix = "?" # 命令前缀 import discord from discord.ext import commands bot = commands.Bot(command_prefix=prefix) bot.remove_command("help") @bot.event async def on_ready(): print('Logged in as') print(bot.user.name) print(bot.user.id) print(discord.__version__) print('------') # 打印服务器列表 guilds = bot.guilds print(f"已连接到 {len(guilds)} 个服务器:") for guild in guilds: print(f" - {guild.name} (ID: {guild.id})") @bot.command(pass_context=True) async def ping(ctx): msg = 'Pong {0.author.mention}'.format(ctx.message) await ctx.send(msg) # 注意:新版本discord.py里bot.say已被弃用,改用ctx.send @bot.command(pass_context=True) async def hello(ctx): msg = 'hello... {0.author.mention}'.format(ctx.message) await ctx.send(msg) @bot.command(pass_context=True) async def servers(ctx): # 发送服务器列表到当前频道 guild_list = "\n".join([f"- {g.name}" for g in bot.guilds]) await ctx.send(f"我当前加入的服务器列表:\n{guild_list}") bot.run(token)
额外注意事项
- 确保你安装的是最新稳定版discord.py,可以用
pip install -U discord.py命令更新 - 新版本里
bot.say()已经被弃用,我也帮你把ping和hello命令的写法同步修改了,避免后续报错 - 机器人需要正确加入目标服务器,且你的Token有效,否则无法获取到任何服务器信息
内容的提问来源于stack exchange,提问作者Demotry
相关产品推荐
相关产品推荐

