如何在 discord.py 中复制嵌入?
Posted
技术标签:
【中文标题】如何在 discord.py 中复制嵌入?【英文标题】:How to copy an embed in discord.py? 【发布时间】:2020-12-26 12:34:49 【问题描述】:我希望机器人获取消息(嵌入)并将其发送到调用命令的通道。 以下代码适用于普通短信:
@bot.command()
async def fetch(ctx):
channel = bot.get_channel(736984092368830468)
msg = await channel.fetch_message(752779298439430164)
await ctx.send(msg.content)
我尝试发送嵌入:
@bot.command()
async def fetch(ctx):
channel = bot.get_channel(736984092368830468)
msg = await channel.fetch_message(752779298439430164)
await ctx.send(msg.embeds.copy())
它发送这个而不是发送嵌入:
如何使机器人复制并发送嵌入?
【问题讨论】:
msg.embeds.copy()
实际上返回一个 Embed 对象(你可以在模块的源代码中看到它)。我还没有尝试过,但似乎ctx.send()
有一个名为embed
的参数。也许你应该试试await ctx.send(embed=msg.embeds.copy())
这不起作用,给出错误 - discord.ext.commands.errors.CommandInvokeError: Command raised an exception: AttributeError: 'list' object has no attribute 'to_dict'
@NicholasObert
嗨@Deadshot,如果我的或任何答案解决了您的问题,请单击复选标记考虑accepting it。这向更广泛的社区表明您已经找到了解决方案,因此如果他们遇到了这个问题,如何解决这个问题。
【参考方案1】:
问题是您试图将 discord.Embed 对象列表作为字符串发送到您的await ctx.send(msg.embeds.copy())
ctx.send()
方法有一个名为 embed
的参数,用于在消息中发送嵌入。
await ctx.send(embed=msg.embeds[0])
应该做的伎俩。这样,您将发送一个实际的 discord.Embed 对象,而不是 discord.Embeds
的列表您应该不需要.copy()
方法
await ctx.send(embed=msg.embeds[0].copy())
虽然你可以使用它
使用索引运算符[0]
的唯一缺点是您只能访问消息中包含的一个嵌入。 discord API 不提供在单个消息中发送多个嵌入的方法。 (见this问题)。
一种解决方法可能是遍历 msg.embeds
列表中的每个嵌入,并为每个嵌入发送一条消息。
for embed in msg.embeds:
await ctx.send(embed=embed)
不幸的是,这会导致机器人发送多条消息,但您并没有真正注意到。
【讨论】:
【参考方案2】:你必须像这样选择第一个嵌入并使用[复制]如果你想在再次发送之前更改它。(https://discordpy.readthedocs.io/en/latest/api.html?highlight=embed#discord.Embed.copy)
@bot.command()
async def fetch(ctx):
channel = bot.get_channel(736984092368830468)
msg = await channel.fetch_message(752779298439430164)
await ctx.send(embed=msg.embeds[0])
【讨论】:
以上是关于如何在 discord.py 中复制嵌入?的主要内容,如果未能解决你的问题,请参考以下文章
如何在嵌入 discord.py 中使用 markdown 语法发送图像