如何用Python和telebot实现Telegram机器人提取链接预览文本
解决Telegram机器人提取链接预览文本的问题
核心说明
Telegram Bot API不会主动返回链接预览的文本内容——因为预览是Telegram服务器生成的,不会把提取到的文本传递给机器人。要实现需求,需要自己对用户发送的URL进行网页抓取和内容解析。
具体实现步骤
1. 从消息中提取URL
先用telebot捕获用户消息,通过正则表达式从message.text里匹配出URL:
import re import telebot bot = telebot.TeleBot("你的机器人Token") def extract_urls(text): # 匹配http/https开头的链接 url_pattern = re.compile(r'https?://\S+') return url_pattern.findall(text) @bot.message_handler(func=lambda message: True) def handle_message(message): urls = extract_urls(message.text) if not urls: bot.reply_to(message, "请发送包含URL的消息") return # 优先处理第一个URL(多URL场景可循环处理) target_url = urls[0] # 后续步骤:抓取网页内容
2. 抓取网页并提取预览文本
使用requests获取网页内容,再用BeautifulSoup解析HTML,提取Telegram预览会展示的标题、描述等核心文本:
import requests from bs4 import BeautifulSoup def get_preview_text(url): try: # 设置请求头模拟浏览器,避免被反爬拦截 headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36" } response = requests.get(url, headers=headers, timeout=10) response.raise_for_status() # 捕获HTTP请求错误 soup = BeautifulSoup(response.text, 'html.parser') # 提取页面标题 title = soup.title.string.strip() if soup.title else "无标题" # 提取页面描述(对应meta标签的description字段) description = "" meta_desc = soup.find('meta', attrs={'name': 'description'}) if meta_desc and meta_desc.get('content'): description = meta_desc['content'].strip() # 组合成预览文本 return f"标题: {title}\n描述: {description}" except Exception as e: return f"无法获取预览内容: {str(e)}"
3. 整合机器人逻辑
将上述功能整合到消息处理流程中:
@bot.message_handler(func=lambda message: True) def handle_message(message): urls = extract_urls(message.text) if not urls: bot.reply_to(message, "请发送包含URL的消息") return target_url = urls[0] preview_text = get_preview_text(target_url) bot.reply_to(message, preview_text) # 启动机器人 bot.polling()
注意事项
- 先安装依赖包:
pip install pytelegrambotapi requests beautifulsoup4 - 部分网站有反爬机制,若遇到403/404错误,可尝试更换
User-Agent或添加代理 - 务必处理超时和异常,避免单个请求失败导致机器人崩溃
内容的提问来源于stack exchange,提问作者Валентин Резаков
相关产品推荐
相关产品推荐

