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 会自动生成标题、摘要和标签了)
