Python Discord Bot:单条消息中按序发送图片与文本的方法
解决Discord Bot一次发送图片在前、文本在后的问题
嘿!我明白你的困扰了——默认情况下用send(content=..., file=...)确实会把文本放在图片上方,分开发送又怕中间被其他消息插进来。别担心,用discord.Embed就能完美解决这个问题,而且是一次发送,不会有顺序混乱的风险。
为什么之前的方法不行?
Discord的消息渲染逻辑是:当你在一次send里同时传content和file时,文本内容会默认显示在附件(图片)的上方,这个顺序是API层面的默认规则,没法直接通过调换参数顺序改变。而分开两次发送的话,因为Discord的消息队列是异步的,确实有可能被其他用户的消息或者机器人的其他指令插在中间,破坏你想要的排版。
正确的解决方案:用Embed控制顺序
我们可以利用Discord的Embed系统,把图片作为Embed的主图,然后把文本放在Embed的描述里。这样消息会先显示图片,再显示文本,而且是一个完整的消息块,不会被拆分。
代码示例:
# 准备要发送的图片文件 report_image = discord.File("playerReport.png") # 准备要发送的文本内容(这里直接用你处理后的m[:len(m)-1]) message_content = m[:len(m)-1] # 创建Embed对象,把文本放在描述里 embed = discord.Embed(description=message_content) # 把图片绑定到Embed上,用attachment://+文件名的方式引用附件 embed.set_image(url=f"attachment://{report_image.filename}") # 一次发送,同时带上文件和Embed await message.channel.send(file=report_image, embed=embed)
额外提示:纠正你之前的错误尝试
你之前分开发送时写了await message.channel.send(file=discord.File(m[:len(m)-1])),这里明显写错了——discord.File()需要传入文件路径,而m[:len(m)-1]是文本内容,应该改成content=m[:len(m)-1]才对。不过当然,我们现在的Embed方案比分开发送更靠谱~
这样发送出来的消息就会完美呈现“图片在前,文本在后”的效果,而且是一个独立的消息,不会被其他消息插在中间。
内容的提问来源于stack exchange,提问作者Eddy Jimenez
相关产品推荐
相关产品推荐

