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

如何在Telegram机器人脚本中检测用户发送带预览URL的状态

检测Telegram消息中URL是否开启预览的可行方法

嘿,这个需求其实Telegram Bot API已经提供了直接的判断方式,不用自己瞎琢磨~结合你已经在做的URL实体识别,给你两种靠谱的实现思路:

方法1:直接利用消息的has_web_page_preview属性

每个消息对象里都有一个布尔类型的has_web_page_preview字段:

  • 当消息中存在开启了预览的URL时,这个值为True
  • 如果消息里的URL都没开预览,或者根本没有URL,值为False

搭配你已经在做的URL实体识别,就能精准判断:当你识别到消息里有URL实体,同时has_web_page_preview为True,就说明用户发送的URL开启了预览。

方法2:通过web_page字段匹配具体URL(多URL场景适用)

如果消息里有多个URL,你想知道具体哪一个开启了预览,可以用消息的web_page字段。这个字段是一个WebPage对象,里面包含了Telegram生成预览的URL、标题、缩略图等信息。

你可以把识别到的每个URL实体,和web_page.url做匹配——匹配上的那个,就是开启了预览的URL。

代码示例(以python-telegram-bot库为例)

from telegram import Update
from telegram.ext import CallbackContext

def process_group_message(update: Update, context: CallbackContext):
    msg = update.effective_message
    # 先提取消息中的所有URL实体
    url_entities = [ent for ent in msg.entities if ent.type == "url"]
    
    if not url_entities:
        return
    
    # 方法1:判断整体是否有预览
    if msg.has_web_page_preview:
        print("当前消息里有URL开启了预览功能")
    else:
        print("当前消息里的URL都没开预览")
    
    # 方法2:定位具体哪个URL开了预览
    if msg.web_page:
        preview_target_url = msg.web_page.url
        for ent in url_entities:
            extracted_url = msg.text[ent.offset : ent.offset + ent.length]
            if extracted_url == preview_target_url:
                print(f"URL {extracted_url} 开启了预览")
            else:
                print(f"URL {extracted_url} 未开启预览")

注意事项

  • 不是所有URL都能生成预览:如果目标网站禁用了Telegram的爬虫(比如设置了X-Robots-Tag),即使用户开了预览开关,web_page也会为空,这种情况要做好兼容。
  • 转发消息的预览状态:转发的消息会继承原消息的预览设置,has_web_page_preview会直接沿用原消息的值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:34:32