如何使用python-telegram-bot(v20+)开发可加入网络安全类Telegram群组并采集指定内容的机器人
如何使用python-telegram-bot(v20+)开发可加入网络安全类Telegram群组并采集指定内容的机器人
嘿,我来帮你一步步搞定这个需求!基于*python-telegram-bot v20+*的异步框架,咱们可以分模块实现,既清晰又容易调试。
一、前期准备
首先得把基础工具备齐:
- 安装指定版本的库:
pip install python-telegram-bot==20.7(v20+的版本都可以,指定小版本避免兼容性问题) - 去Telegram的BotFather那里创建机器人,拿到你的API Token(这个是机器人的身份凭证,一定要保管好)
- 把机器人拉进你要监控的网络安全群组,记得给它开启「读取消息」的权限(公开群组拉进去就行,私密群组需要管理员手动添加)
二、实现消息监控与内容检测
v20+用的是异步Application架构,咱们先搭好基础框架,再添加消息处理逻辑,专门检测你要的三类内容:
1. 核心代码框架
先写个基础的启动模板,然后在消息处理函数里加检测逻辑:
import asyncio import re import sqlite3 from datetime import datetime from telegram import Update from telegram.ext import ApplicationBuilder, MessageHandler, filters, ContextTypes # 替换成你的Bot Token BOT_TOKEN = "你的API_TOKEN_HERE" # 定义网络安全相关关键词(可以根据需求自己扩展) CYBER_KEYWORDS = ["CVE", "threat intel", "hacking", "漏洞", "渗透测试", "恶意软件", "威胁情报", "SQL注入", "XSS"] # 初始化SQLite数据库(也可以换成CSV,后面会说) def init_db(): conn = sqlite3.connect("cyber_group_content.db") cursor = conn.cursor() # 创建存储表 cursor.execute(''' CREATE TABLE IF NOT EXISTS group_content ( id INTEGER PRIMARY KEY AUTOINCREMENT, chat_id INTEGER, chat_title TEXT, message_id INTEGER, message_text TEXT, detected_urls TEXT, media_type TEXT, media_file_id TEXT, created_at DATETIME ) ''') conn.commit() conn.close() # 消息处理函数,负责检测和保存内容 async def monitor_group_messages(update: Update, context: ContextTypes.DEFAULT_TYPE): message = update.effective_message chat = update.effective_chat # 跳过机器人自己的消息(避免死循环) if message.from_user.is_bot: return # 1. 检测消息中的URL detected_urls = [] if message.text: url_pattern = re.compile(r'https?://\S+') detected_urls = url_pattern.findall(message.text) # 2. 检测媒体附件 media_type = None media_file_id = None if message.video: media_type = "video" media_file_id = message.video.file_id elif message.document: media_type = "document" media_file_id = message.document.file_id elif message.photo: media_type = "photo" media_file_id = message.photo[-1].file_id # 取最高分辨率的照片ID # 3. 检测网络安全关键词 has_cyber_keywords = False if message.text: lower_text = message.text.lower() for keyword in CYBER_KEYWORDS: if keyword.lower() in lower_text: has_cyber_keywords = True break # 只要满足任一检测条件,就保存内容 if detected_urls or media_type or has_cyber_keywords: # 准备要保存的数据 data = ( chat.id, chat.title, message.message_id, message.text or "", ",".join(detected_urls), media_type or "", media_file_id or "", datetime.now().strftime("%Y-%m-%d %H:%M:%S") ) # 写入SQLite数据库 conn = sqlite3.connect("cyber_group_content.db") cursor = conn.cursor() cursor.execute(''' INSERT INTO group_content (chat_id, chat_title, message_id, message_text, detected_urls, media_type, media_file_id, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?) ''', data) conn.commit() conn.close() # 如果想用CSV保存,替换上面的数据库代码为下面的: # import csv # import os # with open("cyber_group_log.csv", "a", newline="", encoding="utf-8") as f: # writer = csv.writer(f) # # 第一次写入时添加表头 # if os.stat("cyber_group_log.csv").st_size == 0: # writer.writerow(["chat_id", "chat_title", "message_id", "message_text", "detected_urls", "media_type", "media_file_id", "created_at"]) # writer.writerow(data) if __name__ == "__main__": # 初始化数据库 init_db() # 构建Application application = ApplicationBuilder().token(BOT_TOKEN).build() # 添加消息处理器,监听所有消息 application.add_handler(MessageHandler(filters.ALL, monitor_group_messages)) # 启动机器人 application.run_polling()
2. 代码逻辑说明
- URL检测:用正则表达式匹配所有HTTP/HTTPS链接,把结果拼接成字符串方便存入数据库
- 媒体检测:检查消息的
video、document、photo属性,记录媒体类型和文件ID(你可以扩展下载媒体的逻辑,这里先存ID方便后续处理) - 关键词检测:把消息文本转成小写,和预设的关键词列表匹配,只要有一个匹配上就算符合条件
- 内容保存:只要满足任一检测条件,就把消息相关信息写入SQLite数据库(或者CSV,代码里有注释好的替换方案)
三、部署注意事项
- API限流:python-telegram-bot的
run_polling()已经做了限流处理,但如果群组消息量极大,可以考虑切换到run_webhook()模式更高效 - 权限问题:私密群组必须由管理员手动添加机器人,否则无法读取消息;公开群组只要拉进去即可
- 关键词扩展:你可以根据需求不断补充
CYBER_KEYWORDS列表,比如加入具体的CVE编号格式、安全工具名称等 - 异常防护:实际部署时建议添加try-except块,捕获数据库操作、API请求的异常,避免机器人意外崩溃
备注:内容来源于stack exchange,提问作者Kenneth Novales




