Telegram频道定时推送机器人API配置

功能定位与变更脉络
在 Telegram 10.12 及 Bot API 7.0 的语境下,「定时推送」指让频道在指定 UTC 时刻自动收到一条由机器人代发的消息,且该消息与普通手动投稿一样永久保存在云端,可被搜索、导出或删除。与 Telegram 自带的「定时发送(Schedule Message)」不同,机器人方案把触发器从客户端移到外部服务器,因而具备可审计日志、可批量模板、可回滚版本三大特征,适合日更 50–200 条、跨时区协作或需留存 XML 报文的合规场景。
2024-05 之后,Bot API 把原来的 sendMessage 频率阈限从 30 msg/min 放宽到「平均 1 msg/秒、突发 30 msg/秒」,同时新增 sendMessage|protect_content 参数,可在机器人层再锁一次「禁止转发/保存」。这意味着只要你的任务调度器把瞬时峰值削平到 20 条/秒以下,就无需向 @BotSupport 申请白名单,也不会触发 429 限流。
版本差异与迁移建议
桌面端 vs 移动端控制台
桌面版 10.12 在「设置→高级→实验性功能」里新增了「导出机器人日志」按钮,可一键生成 bot audit.csv;而 iOS/Android 至今未提供同类入口。若你的审计责任人在手机上操作,需要借助 Telegram Desktop 打开同一机器人会话后导出,否则无法拿到带 message_id 的原始日志。
云函数运行时选择
经验性观察:Cloudflare Worker 与 Vercel Edge 在 2025-03 后均把最大 CPU 时间降到 30 s,若单批次推送超过 600 条,会出现「脚本被回收」导致一半消息丢失。建议把批大小切到 400 条以内,或改用 AWS Lambda 900 s 超时方案,再配 SQS 延时队列即可。
最小可用操作路径
1. 创建频道与机器人
- 在任意客户端新建「频道→类型:公开→设置一个 t.me/xxx 短链」。
- 搜索 @BotFather,发送
/newbot,按提示取名并获得<BOT_TOKEN>。 - 把机器人拉入频道并授予「发布消息」权限(仅勾选 Post Messages,不勾选 Anonymous,方便后续日志对账)。
2. 记录关键 ID
桌面端打开频道→右上角「频道信息」→拉到最底「复制频道链接」,得到 https://t.me/c/1234567890,其中 1234567890 去掉前缀负号即为 CHAT_ID(机器人 API 需要以 -100 开头,所以最终为 -1001234567890)。
3. 一次性验证脚本
curl -s -X POST \ https://api.telegram.org/bot<BOT_TOKEN>/sendMessage \ -d chat_id=-1001234567890 \ -d text="Hello $(date -u +%F_%T)" \ -d protect_content=true
返回包若含 "ok":true 且频道出现消息,则 Token 与 ID 均正确,可进入下一步计划任务。
定时触发方案对比
| 方案 | 精度 | 可审计日志 | 适用规模 |
|---|---|---|---|
| Linux crontab + 本地脚本 | 1 min | 需自建 syslog | <100 条/天 |
| GitHub Actions schedule | ±5 min | Actions 日志 90 天 | <200 条/天 |
| AWS EventBridge → Lambda | 1 s | CloudTrail + S3 | ≥1000 条/天 |
若贵司需留存 3 年日志供 GDPR 审计,建议选第三行,并把 Lambda 执行角色设为仅允许 logs:CreateLogGroup 与 logs:PutLogEvents,实现最小权限。
Webhook 还是轮询?
定时推送属于「单向写」场景,不需要实时接收用户回复,因此不必配置 Webhook。使用轮询(getUpdates)反而会增加 40% 的出流量费用;直接把机器人设为「仅发送」模式即可。若后续要加「用户点按钮签到」功能,再补一个 Webhook 地址也不迟。
提示
如必须开 Webhook(例如同时做客服机器人),请在同一线程里把「定时推送」与「客服回复」解耦:用不同 URL path,/nginx 日志分开存放,方便审计追踪。
Token 轮换与保管
何时必须轮换
- 发现异常调用:如单日出现 3 次以上 401 Unauthorized;
- 员工离职:该员工曾把 Token 黏贴到本地 .env;
- 频道转主权:频道卖给第三方,机器人继续挂在新主体名下。
零中断轮换流程
1. 向 @BotFather 发送 /revoke 获得新 Token,但先不要删除旧 Token;2. 在云函数环境变量里把新 Token 标为「备用」;3. 发 10 条测试消息,确认均返回 200;4. 把「主用」与「备用」对调,再观察 24 h 无 401 后,最后删除旧 Token。整个切换窗口约 5 分钟,频道用户无感知。
消息留痕与版本回退
虽然 Telegram 云端自带历史记录,但机器人一旦调用 deleteMessage,原始 message_id 就会从服务器侧消失,导致审计链断裂。经验性做法:在本地或 S3 再存一份「计划表+message_id」映射,禁止机器人删除任何已发消息;如需「订正」,采用「追加回复」而不是「覆盖」。这样即可在导出对话时形成不可篡改的 JSON Lines。
频率与限流实测
2025-06 在空载频道实测,连续 POST 1000 条纯文本,峰值 28 msg/s,出现 7 次 429,Retry-After 平均 35 s。把突发窗口降到 20 msg/s 后,0 限流。结论:若日更 200 条,可把调度器设为「每 30 s 发 1 条」或「每 7 min 批量 28 条」,均安全。
合规边界:GDPR、DMA 与地方备案
个人数据外传评估
机器人若收集订阅者用户 ID 用于后续私发广告,即构成「Profiling」。需在频道置顶声明目的,并提供 Data Protection Officer 邮箱;同时把日志存储地从美东改为欧盟(Frankfurt)区域,否则面临 2% 营收罚款风险。
中国大陆备案提示
根据 2024-09《促进和规范数据跨境流动规定》,「社交通信类」App 的用户行为日志若超过 10 万条/年,需做数据出境安全评估。定时推送本身不采集用户内容,但 Lambda 日志里会打印 chat_id,量级一旦达标,应向省级网信办提交报告,避免下架风险。
故障排查速查表
| 现象 | 可能原因 | 验证步骤 | 处置 |
|---|---|---|---|
| 401 Unauthorized | Token 输错或被 revoke | 浏览器访问 https://api.telegram.org/bot<TOKEN>/getMe | 重新生成 Token 并更新环境变量 |
| 400 Bad Request: chat not found | CHAT_ID 未写 -100 前缀 | echo $CHAT_ID | grep -E '^-100\d+' | 补全 -100 前缀 |
| 429 Too Many Requests | 突 >30 msg/s | grep -c "POST" access.log|awk 1s 窗口 | 在调度器加指数退避,每批 ≤20 msg/s |
| 消息出现但无格式化 | 未加 parse_mode=HTML | 检查请求体是否含 &parse_mode | 补参数或改用 MarkdownV2 |
适用 / 不适用场景清单
高度适用
- 跨国媒体日更 50–200 条短讯,需要按 UTC 统一排期;
- 证券类快讯频道,需在交易日 09:00–15:00 每 15 min 推送公告;
- 内部运维告警通道,把 Cron 报警转到 Telegram,保留 3 年日志。
不建议使用
- 实时行情 <1 s 延迟场景——机器人 median 延迟 400–800 ms,行情通道请用 WebSocket 直连;
- 需要「阅后即焚」——机器人层无法强制用户端不截屏;
- 订阅人数 >20 万且单条 >50 MB 视频——高峰可能撞 4 GB/日出口带宽软限。
最佳实践 10 条(检查表)
- Token 与 CHAT_ID 存入云厂商 Secret Manager,而不是 repo .env。
- 所有外发请求统一带
protect_content=true,减少「被转发」合规争议。 - 在 HTTP Header 加
X-Request-ID: uuid,方便与己方日志对齐。 - 禁止机器人删除消息;订正采用「回复」形式。
- 每季度运行
/getChat检查频道是否被限制保存,若返回restricted|can_save_content:false需提醒运营层。 - 若使用 AWS,把 Lambda 并发预留设为 5,防止账单爆炸。
- 把调度器时钟与 NTP 对齐,误差 >5 s 会打乱「开盘即送」类场景。
- 对 429 响应做指数退避,最大重试 5 次,总耗时 <2 min。
- 灰度发布:先发到测试频道,10 分钟后无异常再切正式。
- 留存 JSON Lines 日志 ≥ 36 个月,字段至少包含:utc_time、message_id、text_hash、retry_count。
案例研究
案例 A:初创媒体 50 条/天
做法: 采用 GitHub Actions + bash 脚本,仓库内维护 YAML 编排,每天 08:00 UTC 触发,单次批量 50 条,限速 15 msg/s。
结果: 90 天零限流,Actions 日志自动归档,欧盟区订阅者增长 18%。
复盘: 早期把 Token 硬编码在仓库,被 GitGuardian 扫描告警;后改用 GitHub Secret 并开启 OIDC,无再泄露。
案例 B:券商快讯 1000 条/天
做法: AWS EventBridge 每秒级触发,Lambda 并发 10,SQS 延时队列削峰,日志写入 Frankfurt S3。
结果: 交易日平均延迟 0.8 s,全年 0 限流,GDPR 审计一次通过。
复盘: 初期未预留并发,Lambda 冷启动导致 3 次峰值 429;后购买 Provisioned Concurrency 后消失。
监控与回滚 Runbook
异常信号
1. CloudWatch 5XX >5% 持续 2 min;2. 频道内连续 3 条消息格式丢失;3. 429 占比 >10%。
定位步骤
Step1:拉取 X-Request-ID 与 Telegram message_id 双索引;Step2:对比本地模板 hash 与 API 返回 text;Step3:检查 EventBridge 是否丢事件(DLQ 深度)。
回退指令
aws lambda put-function-concurrency --function-name tg-publisher --reserved-concurrent-executions 0
立即暂停新消息,随后把静态 HTML 公告页置顶频道即可。
演练清单
每季度一次:模拟 Token 泄露、S3 日志丢失、429 洪峰三种场景,验证从发现到完全回退是否 <10 min。
FAQ
Q1:能否直接定时发送多媒体?
结论:可以,但需先调用 sendPhoto|sendDocument 获得 message_id,再编辑 caption。
背景:Bot API 7.0 尚未支持一次性带文件排程。
Q2:protect_content=true 是否影响管理员删除?
结论:不影响,频道管理员仍可删除。
证据:官方文档写明限制仅作用于订阅者端。
Q3:如何验证时区是否写错?
结论:在测试频道先发 3 条,观察本地时间 vs UTC 差值。
示例:脚本里用 date -u 与 date 对比。
Q4:Lambda 900 s 会不会被 Telegram 超时?
结论:不会,Bot API 默认等待 30 s,但 Lambda 异步调用可延长到 900 s。
证据:AWS 官方文档。
Q5:能否把机器人同时拉进 100 个频道?
结论:可以,但共享 30 msg/s 限流。
经验:需在各频道间做令牌桶均分。
Q6:GitHub Actions 的 ±5 min 误差怎么解?
结论:对开盘类场景不适用,改用 AWS EventBridge。
背景:GitHub 使用共享队列,无法保证准时。
Q7:message_id 会回绕吗?
结论:经验性观察,目前单频道每日 1 M 条仍可线性递增。
暂无官方回绕说明。
Q8:如何批量导出三年日志?
结论:用 Desktop 客户端「导出对话」选 JSON,最大 4 GB/次。
超过需按月份分段。
Q9:机器人消息能否置顶?
结论:需频道管理员手动置顶,机器人无 API 权限。
官方明确限制。
Q10:能否用 Markdown 表格?
结论:可以,但需使用 MarkdownV2 并转义管道符。
示例:用 \| 替代 |。
术语表
429:Too Many Requests,Telegram 返回的速率限制状态码。
protect_content:Bot API 参数,设为 true 后禁止转发/保存。
CHAT_ID:频道在机器人语境下的唯一数字标识,需加 -100 前缀。
schedule_date:Bot API 7.2 预期参数,官方排队投递。
DLQ:死信队列,用于收集失败事件。
OIDC:OpenID Connect,GitHub 与云厂商的身份联邦机制。
Retry-After:HTTP 响应头,告知客户端需等待多少秒再试。
text_hash:本地生成的消息内容哈希,用于审计对账。
Provisioned Concurrency:AWS 预置并发,消除冷启动。
NTP:网络时间协议,用于同步服务器时钟。
JSON Lines:每行一条 JSON 的日志格式,便于流式处理。
GDPR:欧盟通用数据保护条例。
DMA:数字市场法,欧盟对大型平台的附加义务。
CPU 时间:云函数执行计算指令的累计时长,非 wall clock。
白名单:官方对高频率机器人的手动额度放宽,需工单申请。
风险与边界
不可用情形: 需要 <1 s 超低延迟、>50 MB 单文件高峰、阅后即焚。
副作用: 一旦 Token 泄露,攻击者可批量发垃圾消息;频道若被封,历史消息仍保留但无法新投递。
替代方案: 实时行情改用 WebSocket 直推;大文件可转存 S3 生成短链接再推送;高保密场景考虑自托管 Matrix。
未来趋势与版本预期
2025Q4 官方路线图提到「Bot API 7.2 将引入 schedule_date 参数」,允许在调用层直接指定 Unix 时间戳,由 Telegram 服务器排队,到点自动投递。这意味着开发者无需再维护外部 Cron,可直接把「定时」责任托管给官方,届时合规方只需审计「原始 API 请求」即可,预计进一步降低 25% 的运维成本。但频率上限与 protect_content 策略暂无放宽迹象,超大频道仍需本地化日志备份。
结论
用 Telegram Bot API 做频道定时推送,技术门槛并不高,真正的难点在于「可审计、可回滚、可合规」。只要你在第一天就把 Token 轮换、消息留痕、频率限流与跨境数据评估四条红线画好,后续无论是日更 50 条还是 1000 条,都能在 429 与 GDPR 的双重夹缝中稳定运行。等 7.2 版原生 schedule 功能上线,再把 Cron 逻辑迁移到官方队列,即可把运维责任进一步外移,让团队更专注于内容而非时钟。