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

