在工作中,我们常常面临一个尴尬的处境:团队的一部分成员习惯使用Telegram,而另一部分则偏好Slack。消息分散在不同平台,信息同步滞后,协作效率大打折扣。有没有一种办法,让两个平台的消息无缝互通呢?答案就是——Webhook。本文将以Telegram中文官网的视角,为你带来一份详实的Telegram借助Webhook桥接Slack消息的实战教程。
为什么选择Webhook桥接?
Webhook是一种轻量级的回调机制,当某个事件发生时,源平台会向目标平台指定的URL发送HTTP请求。相比轮询或复杂API调用,Webhook实时性好、实现简单、占用资源少。Telegram Bot API与Slack都原生支持Webhook,因此我们可以用最少的代码实现消息的跨平台转发。但需要注意,默认情况下,Telegram与Slack的Webhook方向是单向的:Telegram通过Bot API的sendMessage方法可发送任意消息到Slack的Incoming Webhook地址;而Slack要发消息到Telegram,则需要借助Slack的Events API或Slash Command,再调用Telegram Bot API。别担心,本文会为你逐一拆解。
前置准备
- 一个Telegram账号,并创建好一个Bot(使用@BotFather)。记下Bot Token。
- 一个Slack工作区,且你有权限创建Incoming Webhook或配置Events API。
- 一台可以运行Python脚本的服务器(本地用Windows/Linux/Mac均可,生产环境建议使用云服务器或Cloud Functions)。
- Python 3.6+环境,安装
requests和flask库(用于反向桥接)。
方案一:Telegram消息转发至Slack
这是最常见的使用场景——把Telegram群组或频道中的消息同步到Slack频道,方便只用Slack的同事看到。实现思路:通过Telegram Bot监听新增消息,当收到消息时,通过Slack Incoming Webhook将消息内容推送到Slack。
步骤1:创建Slack Incoming Webhook
- 打开 Slack API,点击“Create New App”,选择“From scratch”,填写应用名称和Workspace。
- 进入应用管理页,在左侧菜单找到“Incoming Webhooks”,点击“Activate Incoming Webhooks”。
- 点击“Add New Webhook to Workspace”,选择要接收消息的频道,点击“Install”批准。完成后你会得到一个形如
https://hooks.slack.com/services/T00000000/B00000000/XXXXXXXXXXXXXXXXXXXXXXXX的Webhook URL。
步骤2:获取Telegram Chat ID
要把消息从Telegram转发到Slack,我们需要知道消息来自哪个聊天(群组或频道)。最简单的方法是给Bot发送一条消息,然后通过getUpdates接口获取Chat ID。在浏览器中访问以下地址(替换YOUR_BOT_TOKEN):
https://api.telegram.org/bot<YOUR_BOT_TOKEN>/getUpdates
发送后将看到JSON输出,其中message.chat.id就是你要的ID。如果是群组,需要先把Bot拉入群组,并在群组中发言一次才能捕获。
步骤3:编写Python转发脚本
我们可以使用Telegram Bot的getUpdates长轮询方式,也可以设置Webhook。这里为了演示简单,采用长轮询。创建文件telegram_to_slack.py:
import requests
import time
import json
# 配置
BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
SLACK_WEBHOOK_URL = "YOUR_SLACK_WEBHOOK_URL"
CHAT_ID = "YOUR_TELEGRAM_CHAT_ID" # 可选,指定监听某个聊天,不填则监听全部
# 获取Telegram更新
def get_updates(offset):
url = f"https://api.telegram.org/bot/getUpdates"
params = {"timeout": 30, "offset": offset}
try:
resp = requests.get(url, params=params)
return resp.json().get("result", [])
except Exception as e:
print(f"Error: ")
return []
# 发送到Slack
def send_to_slack(text):
payload = {"text": text}
headers = {"Content-Type": "application/json"}
resp = requests.post(SLACK_WEBHOOK_URL, data=json.dumps(payload), headers=headers)
if resp.status_code != 200:
print(f"Slack error: {resp.status_code} {resp.text}")
# 主循环
offset = 0
while True:
updates = get_updates(offset)
for upd in updates:
update_id = upd["update_id"]
offset = update_id + 1
message = upd.get("message") or upd.get("channel_post")
if not message:
continue
text = message.get("text") or message.get("caption") or "[不支持的消息类型]"
# 可选:过滤指定聊天
chat = message.get("chat", {})
if CHAT_ID and chat.get("id") != int(CHAT_ID):
continue
# 格式化消息,加上发送者信息
user = message.get("from", {}).get("first_name", "")
chat_title = chat.get("title", chat.get("username", "Telegram"))
payload = f"[] : "
send_to_slack(payload)
time.sleep(1)
把脚本中的占位符替换为实际值,运行python telegram_to_slack.py,即可实时将Telegram中的消息推送到Slack。如果想停止,按Ctrl+C。
方案二:Slack消息转发至Telegram
反向消息转发稍显复杂,因为Slack的Incoming Webhook只能进不能出。我们需要借助Slack的Events API来接收消息,然后调用Telegram Bot发送到Telegram。整体架构是:Slack事件 → 公网URL(我们搭建的Flask应用) → Telegram Bot API。
步骤1:创建Slack App并启用Events API
- 在Slack API 创建应用(若已有应用,直接修改)。
- 在左侧“Event Subscriptions”中,启用“Enable Events”,设置Request URL为你的公开HTTPS地址(例如
https://your-domain.com/slack/events),Slack会发送URL验证请求,你必须正确响应。challenge字段的原样返回即可。 - 订阅事件:在“Subscribe to bot events”中添加
message.channels和message.groups(如果要用到私聊,则加message.im),保存。 - 在“Install App”中重新安装,添加Bot到工作区。
步骤2:编写Flask接收脚本
创建slack_to_telegram.py:
from flask import Flask, request, jsonify
import requests
import json
app = Flask(__name__)
# 配置
BOT_TOKEN = "YOUR_TELEGRAM_BOT_TOKEN"
TARGET_CHAT_ID = "YOUR_TELEGRAM_CHAT_ID" # 要发送到的Telegram聊天ID(群组/频道/用户)
@app.route("/slack/events", methods=["POST"])
def slack_events():
data = request.json
# URL验证
if "challenge" in data:
return jsonify({"challenge": data["challenge"]})
# 处理事件
if "event" in data:
event = data["event"]
if event.get("type") == "message" and "subtype" not in event:
text = event.get("text", "")
channel = event.get("channel", "")
user = event.get("user", "")
# 忽略Bot自己的消息
if "bot_id" in event:
return jsonify({"status": "ok"})
# 调用Telegram Bot API发送消息
send_to_telegram(f"[Slack] : ")
return jsonify({"status": "ok"})
def send_to_telegram(text):
url = f"https://api.telegram.org/bot/sendMessage"
payload = {"chat_id": TARGET_CHAT_ID, "text": text}
requests.post(url, data=payload)
if __name__ == "__main__":
app.run(host="0.0.0.0", port=5000, debug=False)
部署这个Flask应用,确保公网可访问(建议使用HTTPS,可以用Cloudflare隧道或Nginx代理)。然后在Slack中发送消息,你会在Telegram的指定聊天中收到通知。
双向桥接的实现思路
如果想要Telegram和Slack完全双向同步,只需同时运行方案一和方案二的脚本,并注意防止消息循环。最简单的做法是:在Telegram转发到Slack时,给消息加上特定前缀或标记,在Slack转发时过滤掉包含该标记的消息。例如,Telegram转发的消息统一加上[Telegram]前缀,Slack转发的消息加上[Slack]前缀,并在接收时丢弃对方发来的标记。你可以很轻松地在代码中增加判断。这种双向桥接适合跨团队协作,让两边人都能在一个平台上发言,另一边同步可见。
优化与安全建议
- 使用Webhook而非轮询:Telegram Bot也支持设置Webhook(
setWebhook),可以将消息直接推送到你的服务器,减少轮询延迟。启用Webhook后,自动禁用getUpdates。 - 保护Webhook端点:Slack的Events API会通过HTTPS发送请求,但为了安全,可设置Token验证(Slack签名机制)。Flask中可使用
slackeventsapi库来简化认证。 - 限制转发范围:如果只需要同步特定群组或频道,在脚本中增加聊天ID过滤,避免所有消息都转发。
- 格式适配:Slack的富文本与Telegram的Markdown不完全兼容,转发时尽量使用纯文本,或通过工具转换为目标平台支持的格式。
总结
通过本文的教程,你可以轻松实现Telegram与Slack之间的消息桥接。无论是单向同步还是双向互通,Webhook都是最简洁、最高效的解决方案。无需购买第三方服务,用几行Python代码即可完成。如果你的团队也面临跨平台消息混乱的问题,不妨立刻动手试试。更多Telegram高级玩法,请持续关注Telegram中文官网的“高级技巧”栏目。