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

discord.py机器人发送随机链接后无法读取自身消息中embed的问题求助

解决discord.py机器人无法读取自身发送消息中Embed的问题

嘿,这个问题我之前也碰到过!原因其实挺简单的——Discord解析链接生成Embed是异步后台处理的,机器人刚发送完消息时,返回的本地消息对象里还没带上解析好的Embed,得等Discord那边处理完才行;而你手动发送时,是等Embed加载出来后再触发机器人读取,所以能正常拿到数据。

下面给你具体的解决方案和代码示例:

核心思路

不要直接用channel.send()返回的消息对象读取Embed,而是等待一小段时间让Discord完成解析,然后重新通过API获取这条消息,此时就能拿到完整的Embed数据了。

代码修改示例

假设你之前的代码是这样的(无法读取Embed):

async def send_random_link(ctx, channel_id):
    target_channel = bot.get_channel(channel_id)
    random_link = generate_your_link()  # 你的随机链接生成函数
    sent_msg = await target_channel.send(random_link)
    # 这里打印会得到空列表 []
    print("当前消息的Embed列表:", sent_msg.embeds)

修改成这样就能正常读取了:

import asyncio

async def send_random_link(ctx, channel_id):
    target_channel = bot.get_channel(channel_id)
    random_link = generate_your_link()
    sent_msg = await target_channel.send(random_link)
    
    # 给Discord一点时间解析Embed,1秒足够大多数情况,按需调整
    await asyncio.sleep(1)
    
    # 重新从Discord API获取这条消息
    updated_msg = await target_channel.fetch_message(sent_msg.id)
    
    # 现在就能读取到Embed了
    if updated_msg.embeds:
        first_embed = updated_msg.embeds[0]
        await ctx.send(f"成功读取到Embed标题:{first_embed.title}")
        # 你也可以在这里处理Embed的其他内容,比如描述、字段等
    else:
        await ctx.send("没读取到Embed,可能需要延长等待时间或者检查链接有效性哦")

额外注意事项

  • 如果你的链接对应的网站响应较慢,Discord解析Embed的时间会更长,可以把asyncio.sleep(1)改成sleep(2)甚至更久。
  • 确保你的链接确实符合Discord的Embed解析规则(既然手动发送能显示,这点应该没问题),比如不是Discord屏蔽的网站,且目标页面有正确的OG标签或其他支持Embed的元数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 20:02:36