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

Python开发Discord机器人for循环发送服务器列表卡顿bug如何解决

问题原因

你遇到的停顿是Discord API的速率限制导致的:Discord对同一频道内的消息发送默认限制为每5秒最多5条,你原有代码循环调用await ctx.send()逐条发送服务器名称,触发限流后discord.py会自动等待冷却时间,就会出现每发5条停2-3秒的情况。

解决方案

最优方案是将所有服务器名称汇总后批量发送,大幅减少API请求次数,完全规避频繁请求触发的限流:

import discord
from discord.ext import commands

bot = commands.Bot(command_prefix = ";", intents=discord.Intents.all(),help_command=None,case_insensitive=True)

@bot.command()
async def listguilds(ctx):
    servers = bot.guilds
    # 拼接所有服务器名称为列表格式
    guild_lines = [f"- {guild.name}" for guild in servers]
    full_content = "\n".join(guild_lines)
    # 适配Discord单条消息2000字符上限,预留开头说明的字符空间
    if len(full_content) < 1950:
        await ctx.send(f"机器人已加入的服务器列表:\n{full_content}")
        return
    # 内容超限时分块发送
    current_block = "机器人已加入的服务器列表:\n"
    for line in guild_lines:
        # +1是换行符的长度
        if len(current_block) + len(line) + 1 > 2000:
            await ctx.send(current_block)
            current_block = line + "\n"
        else:
            current_block += line + "\n"
    # 发送最后剩余的内容
    if current_block:
        await ctx.send(current_block)

bot.run(TOKEN)
额外优化建议
  • 无需使用discord.Intents.all(),仅开启guilds权限即可满足获取服务器列表的需求,降低权限泄露风险:
    intents = discord.Intents.default()
    intents.guilds = True
    bot = commands.Bot(command_prefix = ";", intents=intents,help_command=None,case_insensitive=True)
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 04:54:04