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

