许多用户在使用 Telegram 时,需要实时关注某个群组中的特定消息,比如项目通知、关键词提及、交易信号或社群公告。手动翻阅群组消息既耗时又容易遗漏,因此需要一种自动监听机制。本教程将手把手教你如何利用 Telegram 官方 API 和简单的脚本,搭建一个高效的群组消息监听系统,实现消息自动抓取、关键词过滤和通知推送。
第一步:准备监听环境和基础账号配置
在开始监听之前,你需要确保拥有一个 Telegram 账号,并获取用于 API 调用的必要凭证。
具体操作说明:
- 首先,在手机或电脑上注册并登录你的 Telegram 账号。建议使用一个专门用于监听任务的账号,避免与个人聊天混淆。
- 接着,在 Telegram 中搜索并关注 BotFather(官方机器人创建工具)。发送
/newbot命令,按提示输入机器人名称和用户名(例如MyMonitorBot),创建成功后你会收到一个 API Token,格式类似123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11。请务必保存好这个 Token。 - 然后,在 Telegram 中搜索你创建的机器人用户名,点击 Start启动它。同时,将机器人邀请到你想要监听的群组中,并赋予它 管理员权限(至少需要“读取消息”权限)。
注意事项/小提示:
- 创建机器人时,Token 一旦生成,请勿公开分享,否则他人可控制你的机器人。
- 邀请机器人进群时,需确保你是群组管理员,否则无法邀请。
- 如果群组设置了“仅允许管理员发言”,机器人仍可读取消息,但无法主动回复(监听不受影响)。
备用方案:
- 若无法创建机器人,可以使用个人账号的 MTProto API进行监听,但步骤更复杂且存在封号风险,不推荐新手使用。
- 如果找不到 BotFather,请检查网络连接,或尝试使用代理访问 Telegram。
第二步:获取目标群组的 Chat ID
监听消息需要知道目标群组的唯一标识符(Chat ID),这是机器人定位群组的依据。
具体操作说明:
- 打开你的机器人对话窗口,向机器人发送任意一条消息(如
/start)。 - 接着,在目标群组中发送一条测试消息(例如“测试”)。
- 然后,访问以下 URL 以获取最近的更新:
https://api.telegram.org/bot<你的Token>/getUpdates。将<你的Token>替换为第一步获取的 Token。 - 在返回的 JSON 数据中,找到
"chat":{"id":-1001234567890}这样的字段,负号开头的数字就是群组的 Chat ID。记录下这个 ID。
注意事项/小提示:
- 如果返回的 JSON 为空,表示没有新消息。请确保机器人在群组中,并且群组中有人发送了消息。
- Chat ID 通常是负数,个人用户的 ID 是正数。务必确认你复制的是群组的 ID。
- 可以通过在线 JSON 格式化工具(如 json.cn)来更清晰地查看返回数据。
备用方案:
- 如果
getUpdates返回的数据过多,可以在 URL 末尾添加?offset=-1来只获取最新一条更新。 - 也可以使用第三方工具如 @getidsbot机器人,在群组中发送
/id直接获取 Chat ID。
第三步:编写简单的监听脚本(Python 示例)
监听的核心是通过代码不断轮询 Telegram API,获取群组新消息并处理。
具体操作说明:
- 在你的电脑上安装 Python 3(推荐 3.7 以上版本)和 requests 库。打开终端或命令提示符,执行
pip install requests。 - 创建一个新文件,命名为
monitor.py,用文本编辑器打开,粘贴以下代码(请替换YOUR_BOT_TOKEN和YOUR_CHAT_ID):
`python
import requests
import time
TOKEN = "YOUR_BOT_TOKEN"
CHAT_ID = "YOUR_CHAT_ID"
URL = f"https://api.telegram.org/bot{TOKEN}/"
last_update_id = 0
def get_messages():
global last_update_id
response = requests.get(URL + "getUpdates", params={"offset": last_update_id + 1, "timeout": 30})
data = response.json()
if data["ok"] and data["result"]:
for update in data["result"]:
last_update_id = update["update_id"]
if "message" in update and str(update["message"]["chat"]["id"]) == CHAT_ID:
text = update["message"].get("text", "")
print(f"新消息: {text}")
# 此处可添加关键词过滤或通知逻辑
time.sleep(2)
while True:
get_messages()
`
- 保存文件后,在终端运行
python monitor.py。如果一切正常,当群组中有新消息时,控制台会打印出消息内容。
注意事项/小提示:
- 代码中的
time.sleep(2)表示每 2 秒轮询一次,频率太高可能触发 API 限流,建议保持 1-5 秒。 - 如果遇到
requests.exceptions.ConnectionError,请检查网络或代理设置。 - 监听脚本需要持续运行,建议部署在云服务器或长期开机的电脑上。
备用方案:
- 如果你不熟悉 Python,可以使用现成的 Telegram Bot API 封装库(如 python-telegram-bot),但需额外安装。
- 也可以使用 Node.js 或 Go 语言编写监听脚本,原理相同。
第四步:实现关键词过滤和通知推送
仅仅打印消息还不够,你需要让机器人只监听你关心的内容,并发送通知。
具体操作说明:
- 修改
monitor.py,在print(f"新消息: {text}")之后添加关键词判断逻辑。例如,只监听包含“紧急”或“公告”的消息:
`python
keywords = ["紧急", "公告"]
if any(kw in text for kw in keywords):
print(f"匹配关键词: {text}")
# 发送通知给自己
requests.get(URL + "sendMessage", params={"chat_id": "你的个人用户ID", "text": f"群组消息: {text}"})
`
- 要获取你的个人用户 ID,可以给机器人发送
/start,然后在getUpdates返回数据中查找"from":{"id":123456789}这个正数 ID。 - 运行修改后的脚本,当群组中出现包含关键词的消息时,机器人会私聊发送通知给你。
注意事项/小提示:
- 关键词匹配支持中文,但建议使用精确匹配或
in操作符,避免误触。 - 通知消息可以自定义格式,例如添加时间戳、发送者昵称等。
- 如果不需要通知,可以将通知代码注释掉,仅做日志记录。
备用方案:
- 除了私聊通知,还可以将消息转发到另一个群组,使用
forwardMessageAPI。 - 也可以集成邮件、钉钉或 Slack 通知,通过 requests 调用相应 Webhook。
第五步:验证监听是否正常工作
测试是确保系统可靠性的关键步骤。
具体操作说明:
- 保持
monitor.py脚本运行,切换到 Telegram 目标群组。 - 发送一条包含你设置的关键词的消息(例如“紧急通知:服务器维护”),观察控制台是否打印出匹配消息。
- 同时检查你的机器人私聊窗口,确认是否收到了通知消息。
- 发送一条不包含关键词的普通消息(例如“今天天气不错”),确保控制台没有误匹配,且没有收到通知。
注意事项/小提示:
- 如果通知没有送达,检查
sendMessage请求的返回值是否包含错误信息。 - 如果控制台打印了消息但没触发通知,检查关键词列表是否拼写正确。
- 测试时建议使用两个不同的设备或账号,避免干扰。
备用方案:
- 如果控制台无任何输出,检查 Token 和 Chat ID 是否正确,或重新执行
getUpdates测试。 - 如果机器人始终收不到新消息,尝试重启脚本并确认群组中有人发言。
第六步:处理常见故障和脚本优化
监听脚本长时间运行可能遇到各种问题,需要提前应对。
具体操作说明:
- 网络断开问题:在
get_messages函数中添加异常捕获,防止脚本崩溃:
`python
try:
response = requests.get(...)
except Exception as e:
print(f"网络错误: {e}")
time.sleep(10)
`
- API 限流问题:如果轮询太快,Telegram 可能返回
429 Too Many Requests。建议使用time.sleep(3)或更长时间,并在异常中增加重试逻辑。 - 消息重复处理:通过
last_update_id确保每条消息只处理一次。如果脚本重启,last_update_id会重置,可能导致重复处理旧消息。可以在脚本启动时从文件读取上次的update_id。 - 脚本后台运行:在 Linux 上使用
nohup python monitor.py &或screen会话;在 Windows 上可使用任务计划程序或编写为服务。
注意事项/小提示:
- 建议将日志输出到文件,而不是仅打印到控制台,方便排查问题。
- 定期检查机器人是否被群组踢出,或被 Telegram 封禁(通常因频繁发送消息)。
- 如果监听多个群组,可以维护一个 Chat ID 列表,循环处理。
备用方案:
- 如果不想自己写脚本,可以使用现成的开源项目如 Telegram Monitor Bot,但需自行修改配置。
- 对于极简需求,可考虑使用 IFTTT或 Zapier等自动化工具,但功能有限。
常见问题补充
问:为什么 getUpdates返回空数据?
答:常见原因包括:Token 错误、机器人未加入群组、群组中无新消息、或使用了错误的 Chat ID。请重新检查并发送一条测试消息。
问:监听脚本运行一段时间后自动停止怎么办?
答:可能是网络超时或 API 返回异常。建议在代码中加入异常捕获和自动重连机制,同时使用 supervisor或 pm2等进程管理工具保持脚本存活。
问:如何监听多个群组的消息?
答:在代码中维护一个 chat_ids列表,在 if判断中检查消息的 chat_id是否在列表中。每个群组可以独立设置关键词和通知方式。
问:机器人被群组管理员踢出后如何恢复?
答:需要重新邀请机器人进群,并再次赋予管理员权限。建议在脚本中加入异常检测,如果收到 403 Forbidden错误,记录日志并暂停该群组监听。
问:监听的消息包含图片或文件怎么办?
答:本教程示例仅处理文本消息。如需处理媒体消息,可以在 update["message"]中检查 photo、document等字段,并下载文件或提取描述文字。
总结:
通过创建 Telegram 机器人、获取 Chat ID、编写 Python 轮询脚本并添加关键词过滤,你可以轻松搭建一个群组消息监听系统,实现自动抓取和通知推送,从此不再错过任何重要信息。