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

如何在Discord中用Embed拆分长消息?报错求助

问题解决:Discord机器人Embed长消息拆分报错修复

错误原因

报错argument of type 'Embed' is not iterable的核心原因是:你将response变量先赋值为字符串,随后又覆盖成了discord.Embed对象,但后续代码却试图对这个Embed对象执行字符串操作(比如len(response)、"```" in response、response.split("```")),这些操作仅适用于字符串,对Embed对象无效,因此抛出类型错误。

修复方案

核心思路是先保留完整的回复文本内容,对文本进行拆分处理,再将每个拆分后的片段放入Embed中发送,而非直接对Embed对象做字符串操作。以下是修正后的完整代码:

async def send_message(message, user_message):
    await message.response.defer(ephemeral=isPrivate)
    try:
        # 构建前缀文本
        prefix_text = f'> **{user_message}** - <@{message.user.id}>\n\n'
        # 获取完整的回复内容文本
        reply_content = await responses.handle_response(user_message)
        # 拼接完整的消息文本
        full_text = f"{prefix_text}{reply_content}"
        
        # 定义创建Embed的工具函数,避免重复代码
        def create_embed(content):
            embed = discord.Embed(description=content, color=0xFFFFFF)
            embed.set_thumbnail(url="https://pbs.twimg.com/media/Fq7BguPagAIzMtE?format=png&name=small")
            return embed
        
        # 检查文本长度是否超过限制
        if len(full_text) > 1900:
            if "```" in full_text:
                # 按代码块分隔符拆分文本
                parts = full_text.split("```")
                # 发送代码块之前的内容
                if parts[0].strip():
                    await message.followup.send(embed=create_embed(parts[0]))
                
                # 处理代码块内容
                code_block = parts[1]
                code_lines = code_block.split("\n")
                formatted_code = ""
                for line in code_lines:
                    # 拆分超长单行代码
                    while len(line) > 1900:
                        formatted_code += line[:1900] + "\n"
                        line = line[1900:]
                    formatted_code += line + "\n"
                
                # 拆分超长代码块
                if len(formatted_code) > 1900:
                    code_chunks = [formatted_code[i:i+1900] for i in range(0, len(formatted_code), 1900)]
                    for chunk in code_chunks:
                        # 给代码块包裹```后放入Embed
                        await message.followup.send(embed=create_embed(f"```\n{chunk}\n```"))
                else:
                    await message.followup.send(embed=create_embed(f"```\n{formatted_code}\n```"))
                
                # 发送代码块之后的剩余内容
                if len(parts) >= 3 and parts[2].strip():
                    await message.followup.send(embed=create_embed(parts[2]))
            else:
                # 普通文本拆分
                text_chunks = [full_text[i:i+1900] for i in range(0, len(full_text), 1900)]
                for chunk in text_chunks:
                    await message.followup.send(embed=create_embed(chunk))
        else:
            # 长度符合要求,直接发送完整Embed
            await message.followup.send(embed=create_embed(full_text))
    except Exception as e:
        await message.followup.send("> **Error: Something went wrong, please try again later!**")
        logger.exception(f"Error while sending message: {e}")

关键修正点

  • 分离了文本内容和Embed对象:始终对字符串类型的文本进行长度检查、拆分操作,Embed仅用于最终发送时的格式封装。
  • 新增工具函数create_embed:避免重复编写创建Embed的代码,减少冗余。
  • 修正了代码块处理逻辑:发送代码块时,将拆分后的文本包裹\```后再放入Embed的description中,而非错误地拼接Embed对象和字符串。
  • 修复了无效的比较语句:原代码中的formatted_code_block == formatcodeblock是比较运算符,改为正确的赋值逻辑(直接使用文本创建Embed)。
  • 增加了空内容判断:避免发送空的Embed消息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 02:50:19