Telegram与GitHub通知绑定全攻略:官方Bot与Actions实战

详细介绍如何将GitHub仓库的动态实时推送到Telegram,通过官方Bot API与GitHub Actions实现自动化通知,涵盖创建Bot、获取Chat ID、编写工作流、自定义消息等完整流程。

阅读提示建议先浏览小标题,再根据需要深入阅读具体段落。

在开发工作流中,及时获取代码仓库的动态至关重要。无论是代码推送、Issue 提交还是 Pull Request 请求,第一时间响应能显著提升协作效率。Telegram 作为一款快速、安全的消息应用,非常适合作为开发者通知的中心枢纽。本文将从零开始,教你如何将 GitHub 仓库的通知实时绑定到 Telegram,利用官方 Bot API 和 GitHub Actions 实现自动化推送。

一、方案概览:为什么选择 Telegram 接收 GitHub 通知

Telegram 拥有极低的消息延迟、强大的 API 支持和跨平台客户端,是接收开发通知的理想选择。而 GitHub 官方提供的 Actions 功能可以让我们在仓库事件发生时自动执行脚本,无需额外搭建服务器即可调用 Telegram Bot 发送消息。相比第三方集成服务,这种方式完全免费、可控性高,且消息内容可自由定制。

二、准备工作:创建 Telegram Bot 与获取 Chat ID

在开始绑定之前,你需要准备好一个 Telegram Bot 和你的个人 Chat ID。整个过程只需几分钟。

  1. 创建 Bot:在 Telegram 中搜索 @BotFather,发送 /newbot,按提示设置 Bot 名称和用户名。完成后你会收到一个 API Token,形如 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11,请妥善保存。
  2. 获取 Chat ID:将你的新 Bot 添加到联系人,然后向它发送任意消息(如 hi)。接着访问 https://api.telegram.org/bot<你的Token>/getUpdates,在返回的 JSON 中查找 chat 对象的 id 字段,那就是你的 Chat ID。如果你希望将通知发送到群组,可将 Bot 拉入群,并把群组 ID 填入。

三、核心实现:通过 GitHub Actions 推送通知到 Telegram

GitHub Actions 是 GitHub 官方提供的持续集成服务,支持托管工作流。我们只需在仓库中创建一个 YAML 文件,即可在特定事件发生时调用 Telegram API。

步骤 1:创建 Workflow 文件

在仓库根目录创建 .github/workflows/telegram-notify.yml 文件,内容如下:

name: Telegram Notification

on:
  push:
    branches:
      - main
  issues:
    types: [opened, closed]
  pull_request:
    types: [opened, closed]

jobs:
  notify:
    runs-on: ubuntu-latest
    steps:
      - name: Send Telegram Message
        run: |
          MESSAGE="🔔 GitHub 事件触发\n仓库: ${{ github.repository }}\n事件: ${{ github.event_name }}\n操作: ${{ github.actor }}"
          curl -s -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
            -d chat_id="${{ secrets.TELEGRAM_CHAT_ID }}" \
            --data-urlencode "text=$MESSAGE"

步骤 2:配置仓库 Secrets

为了避免明文暴露敏感信息,我们将 Token 和 Chat ID 存储为 GitHub Secrets。进入仓库的 SettingsSecrets and variablesActions,点击 New repository secret,分别添加 TELEGRAM_BOT_TOKENTELEGRAM_CHAT_ID

步骤 3:测试运行

推送代码到 main 分支,或在仓库中新建一个 Issue,你会立刻在 Telegram 上收到消息。如果未收到,检查 Actions 执行日志并确认 curl 命令是否成功。

四、进阶玩法:自定义通知内容与过滤条件

基础通知只能告知“有事件发生”,但你可以通过更丰富的语法和条件控制,让通知更加实用。

1. 格式化消息并附带详细信息

使用 github.event 上下文可以提取提交信息、Issue 标题等。例如:

MESSAGE="📦 新提交: ${{ github.event.head_commit.message }}\n提交者: ${{ github.event.head_commit.author.name }}\n仓库: ${{ github.repository }}"

2. 针对不同事件分别处理

你可以为 push、issue、PR 分别创建独立的 job 或使用条件判断,例如只通知特定分支的推送:

if: github.ref == 'refs/heads/main'

3. 使用官方 Action 简化流程

虽然 curl 已足够,但社区封装的 action 如 appleboy/telegram-action 能减少重复代码。在 workflow 中添加:

- name: Telegram notify
  uses: appleboy/telegram-action@master
  with:
    to: ${{ secrets.TELEGRAM_CHAT_ID }}
    token: ${{ secrets.TELEGRAM_BOT_TOKEN }}
    message: |
      自定义消息内容

五、备选方案:通过 Webhook 与轻量服务器手动绑定

如果你希望拥有更灵活的通知逻辑(比如从不同仓库聚合消息),也可以使用 GitHub Webhook 配合自己的服务器。基本思路是:在 GitHub 仓库的 SettingsWebhooks 中添加一个连接到你的服务器地址,服务器收到 POST 请求后调用 Telegram API 发送消息。这里提供一个简单的 Python Flask 示例:

from flask import Flask, request
import requests

app = Flask(__name__)

def send_telegram(message):
    token = "YOUR_BOT_TOKEN"
    chat_id = "YOUR_CHAT_ID"
    url = f"https://api.telegram.org/bot/sendMessage"
    data = {"chat_id": chat_id, "text": message}
    requests.post(url, data=data)

@app.route('/webhook', methods=['POST'])
def webhook():
    data = request.json
    if data.get('action') == 'opened':
        send_telegram(f"🆕 新 Issue: {data['issue']['title']}")
    return "OK"

将脚本部署到服务器或云函数,并在 GitHub 填入对应 URL 即可。这种方法适合需要处理复杂业务逻辑的场景。

六、常见问题与注意事项

  • 消息频率限制:Telegram Bot 有默认的频率限制(约 30 条/秒/chat),正常使用不会触发。如果遇到 429 错误,需加入等待重试逻辑。
  • Token 安全:切勿将 Token 提交到仓库中。务必使用 Secrets 或环境变量。
  • Actions 免费额度:GitHub 对公共仓库免费,私有仓库每月有一定分钟的免费额度,足够个人项目使用。

总结

通过本文,你已经掌握了使用 Telegram 官方 Bot 和 GitHub Actions 绑定通知的完整方法。从创建 Bot 到编写工作流,再到高级自定义,整个过程无需搭建服务器,完全依赖官方服务,安全且免费。这种自动化方式能让你第一时间响应开发动态,将专注力集中于重要事务。未来你还可以结合多个仓库、多频道,打造属于自己的开发者通知中枢。

FAQ

官方客户端下载

常见问题

如何获取 Telegram 的 Chat ID?

有两种常用方法:一是向你的 Bot 发送消息后,访问 https://api.telegram.org/bot<你的Token>/getUpdates,在 JSON 结果中查找 chat.id 字段;二是使用 @userinfobot 等第三方 Bot,直接查看你的个人 ID。若用于群组,需把 Bot 拉入群,并获取群组的 ID。

能否只接收指定分支的推送通知?

可以。在 GitHub Actions 的 push 触发器中,使用 branches 字段指定分支,例如 branches: [main, dev]。如果想精确到子分支,还可以在 job 中添加条件判断,如 if: github.ref == 'refs/heads/main'。

除了推送代码,还能接收哪些 GitHub 事件?

GitHub Actions 支持几乎所有事件,包括 issue、pull_request、fork、star、watch、release 等。你可以在 workflow 的 on 下配置多种事件类型,并在消息中通过 github.event_name 区分后发送不同格式的通知。