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

如何让Python编写的Discord bot等待嵌入URL内容完成解析后再处理?

问题原因

Discord 的链接嵌入是异步解析的,你触发 on_message 事件时,服务端还没完成 Twitter 链接的元数据抓取和嵌入生成,所以此时 message.embeds 为空。第二次发送相同链接时,Discord 已经缓存了该链接的嵌入内容,消息下发时就直接携带了嵌入,所以可以正常读取。

推荐解决方案:监听 on_message_edit 事件

Discord 完成嵌入解析后,会给对应消息触发一次编辑事件,直接在这个事件中处理嵌入逻辑即可,性能开销最低也最稳定:

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    # 可在此处先判断消息是否含Twitter链接,做标记过滤无关内容

@client.event
async def on_message_edit(before, after):
    if after.author == client.user:
        return
    # 仅处理嵌入从无到有的变更,避免重复执行
    if len(before.embeds) == 0 and len(after.embeds) > 0:
        # 可在此处增加校验,确认嵌入来源为Twitter链接
        # 你的图片提取、发布逻辑写在这里
        pass

可选方案:在 on_message 中等待嵌入生成

如果需要在同一个消息触发流程中完成处理,可以用 wait_for 等待该消息的编辑事件,加超时避免无限等待:

@client.event
async def on_message(message):
    if message.author == client.user:
        return
    
    # 过滤非Twitter链接的消息
    if "twitter.com" not in message.content and "x.com" not in message.content:
        return

    # 缓存过的链接会直接携带嵌入,直接处理即可
    if len(message.embeds) > 0:
        # 执行你的逻辑
        pass
    else:
        # 最多等待5秒,等嵌入解析完成的编辑事件
        try:
            def check(before, after):
                return after.id == message.id and len(after.embeds) > 0
            _, after = await client.wait_for('message_edit', timeout=5, check=check)
            # 用after对象中的embeds执行后续逻辑
        except TimeoutError:
            # 超时未获取到嵌入,可按解析失败处理
            pass

提示:两种方案都建议提前校验消息内的链接域名,避免无关内容触发处理逻辑,减少资源消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 12:54:05