You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何使用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链接,把结果拼接成字符串方便存入数据库
  • 媒体检测:检查消息的videodocumentphoto属性,记录媒体类型和文件ID(你可以扩展下载媒体的逻辑,这里先存ID方便后续处理)
  • 关键词检测:把消息文本转成小写,和预设的关键词列表匹配,只要有一个匹配上就算符合条件
  • 内容保存:只要满足任一检测条件,就把消息相关信息写入SQLite数据库(或者CSV,代码里有注释好的替换方案)

三、部署注意事项

  1. API限流:python-telegram-bot的run_polling()已经做了限流处理,但如果群组消息量极大,可以考虑切换到run_webhook()模式更高效
  2. 权限问题:私密群组必须由管理员手动添加机器人,否则无法读取消息;公开群组只要拉进去即可
  3. 关键词扩展:你可以根据需求不断补充CYBER_KEYWORDS列表,比如加入具体的CVE编号格式、安全工具名称等
  4. 异常防护:实际部署时建议添加try-except块,捕获数据库操作、API请求的异常,避免机器人意外崩溃

备注:内容来源于stack exchange,提问作者Kenneth Novales

火山引擎 最新活动