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

discord.py如何拆分多codeblocks消息适配2000字符发送限制

实现方法

核心逻辑是先计算单个代码块可承载的有效内容长度,逐行拼接用户名时做长度判断,超限就拆分块,保证每一条消息总长度不超Discord的2000字符限制。

  • Discord代码块格式为前后各3个反引号包裹内容,固定占用6个字符,考虑到字符计数偏差预留4字符安全余量,单块内可放的用户名拼接内容最大长度为1990字符。
  • 遍历用户名列表,每个用户名单独占一行,累加内容长度,若加入下一个用户名后超出单块内容上限,就将当前累计内容包裹为代码块存入待发送队列,重置累加器继续拼接剩余内容。
  • 遍历完成后将最后一段剩余内容包裹为代码块,逐块发送即可得到多段代码块展示名单的效果。
可直接运行的参考代码
def generate_discord_user_blocks(usernames: list[str], max_single_msg_length: int = 2000) -> list[str]:
    # 代码块前后包裹符```占6字符,预留4字符安全冗余
    wrapper_length = 6
    safe_redundancy = 4
    max_content_length = max_single_msg_length - wrapper_length - safe_redundancy

    message_blocks = []
    current_block_content = ""

    for username in usernames:
        line = f"{username}\n"
        # 累加当前行后超限,先封存现有内容为独立代码块
        if len(current_block_content) + len(line) > max_content_length:
            message_blocks.append(f"```\n{current_block_content}```")
            current_block_content = ""
        current_block_content += line

    # 追加最后一段未封存的内容
    if current_block_content:
        message_blocks.append(f"```\n{current_block_content}```")

    return message_blocks


# 调用示例
if __name__ == "__main__":
    # 替换为实际的用户名列表
    username_list = [f"test_user_{i}" for i in range(500)]
    to_send_list = generate_discord_user_blocks(username_list)
    
    # 遍历列表逐条发送即可,Discord.py类框架发送逻辑参考:await channel.send(block)
    for block in to_send_list:
        # 此处替换为实际发送逻辑
        print(f"待发送消息长度:{len(block)},内容预览:\n{block}\n")
调整说明
  • 如果需要给代码块指定高亮类型,比如开头用```txt标记纯文本,需要把标记字符+对应换行的长度算入包裹占用长度,对应调小max_content_length的数值即可。
  • 如果实际发送时仍触发超长报错,可以适当调大safe_redundancy的数值,预留更多安全空间。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 10:33:22