打造高效Telegram通知机器人:从零开始实现自动化消息推送

张开发
2026/4/20 17:21:49 15 分钟阅读

分享文章

打造高效Telegram通知机器人:从零开始实现自动化消息推送
1. 为什么需要Telegram通知机器人想象一下这样的场景你正在训练一个深度学习模型可能需要几个小时甚至几天的时间。这时候你不可能一直盯着屏幕等待结果但又想及时知道训练进度或者异常情况。又或者你管理的服务器突然宕机需要立即收到警报。这时候一个能主动推送消息的Telegram机器人就成了你的得力助手。相比其他通知方案Telegram机器人有几个明显优势首先是完全免费不像某些平台需要付费订阅其次是跨平台支持手机、电脑都能接收消息最重要的是高度自定义你可以完全控制通知的内容和格式。我曾在多个项目中使用这种方案实测下来稳定性和即时性都很不错。2. 创建你的第一个Telegram机器人创建Telegram机器人比想象中简单得多。首先在Telegram中搜索BotFather这个官方机器人注意带蓝色认证标志。和它对话发送/newbot命令按照提示操作即可。给机器人取名时有个小技巧名字必须以bot结尾比如MyAlertBot或server_monitor_bot。创建成功后BotFather会给你一个API token这相当于机器人的密码一定要妥善保存。我建议把它添加到环境变量中而不是直接写在代码里。这里有个实际创建时的经验分享如果你打算用这个机器人发送重要通知最好单独创建一个专用账号而不是用日常使用的Telegram账号。这样可以避免误操作导致的通知中断。3. 获取必要的聊天ID要让机器人知道把消息发给谁我们需要获取chat_id。这个步骤很多教程讲得不太清楚我来详细说明首先你需要主动给机器人发一条消息。可以是你创建的机器人账号也可以是群组如果想让机器人发到群组里。然后访问这个URL查看会话信息https://api.telegram.org/bot你的TOKEN/getUpdates把你的TOKEN替换成刚才获取的API token。返回的JSON数据中找到message下的chat对象里面的id就是我们要的chat_id。这个ID可能是正数个人聊天或负数群组。实测中发现一个常见问题如果你在群组中使用机器人需要先把机器人设为管理员否则它可能无法发送消息。另外建议把这个ID也保存到配置文件中避免每次都要查询。4. 使用Python发送第一条消息现在有了token和chat_id就可以用Python发送消息了。我们使用requests库来调用Telegram的APIimport requests def send_telegram_message(text): token 你的BOT_TOKEN # 实际使用中建议从环境变量读取 chat_id 你的CHAT_ID url fhttps://api.telegram.org/bot{token}/sendMessage payload { chat_id: chat_id, text: text, parse_mode: Markdown # 支持Markdown格式 } response requests.post(url, jsonpayload) return response.json() # 测试发送 send_telegram_message(Hello from Python! 这是第一条测试消息)这段代码有几个实用技巧使用f-string格式化URL更清晰payload用字典形式更易维护parse_mode参数允许使用Markdown格式化消息。我在实际项目中发现合理使用Markdown可以让通知消息更易读比如用**加粗**显示重要信息。5. 进阶功能与实用技巧基础消息发送只是开始Telegram机器人还有很多强大功能可以挖掘。比如发送带格式的代码块message python def train_model(): # 训练代码... print(训练完成)训练状态正常当前准确率92.3% send_telegram_message(message)对于监控场景可以添加emoji让消息更醒目虽然原文要求不能使用emoji但实际开发中可以灵活运用。比如用⚠️表示警告用✅表示成功。 另一个实用功能是消息按钮。通过设置reply_markup参数可以添加交互按钮 python from urllib.parse import quote_plus def send_message_with_button(): token 你的BOT_TOKEN chat_id 你的CHAT_ID url fhttps://api.telegram.org/bot{token}/sendMessage keyboard { inline_keyboard: [[ {text: 查看日志, url: http://your-server/logs}, {text: 重启服务, callback_data: restart} ]] } payload { chat_id: chat_id, text: 服务器CPU使用率超过90%, reply_markup: json.dumps(keyboard) } requests.post(url, jsonpayload)6. 实际应用案例训练监控结合开头提到的深度学习训练场景我们可以创建一个完整的训练监控方案。以下是一个实际项目中的代码片段import json from datetime import datetime def training_notification(epoch, metrics): 发送训练进度通知 token os.getenv(TELEGRAM_BOT_TOKEN) chat_id os.getenv(TELEGRAM_CHAT_ID) url fhttps://api.telegram.org/bot{token}/sendMessage # 构建消息内容 time_str datetime.now().strftime(%Y-%m-%d %H:%M:%S) message f *训练进度报告* **时间**: {time_str} **当前轮次**: {epoch} **评估指标**: json {json.dumps(metrics, indent2)} payload { chat_id: chat_id, text: message, parse_mode: Markdown } try: response requests.post(url, jsonpayload) response.raise_for_status() except Exception as e: print(f发送通知失败: {e}) # 在训练循环中调用 for epoch in range(epochs): # ...训练代码... if epoch % 10 0: # 每10轮发送一次通知 training_notification(epoch, val_metrics)这个方案我在三个不同的深度学习项目中使用过最大的模型训练了整整一周期间通过Telegram机器人随时掌握训练状态非常可靠。当训练意外中断时也能第一时间收到通知避免了计算资源的浪费。7. 错误处理与性能优化在实际使用中网络问题不可避免。我们需要增加重试机制和超时设置from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry def safe_send_message(text, max_retries3): session requests.Session() retries Retry(totalmax_retries, backoff_factor0.1, status_forcelist[500, 502, 503, 504]) session.mount(https://, HTTPAdapter(max_retriesretries)) try: response session.post(url, jsonpayload, timeout10) return response.json() except requests.exceptions.RequestException as e: print(f发送消息失败: {e}) return None对于高频通知场景比如秒级监控要注意Telegram API有频率限制大约每秒30条消息。我遇到过一个坑是短时间内发送太多消息导致被临时封禁解决方案是添加简单的限流import time class NotificationLimiter: def __init__(self, interval1.0): self.last_sent 0 self.interval interval def send(self, message): now time.time() if now - self.last_sent self.interval: send_telegram_message(message) self.last_sent now else: print(消息发送过于频繁已忽略)8. 安全注意事项虽然Telegram机器人很方便但安全问题不容忽视。以下是我总结的几个关键点永远不要将token提交到代码仓库。可以使用环境变量或配置文件并确保.gitignore设置正确限制机器人的访问范围。如果只在私人使用可以在BotFather中设置/setjoingroups禁用加入群组敏感操作需要二次验证。比如服务器重启命令应该需要确认定期轮换token。如果怀疑token可能泄露立即在BotFather中生成新的我曾经犯过一个错误把包含token的代码截图发到了技术论坛结果机器人被滥用发送垃圾消息。教训很深刻现在我会在分享代码前仔细检查。

更多文章