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

如何获取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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:37:34