对于独立博客作者和内容团队来说,将新文章及时推送到Telegram频道是保持读者活跃度的重要手段。传统做法往往依赖定时轮询或者第三方IFTTT服务,但轮询存在延迟,第三方服务又有隐私和稳定性风险。其实,Telegram Bot API本身就提供了强大的Webhook机制,配合你的博客系统,可以实现文章发布后毫秒级自动通知,而且完全掌控在自己的服务器上。
Webhook机制为何适合博客自动发布?
Webhook的本质是反向API:不是你的程序去不断询问“有新内容吗?”,而是内容源(比如博客后台)在产生新文章时,主动向你的Telegram Bot发送一个HTTPS请求。Telegram会把用户发送给Bot的消息转发到你指定的Webhook地址,但反过来,你也可以让任何系统调用Bot的sendMessage API。本文的思路略有不同:利用Telegram Bot的Webhook接收外部系统(如博客后台)发出的HTTP POST请求,再通过Bot发送消息到频道。这样,你只需要在博客侧配置一个回调URL,无需运行常驻脚本。
实现前的三大准备
在动手之前,请确认以下条件已满足:
- 一个Telegram Bot:通过@BotFather创建,并获取Bot Token。注意对Token严格保密,泄露后可随时重新生成。
- 一个目标频道:将Bot添加为频道管理员,至少授予“发布消息”权限。频道可以是公开或私密的。
- 可用的HTTPS地址:Telegram要求Webhook必须使用HTTPS,且证书有效。如果你的博客本身支持HTTPS,可以直接在博客服务器上放置一个小脚本;否则可以考虑使用Cloudflare Workers、Google Cloud Functions等无服务器方案。
第一步:配置Webhook接收地址
Telegram Bot的Webhook实际上是用于接收用户消息的,但我们可以通过一个简单的Python Flask应用作为中转:接收博客发出的POST请求,然后调用Telegram的sendMessage API。首先,在你的服务器上创建一个Python脚本(假设使用Flask):
from flask import Flask, request
import requests
app = Flask(__name__)
BOT_TOKEN = "123456:ABC-DEF..."
CHANNEL_ID = "@mychannel" # 或频道数字ID
@app.route("/webhook", methods=["POST"])
def webhook():
data = request.json
# 假设博客发送了title和url字段
title = data.get("title")
url = data.get("url")
if not title or not url:
return "Missing fields", 400
message = f"🚀 新文章发布:\n"
send_url = f"https://api.telegram.org/bot/sendMessage"
payload = {"chat_id": CHANNEL_ID, "text": message}
requests.post(send_url, json=payload)
return "OK", 200
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8443, ssl_context="adhoc")注意:这里使用adhoc SSL证书仅用于测试。生产环境建议使用Let's Encrypt证书。另外,更安全的做法是为你的Webhook路径设置一个随机密钥,比如/webhook/your-secret-token,防止别人乱调。
第二步:在Telegram API中注册Webhook
实际上,对于本文的用例,你的Flask应用是主动调用Telegram API,所以并不需要注册Webhook。但如果你想让Telegram Bot在收到特定消息时触发某些行为,那需要执行setWebhook操作。这里我们简化:博客后台直接向你的Flask应用发请求,Flask应用再调用Telegram API。因此,只需确保你的Flask应用对外可访问即可。
第三步:在博客后台添加Webhook回调
以WordPress为例,可以使用插件如“Webhooks”或自定义代码。在发布文章时,调用你的Flask应用URL,并以JSON格式发送title和url。例如,在functions.php中添加:
add_action( 'publish_post', function( $post_id, $post ) {
$data = array(
'title' => $post->post_title,
'url' => get_permalink( $post_id )
);
$payload = json_encode( $data );
$args = array(
'body' => $payload,
'headers' => array('Content-Type' => 'application/json')
);
wp_remote_post( 'https://your-server.com/webhook', $args );
}, 10, 2 );如果你使用静态博客(如Hugo、Hexo),可以在部署脚本中加入curl命令,或者使用GitHub Actions中的步骤来触发Webhook。
第四步:测试与验证
在博客上发布一篇草稿,观察Telegram频道是否收到消息。如果没收到,请检查:
- Flask应用是否正常运行,日志有无错误。
- 服务器防火墙是否放行对应端口。
- Telegram API调用是否成功,返回码是否为200。
- Bot是否在频道中有发送权限。
进阶优化与安全建议
- 消息格式:可使用Telegram的MarkdownV2语法,让标题加粗、链接可点击。
- 消息分段:长文章只发送摘要和链接,避免刷屏。
- 权限控制:在Webhook入口验证请求来源IP或自定义Header,防止恶意调用耗费API配额。
- 使用无服务器函数:如果你不想维护服务器,可将Flask代码转换为Cloudflare Worker或AWS Lambda函数,成本更低。
总结
通过Webhook方式实现博客文章自动发布到Telegram频道,不仅实时性高,而且不需要额外安装运行环境。整个过程依赖轻量,只要博客支持发送自定义HTTP请求,几乎都能实现。这种模式也适用于其他内容源,比如RSS更新、电商产品上线等。希望本文能帮助你搭建起自己的内容自动发布管道,节省重复操作的时间。