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

