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

