Back to Home

Jan 24, 2026

终于把博客自动同步到 Telegram 频道的功能彻底搞定了。

回顾一下这次折腾的过程,其实核心逻辑不难,细节全是坑:

1. 基础链路:Bot + Actions

  • 申请机器人:找 BotFather 申请机器人,拉进频道当管理员,拿 Token 和 Chat ID。这步最简单。
  • 自动化脚本:写了个 Node.js 脚本,配合 GitHub Actions。每次代码 push 到 main 分支时,用 git diff 算出新增的 Markdown 文件,解析出标题和链接发给 Bot。

2. 问题一:文件重命名检测失效

  • 现象:修改了文件名(如 v1.md -> v2.md)后,推送没有触发通知。
  • 原因:Git 将此操作识别为 重命名 (Rename),而脚本最初只检测 新增 (Add)
  • 解决:将 git diff 的过滤器从 A 升级为 ACR,同时覆盖 Add、Copy、Rename 三种情况。

3. 问题二:Instant View 规则报错

  • 现象:IV 模板测试时,提示 <img> is not supported in <p>
  • 原因:Markdown 渲染器默认将图片包裹在 <p> 标签里,但 IV 规范不允许。
  • 解决:在 IV 规则中加入 @split_parent: //p/img,强制将图片与父级段落拆开。

4. 问题三:Web 端链接无法打开

  • 现象:App 端点击 t.me/iv?... 链接能秒开,但 Web 端点击后无反应或报错。
  • 原因:Telegram Web 对 IV 链接的支持极差。
  • 尝试1(隐形链接):在消息开头插入零宽空格 [\u200B](IV链接),正文保留原始链接。这能在 App 端触发卡片,但依然不够优雅。
  • 尝试2(官方方案):升级到 Telegram Bot API 的 link_preview_options。在 API 调用中显式指定 url: "t.me/iv?..." 用于生成预览卡片,而正文链接保持原始网址。这是目前最稳健的方案。

5. 问题四:通知没有预览卡片(时序问题)

  • 现象:消息能发送,但无论 App 还是 Web 都没有预览卡片。
  • 原因:通知步骤在部署步骤之前执行。当 Telegram 服务器收到链接去抓取时,新文章还未上线,返回 404,导致预览生成失败。
  • 解决:调整 GitHub Actions 工作流顺序,将通知步骤移到部署之后,并增加 10 秒延迟等待 CDN 生效。

最终流程

写文章 -> Push -> 自动触发 Action -> 先部署 -> 等待 10s -> 再通知 -> 频道秒推 (带 Instant View)。

舒服了,继续搬砖。

(Update: 优化了通知样式,现在 Note 会自动生成标题、摘要和标签了)

#1:10 pm/折腾, Telegram, 自动化