如何使用discord.py获取用户发送的Embed中的图片URL
问题根因
Discord的消息结构会按资源来源做拆分存储:
- 用户本地上传的图片、文件,会被归类到
message.attachments属性列表中,这是原有代码能识别普通上传图的原因 - 链接自动预览、第三方分享、用户手动发送的Embed卡片,独立存储在
message.embeds属性列表中,和附件列表完全不互通,原有逻辑不会触碰到Embed内的内容,自然取不到内嵌图的URL。
Embed内图片的存储规则
Discord的Embed对象中,图片可能出现在两个高频使用的位置:
- 卡片主体配图:对应属性为
embed.image.url - 卡片缩略图:对应属性为
embed.thumbnail.url
少数自定义Embed会在作者栏、页脚栏放置小图标,如果有抓取需求,可以对应读取embed.author.icon.url、embed.footer.icon.url属性,日常场景下读取前两个位置已经可以覆盖绝大多数内嵌图的情况。
可直接复用的实现代码
@bot.event async def on_message(message): if message.channel.id == 787662710787145760: # 遍历获取所有普通上传附件的URL for attach in message.attachments: print(f"普通上传图片:{attach.url}") # 遍历获取所有Embed中的图片URL for embed in message.embeds: # 提取Embed主体配图 if embed.image.url: print(f"Embed主体配图:{embed.image.url}") # 提取Embed缩略图 if embed.thumbnail.url: print(f"Embed缩略图:{embed.thumbnail.url}") # 必须调用该方法,否则机器人的指令系统会失效 await bot.process_commands(message)
实现注意点
- discord.py的Embed相关图片属性如果没有对应内容,会直接返回
None,不会抛出索引越界错误,不需要额外写try/except捕捉异常,逻辑稳定性比原代码的单索引取值、异常兜底的写法更好 - 无论是Discord自动生成的链接预览Embed,还是用户通过webhook、机器人接口手动发送的自定义Embed,都会统一进入
message.embeds列表,不需要做额外的类型区分 - 被Embed引用的图片不会同步出现在
message.attachments列表中,必须从Embed对象内部读取对应URL,跨属性取值永远拿不到结果
内容的提问来源于stack exchange,提问作者Trojan
相关产品推荐
相关产品推荐

