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

