--- title: 使用自己的 Telegram Bot 來接收 GitHub 通知 tags: Telegram, GitHub, Bot --- # 筆記:使用自己的 Telegram Bot 來接收 GitHub 的 Event Integration ## 前言 Telegram 上本來就有些公開的 Bot 供大家使用,通常是加入 Bot 好友後會獲得一組 WebHook,輸入專案並設定要通知的項目就可以使用。 既然如此,為什麼要自己弄一隻 Bot 呢?比較明顯的理由之一就是,非官方提供的服務的信任度,畢竟牽扯到原始碼的通知可能會有一些你不想讓別人看到的東西(即使 GitHub 上的東西大多數是公開的);之二則是自己來能夠有一些更彈性的地方,比如說客製化的通知內容。當然你也可以像我一樣,就是單純很想自己動手做做看(笑)。 ## 參考資料 > Telegram Bot API : [Doc](https://core.telegram.org/bots/api) > GitHub Action : [Doc](https://docs.github.com/en/actions) > [appleboy/telegram-action](https://github.com/appleboy/telegram-action) ## 需求 1. Telegram 帳號 2. GitHub 帳號 :::info 不需要準備伺服器或域名,是我覺得讓這件事的門檻大大降低的要素之一。 :smiley: ::: ## 設定流程 ### 準備 Telegram Bot 1. 在 Telegram 搜尋 BotFather([@botFather](https://t.me/botFather)) 並加入好友。 2. 在對話框中輸入 `/start` 啟動與 BotFather 的對話,然後輸入`/newbot` 來啟動產生一個自己的 bot 的流程,接下來會在互動中讓你輸入以下資訊: - Bot 的名稱,可以是隨意的字串。之後可以再變更。 - Bot 的 username,英數底線,必須以 bot 結尾。 :::info 在產生完 bot 之後,可以在跟 BotFather 的對話中輸入 `/mybots` 來確認自己有幾個 bot,也可以在這邊編輯 bot 的詳細資訊及更換 bot 的頭像。 更換 bot 頭像的時候,不能以檔案形式傳送圖片,一定要用傳照片的方法。 ::: 3. 產生完 Bot 後,BotFather 會告訴你加入 Bot 好友的連結(當然你也可以用自己剛剛設定的 username 把 Bot 加入好友)以及這個 Bot 的 Token。 :::info 請小心保管這組 Token,因為任何人都可以用這組 Token 透過 API 來控制你的 Bot。 ::: 4. 在你與你的 Bot 的對話框,或你把 Bot 加入、打算用來接收通知的群組發一個任意的訊息。 :::info 如果你沒有發這個訊息,下一步就會找不到 id! ::: 5. 使用以下的指令來獲得聊天室的 ID: ```bash curl https://api.telegram.org/bot${TOKEN}/getUpdates ``` :::info 請注意在域名後面的字串,必須先接`bot`三個字,後面緊跟自己的 TOKEN! ::: 應該會獲得以下結構的回應,需要記住的部分為`result.message.from.id`: ```json { "ok":true, "result": [ { "update_id":數字, "message": { "message_id":數字, "from": { "id":數字, "is_bot":布林, "first_name":你設定的名字, "last_name":你設定的姓氏, "username":你自己的 username, "language_code":你使用的語言設定 }, "chat": { "id":跟上面的 from.id 一樣的數字, "first_name":同 from, "last_name":同 from, "username":同 from, "type":"private"}, "date":數字格式的日期資料, "text":你發送的內容 } } ] } ``` 若你得到的 `ok` 為 ` false`,可能是 TOKEN 前面忘了加 bot 導致沒有正確查到你的 bot,或是你還沒有發訊息給 bot ,查不到你們的對話內容。 ### GitHub 設定 1. 打開你想要設定通知的 repository 的頁面,打開 `Settings` -> `Security/Secrets` -> `Actions`。 2. 按下右上角的 `New repository secret`,在 `Name` 的地方輸入變數名稱、`Value` 的地方輸入剛剛取得的 Token 及 ID。以下假設變數名稱分別為 `TOKEN` 跟 `ID` ### Action YML 檔案設定 1. 在你的 repository 的根目錄新增以下的目錄: `/.github/workflows/`。 :::info 小心不要漏掉 `workflows` 最後面的 s! ::: 2. 在 `/.github/workflows/` 裡面新增一個 `.yml` 檔。 :::info 檔名沒有一定要取什麼,目前我測試用不同英文字串當檔名都讀得到。 一個 repository 的 `/.github/workflows/` 中可以有複數個 `.yml` 檔,並且都會被套用。 ::: 3. 在檔案中輸入以下內容(可根據自己的需要改寫): ```yml # 幫這個 action 取個名字,會在 action 頁面的左側顯示 name: Telegram Notification Push # 要在什麼時候觸發,實測只設定 push 沒有限定更細的 type 或條件時, # 新增 tag、設定 release 等活動都會觸發 on: push # 設定 job 的內容 jobs: bulid: # 被觸發後,點進上面的名稱後,這邊的名稱會顯示在流程頁面中 name: Build # action 執行的環境 runs-on: ubuntu-latest steps: # 再點入上面的流程看詳細執行狀況時,會顯示下面的名字 - name: send message on push # 使用這個專案已經寫好的 action uses: appleboy/telegram-action@master with: # 將剛剛拿到的參數帶入,讓流程能夠正確將訊息發到指定的聊天室 to: ${{ secrets.ID }} token: ${{ secrets.TOKEN }} # 設定要發出的訊息格式,以下是參考原始 repo 後稍微改寫的設定 # github.actor: 觸發 event 的使用者名稱 # github.sha: commit 的 hash 值 # github.event.commits[0].message: commit message # github.repository: repository 的名稱 message: | ${{ github.actor }} created commit: Commit message: ${{ github.event.commits[0].message }} Repository: ${{ github.repository }} https://github.com/${{ github.repository }}/commit/${{github.sha}} ``` 4. 將以上檔案 `git add` 加入 repository,commit 後 `git push` 到 GitHub。如果 `/.github/workflows/*.yml` 存在,且被觸發(比如設定了 `on: push` 之後 push 了),就可以在 repository 的 `Action` 頁面查看執行狀況。若是正確執行,會顯示執行的流程及時間;若有任何錯誤導致執行失敗,也會顯示一些錯誤訊息。 #### 關於 Workflow 中的輸入輸出 最近 GitHub Action 更新了輸出的方式,要將 run 過的參數傳給下個 step ,用以下的方法來設定輸出的 name 跟 value: ```bash= # 單行時的輸出 echo "name=value" >> $GITHUB_OUTPUT # 複數行的輸出 echo "name<<EOF" >> $GITHUB_OUTPUT echo "line1" echo "line2" echo "EOF" >> $GITHUB_OUTPUT ```