ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

基于Pyrogram的Telegram关键词监听机器人:从原理到实战部署

基于Pyrogram的Telegram关键词监听机器人:从原理到实战部署 简介这是一套面向TelegramTG生态运营者的关键词监听机器人源码适用于社群营销、竞品监控与实时用户触达等场景尤其适合需要隐蔽部署、多群协同监听的中高级开发者或运营人员。资源包共52个文件以36个PHP核心脚本为主含server.php、work.php、bootstrap.php等主控与工作模块辅以3个配置类JSON与HTML说明文档、Docker容器化部署文件docker-compose.yml、start/stop/reload脚本及环境配置文件.env.docker、config.php整体仅100KB轻量易部署。已有511人学习下载资源结构清晰包含完整运行流程从监听关键词配置监听关键词.json、消息路由逻辑、人工介入触发机制到私聊拉新响应链路并附带《关键词监听教程.docx》《资源说明必看.txt》等实操指引。读者可直接复用整套监听架构快速实现普号伪装、多群静默监控与关键词命中后的即时人工响应。1. 项目缘起从被动搜索到主动感知的信息需求在信息爆炸的时代我们常常陷入一个矛盾一方面我们害怕错过任何重要的消息另一方面我们又无法忍受信息洪流带来的持续干扰。这种矛盾在像Telegram这样的即时通讯平台上尤为突出。Telegram以其强大的群组功能和开放的API生态成为了许多垂直领域如技术交流、行业动态、项目协作、社区运营的信息集散地。一个活跃的群组每天可能产生成千上万条消息其中或许就隐藏着你急需的招聘信息、关键的漏洞披露、突发的行业新闻或者是你竞品的最新动态。传统的做法是“人肉盯群”——你不得不频繁地打开某个群聊手动翻阅历史记录或者祈祷重要的消息出现时你正好在线。这种方式效率极低且极度依赖个人精力对于需要同时关注多个群组的情况更是力不从心。更糟糕的是一些时效性极强的信息如限时优惠、闪购、重要公告一旦错过可能就意味着机会的丧失。“关键词监听机器人”正是为了解决这一痛点而生的自动化工具。它的核心逻辑非常简单让机器代替人眼7x24小时不间断地扫描指定群组或频道的每一条新消息一旦发现预设的关键词组合就立即通过某种方式通知你。这相当于为你配备了一个不知疲倦的“信息哨兵”将海量的、非结构化的聊天记录过滤成精准的、结构化的警报。标题中提到的“普号”支持意味着这个机器人不需要使用Telegram的Bot API即官方机器人账号而是可以直接使用一个普通的用户账号User Account来登录和操作这在某些对机器人有限制或需要以“真人”身份读取消息的场景下非常有用。而“人工实时监听”则强调了通知的即时性和交互性确保警报能第一时间送达。2. 核心原理拆解普通账号如何实现消息监听要理解这个项目首先得弄清楚Telegram消息获取的两种主要途径Bot API 和 MTProto客户端协议。2.1 Bot API vs. MTProtoUser ClientBot API这是Telegram官方为开发者提供的、用于创建机器人的接口。创建一个Bot非常简单通过BotFather即可完成。Bot可以接收发送给它的消息、命令以及在它所在的群组中如果被添加为管理员接收所有消息。它的优点是稳定、官方支持、功能明确。但缺点也很明显Bot在群组中默认无法读取历史消息除非被设为管理员并且Bot的“机器人”身份在某些群组中可能不受欢迎或被限制。MTProto协议这是Telegram客户端如官方App、Telegram Desktop与服务器通信所使用的底层协议。当我们用手机号注册一个普通账号并登录时使用的就是这套协议。通过编程方式模拟一个MTProto客户端我们就可以让一个程序像真人用户一样登录、加群、收发消息。这就是“普号”监听机器人的技术基础。2.2 “普号”监听的技术实现路径使用普通账号进行监听本质上是在模拟一个真实的Telegram用户。其技术栈通常围绕能够处理MTProto协议的库来构建。目前最成熟、最流行的方案是使用Telethon或Pyrogram这两个基于Python的第三方库。Telethon功能强大更接近底层MTProto灵活性高但学习曲线相对陡峭。PyrogramAPI设计更加友好和“Pythonic”文档清晰对于大多数监听任务来说更易上手。它们的工作原理可以概括为以下几步API凭证获取你需要在 my.telegram.org 用你的普通手机号登录创建一个应用Application从而获得api_id和api_hash。这组凭证代表了你的“开发者身份”用于程序登录。客户端登录与会话管理程序使用你的手机号、api_id和api_hash进行登录。首次登录需要验证码通过短信或已登录设备接收。登录成功后库会生成一个.session文件保存了你的授权会话下次启动时无需再次验证。事件监听与处理库的核心是事件循环Event Loop。你注册一个“新消息事件”NewMessage的监听器Handler。每当你的账号接收到一条新消息包括私聊、群组、频道这个监听器就会被触发。消息过滤与响应在监听器的回调函数中你可以获取到完整的消息对象包含发送者、聊天ID、消息内容、时间戳等。在这里你将消息内容与你预设的关键词列表进行匹配。匹配逻辑可以是简单的字符串包含if keyword in message.text也可以是更复杂的正则表达式以实现模糊匹配或模式匹配。通知发送一旦匹配成功程序就需要执行“通知”操作。这是“人工实时监听”的关键。通知方式可以多种多样转发到指定聊天将匹配到的消息原样转发到你指定的另一个私聊、群组或频道比如你自己的“警报接收专用群”。发送摘要到其他平台通过其他服务的API如钉钉、飞书、企业微信的机器人Webhook或者发送邮件推送一条包含关键信息的警报。在控制台打印并播放提示音对于本地运行的脚本这是一种简单直接的提醒方式。注意使用普通账号进行自动化操作存在风险。Telegram官方不鼓励滥用用户API进行大规模爬取或 spam 行为。你的账号如果行为异常如短时间内加入过多群组、发送大量请求可能会被暂时限制或封禁。因此务必遵守目标群组的规则并将监听频率控制在合理范围内模拟人类行为。3. 从零构建一个基础版关键词监听机器人下面我将以Pyrogram库为例手把手演示如何构建一个最基础的关键词监听机器人。这个版本将实现登录一个普通账号监听指定群组的新消息当消息内容包含预设关键词时在控制台打印警报并同时将消息转发到你的另一个私人聊天作为通知。3.1 环境准备与依赖安装首先确保你的系统已安装 Python建议 3.7 或以上版本。然后创建一个新的项目目录并安装必要的库。# 创建项目目录并进入 mkdir tg-keyword-monitor cd tg-keyword-monitor # 创建虚拟环境推荐避免包冲突 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Linux/Mac: source venv/bin/activate # 安装 Pyrogram pip install pyrogram3.2 获取 Telegram API 凭证访问 https://my.telegram.org 用你打算用作监听账号的手机号登录需要短信验证。点击 “API development tools”。填写应用信息App title和Short name可以随意填写如MyMonitor点击 “Create application”。创建成功后页面会显示你的api_id和api_hash。请妥善保管这两个值它们等同于你账号的密码不要泄露。3.3 编写核心监听脚本创建一个名为monitor.py的文件并填入以下代码。代码中包含了详细的注释。import asyncio import re from pyrogram import Client, filters from pyrogram.types import Message # 配置信息 API_ID 你的api_id # 替换为你的 api_id整数类型 API_HASH 你的api_hash # 替换为你的 api_hash字符串类型 PHONE_NUMBER 8612345678900 # 替换为你的手机号国际格式 # 要监听的源聊天群组或频道的ID或用户名 # 可以是公开群的用户名如 telegram或私有群的ID负数需要先获取 SOURCE_CHAT your_target_group # 替换为目标群组的用户名或ID # 接收警报的目标聊天你的私人聊天或另一个群组 TARGET_CHAT me # me 表示发送到“已保存消息”也可以填具体的用户ID或群组ID # 关键词列表支持正则表达式更灵活 KEYWORDS [ r招聘, # 包含“招聘” r急.*招, # 包含“急”和“招”中间可有任意字符 r(?i)python, # (?i)表示忽略大小写匹配 python/Python/PYTHON r漏洞|bug|安全, # 包含“漏洞”或“bug”或“安全” r\$[A-Z], # 匹配美元符号开头的股票代码如 $TSLA ] async def main(): 主函数创建客户端并启动监听 # 创建 Pyrogram 客户端session_name 是会话文件的名字 app Client(my_monitor_session, api_idAPI_ID, api_hashAPI_HASH, phone_numberPHONE_NUMBER) async with app: # 获取当前登录账号的信息确认登录成功 me await app.get_me() print(f成功登录为: {me.first_name} ({me.username})) print(f开始监听聊天: {SOURCE_CHAT}) print(f警报将发送至: {TARGET_CHAT}) print(监听关键词:, KEYWORDS) print(- * 50) # 定义一个消息处理器只处理来自 SOURCE_CHAT 的新消息 app.on_message(filters.chat(SOURCE_CHAT) filters.incoming) async def keyword_handler(client: Client, message: Message): # 忽略空消息或非文本消息如图片、文件除非你也想检查其标题 if not message.text: return msg_text message.text chat_title message.chat.title sender_name message.from_user.first_name if message.from_user else 未知用户 # 遍历关键词进行匹配 for pattern in KEYWORDS: if re.search(pattern, msg_text, re.IGNORECASE): # 匹配成功构建警报信息 alert_msg ( f **关键词警报** \n f**来源群组:** {chat_title}\n f**发送者:** {sender_name}\n f**匹配规则:** {pattern}\n f**消息内容:**\n{msg_text[:200]}\n # 只截取前200字符 f**时间:** {message.date}\n f[跳转到原消息](https://t.me/c/{str(message.chat.id).replace(-100, )}/{message.id}) ) # 1. 在控制台打印警报本地提醒 print(f\n[警报] {alert_msg}) # 2. 将原消息转发到目标聊天保留原始格式和上下文 try: await message.forward(TARGET_CHAT) print(f - 已转发消息至目标聊天。) except Exception as e: print(f - 转发失败: {e}) # 3. 可选发送一条格式化的警报消息到目标聊天 try: await client.send_message(TARGET_CHAT, alert_msg) print(f - 已发送文本警报至目标聊天。) except Exception as e: print(f - 发送文本警报失败: {e}) # 匹配到一个关键词即可跳出循环 break # 保持客户端运行持续监听 print(监听器已启动按 CtrlC 停止...) await idle() # 这是一个保持事件循环运行的辅助函数Pyrogram v2 后推荐使用 asyncio.Event # 由于我们使用了 async with app这里不需要手动启动和停止 # 由于最新版Pyrogram的idle函数可能变化我们使用asyncio事件来保持运行 async def idle(): 保持事件循环运行直到被中断 event asyncio.Event() try: await event.wait() except asyncio.CancelledError: pass if __name__ __main__: # 运行异步主函数 asyncio.run(main())3.4 关键步骤与配置详解替换配置信息将代码中的API_ID、API_HASH、PHONE_NUMBER、SOURCE_CHAT替换为你自己的信息。SOURCE_CHAT如何获取对于公开群组直接使用其公开的用户名如telegram。对于私有群组你需要先让监听账号加入该群然后可以通过临时写一段代码打印message.chat.id来获取这个ID通常是一个很大的负数。TARGET_CHAT设为me是最简单的消息会发到你的“已保存消息”Saved Messages。你也可以填写具体的用户ID或聊天ID。关键词列表设计KEYWORDS列表使用了正则表达式这比简单字符串包含强大得多。r急.*招匹配“急聘”、“急招程序员”等。r(?i)python(?i)是忽略大小写的标志。r漏洞|bug|安全使用管道符|表示“或”逻辑。你可以根据你的监听目标灵活调整和扩展这个列表。运行脚本在终端中确保位于项目目录且虚拟环境已激活然后运行python monitor.py首次运行会提示你输入验证码发送到该手机号绑定的Telegram客户端。输入后程序会创建一个my_monitor_session.session文件以后运行就不再需要验证了。测试在你监听的群组里发送一条包含“招聘”或“Python”的消息观察控制台输出和你的“已保存消息”是否收到警报。4. 进阶功能与生产环境部署考量上面的基础脚本已经实现了核心功能但要作为一个稳定、可靠、功能丰富的“监听机器人”还需要考虑很多进阶问题。4.1 多群组监听与差异化规则你很可能需要同时监听多个群组并且每个群组关注的关键词可能不同。# 定义监听任务列表每个任务是一个字典包含源聊天、目标聊天和关键词列表 MONITOR_TASKS [ { source: tech_news_group, target: me, keywords: [r漏洞, r0day, r安全更新, rCVE-\d-\d] }, { source: job_hunting_channel, target: my_private_alerts, # 另一个专门接收警报的频道 keywords: [r后端开发, rJava|Go, r年薪.*万, r急招] }, { source: -1001234567890, # 一个私有群的ID target: me, keywords: [r今晚八点, r重要通知, rall] } ] # 然后在消息处理器中根据 message.chat.id 来判断属于哪个任务应用对应的关键词列表。4.2 消息去重与频率限制同一个话题可能在短时间内被多人讨论导致重复警报。我们需要引入去重机制例如在5分钟内对于同一关键词、来自同一聊天、内容相似的消息只报警一次。这可以通过维护一个简单的缓存如lru_cache或记录最近报警的消息ID来实现。同时为了避免触发Telegram的频率限制在转发或发送消息时需要加入短暂的延迟await asyncio.sleep(0.5)。4.3 更丰富的通知渠道控制台和Telegram转发是基础通知。在生产环境中我们可能需要更可靠、更及时的通知方式邮件通知使用smtplib库匹配到关键词后发送一封警报邮件到指定邮箱。即时通讯工具Webhook几乎所有主流办公IM都支持机器人Webhook。钉钉创建一个群机器人获取Webhook地址使用aiohttp或requests库发送POST请求。飞书/企业微信类似创建机器人获取Webhook。Discord/Slack同样支持Incoming Webhook。手机推送集成如BarkiOS、PushDeer或Gotify等自建推送服务实现手机端强提醒。4.4 持久化存储与状态管理当前的脚本是“无状态”的重启后所有上下文丢失。为了实现更复杂的功能需要引入数据库存储历史警报记录使用SQLite轻量或PostgreSQL记录每次报警的时间、来源、关键词、消息内容等便于后续查询和分析。动态管理关键词通过数据库存储关键词并提供一个简单的管理界面如Telegram私聊命令来动态添加、删除、查询关键词而无需修改代码重启服务。用户与权限管理如果你想把服务提供给一个小团队使用需要数据库来管理哪些用户可以设置哪些群组的监听规则。4.5 部署与高可用Python脚本可以长期运行在服务器上。推荐的方式使用systemd服务在Linux服务器上将你的脚本配置为一个systemd服务可以设置开机自启、自动重启当进程崩溃时。容器化部署使用Docker将你的应用及其依赖打包成一个镜像。这保证了环境一致性并且可以方便地在任何支持Docker的服务器上部署。日志与监控使用Python的logging模块将运行日志输出到文件并配合logrotate进行管理。对于关键服务可以设置简单的存活监控如定时发送心跳消息一旦异常则通过备用通道通知管理员。4.6 反反爬与账号安全这是使用“普号”监听最需要谨慎对待的部分。Telegram会检测异常行为。以下是一些经验准则控制请求频率避免在极短时间内进行大量API调用如快速翻看历史消息。在代码中为所有主动请求如get_chat_members添加随机延迟。模拟人类行为不要一登录就立刻开始疯狂监听几十个群组。可以逐步加入群组并且监听脚本的运行时间可以模拟人类的作息例如在本地时间的凌晨降低监听频率或暂停。准备备用账号对于非常重要的监听任务考虑使用2-3个账号进行冗余监听并将它们部署在不同的IP地址下例如不同的VPS以防某个账号被临时限制。妥善保管 session 文件.session文件包含了登录令牌泄露它等同于泄露账号。确保服务器权限设置正确不要将该文件提交到公开的代码仓库。5. 实战踩坑那些官方文档没告诉你的事在实际开发和运行过程中我遇到了不少坑这里分享出来希望能帮你节省时间。5.1 获取私有群组/频道ID的“正确”姿势对于私有群组或你作为成员的频道其ID通常是一个以-100开头的长数字如-1001234567890。如何获取它最稳妥的方法不是去网上找那些可能过时的工具而是写一段简单的调试代码from pyrogram import Client async def main(): app Client(my_session) async with app: # 获取你所有的对话列表 async for dialog in app.get_dialogs(): print(f{dialog.chat.title} - {dialog.chat.id}) # 或者在消息处理器里打印 # app.on_message(filters.incoming) # async def handler(client, message): # print(f收到来自 {message.chat.title}({message.chat.id}) 的消息) asyncio.run(main())运行这段代码然后在你想要监听的群组里发一条消息就能在输出中看到它的ID了。5.2 处理“权限不足”与“消息无法访问”即使用户账号在群组中也可能无法访问所有消息超级群组Megagroup与默认权限在大型超级群组中新加入的成员默认可能无法查看入群前的历史消息。你的监听账号如果是后来加入的那么on_message处理器只会收到它加入之后的新消息。被禁言或限制如果你的账号在群内被管理员禁言或设置了限制可能无法读取消息或获取成员列表。程序可能会抛出ChatAdminRequired或ChannelPrivate异常。代码中必须用try...except块捕获并处理这些异常例如记录日志并跳过该群组而不是让整个程序崩溃。5.3 消息内容的多样性处理我们的基础示例只检查了message.text。但Telegram消息类型很多图文消息message.caption包含了图片、视频、文件等附带的文字说明这部分也需要检查。链接预览消息中的链接会生成预览预览的标题和描述也可能包含关键信息。格式化文本消息可能包含粗体、斜体、代码块等实体Entities。message.text获取的是纯文本但有时你需要检查原始格式。message.entities或message.caption_entities提供了这些信息。媒体消息如果你需要监听特定类型的文件如.pdf,.docx可以检查message.document及其file_name属性。一个更健壮的消息内容提取函数可能是这样的def extract_message_content(message: Message) - str: 提取消息中所有可能的文本内容 content if message.text: content message.text \n if message.caption: content message.caption \n # 如果有链接预览可以尝试获取其标题和描述如果API支持 # if message.web_page: # content fLink Title: {message.web_page.title}\n # content fLink Description: {message.web_page.description}\n return content.strip()5.4 会话管理与多设备登录冲突一个Telegram账号同一时间只能在一个地点保持活跃的“主会话”。如果你在手机上登录了该账号然后在服务器上运行监听脚本手机上的会话可能会被踢下线反之亦然。Pyrogram和Telethon在创建会话时如果检测到冲突通常会让你选择终止其他会话。对于监听专用账号最好不要在常用手机上登录或者使用Telegram的“多设备登录”功能但需要注意第三方库对多设备的支持情况。一个更彻底的做法是专门申请一个手机号用于注册监听账号。构建一个稳定、功能丰富的Telegram关键词监听机器人从技术原理上看并不复杂核心在于对Pyrogram/Telethon库事件的熟练运用。真正的挑战在于工程化细节如何设计灵活可配的规则、如何确保通知的可靠送达、如何管理多个监听任务、以及如何保障账号安全和程序长期稳定运行。这个项目是一个绝佳的练手机会它能让你深入理解异步编程、网络爬虫的伦理边界、服务部署与监控。当你把它搭建起来并成功捕获到第一条有价值的信息时那种“自动化赋能”的成就感会非常强烈。记住能力越大责任越大务必在合法合规、尊重他人隐私和群组规则的前提下使用这项技术。本文还有配套的精品资源点击获取
返回列表