透過釘釘群組自訂機器人(Webhook)將告警推送到釘釘群組,新手可依步驟逐步完成設定。

概述

釘釘群組機器人通知媒介,用來把夜鶯產生的告警事件透過釘釘群組自訂機器人(Webhook)推送到指定的釘釘群組。

  • 適用情境:希望告警以 Markdown 訊息形式發送到釘釘群組,並支援 @ 指定成員。
  • 你需要準備:一個釘釘群組,以及對該群組擁有「新增機器人」權限。
  • 整個設定分三步:①在釘釘群組裡新增機器人 → ②在夜鶯新建釘釘通知媒介 → ③在通知規則裡填入 access_token

如果你已熟悉釘釘開放平台的「企業內部應用」機制,並且需要把告警發送到單聊或支援告警截圖,請參考 釘釘應用。本文只介紹最常用、最簡單的群組機器人方式。

第一步:在釘釘群組裡新增自訂機器人

  1. 在目標釘釘群組中:群組設定 → 智慧群組助手 → 新增機器人 → 自訂(自訂機器人)

  2. 設定機器人名稱(例如 夜鶯告警)和頭像,點擊「下一步」。

  3. 安全設定(至少選一種,建議「自訂關鍵字」,夜鶯目前只支援這兩種):

    方式 說明 適用情境
    自訂關鍵字 機器人只接受包含指定關鍵字的訊息,最多 10 個 建議,最簡單。建議填寫告警規則名稱裡一定會出現的字,例如 告警n9e
    IP 白名單 只接受指定 IP 區段發來的請求 適合部署在固定公網出口的情境
  4. 勾選「我已閱讀並同意《機器人服務及免責條款》」,點擊「完成」。

  5. 在彈出的頁面中複製 Webhook 位址,格式如:

    https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    

    其中 access_token= 後面那一串就是後面在夜鶯裡要填的 Access Token,請先保存好。

釘釘官方限制:單個機器人每分鐘最多發送 20 條訊息,超過會被限流。如果告警量非常大,建議把告警拆分到多個群組/多個機器人,或在通知規則裡設定合理的收斂策略。

第二步:在夜鶯新建釘釘通知媒介

  1. 登入夜鶯 → 左側選單 通知 → 通知媒介,進入通知媒介列表頁。

  2. 在左側媒介類型面板中點擊 釘釘,進入新建頁(對應 URL /notification-channels/add?ident=dingtalk)。

    通知媒介入口

  3. 填寫基礎資訊並儲存,絕大多數欄位系統已經預先填好,只需要修改「名稱」:

    釘釘通知媒介表單

    區塊 欄位 是否需要修改 說明
    基礎設定 名稱 需要 例如 釘釘群組機器人,在通知規則裡選擇媒介時看到的就是這個名稱
    基礎設定 啟用 保持開啟 關閉後該媒介不會被發送
    變數設定 聯絡方式 可不填 用於 @ 指定使用者,選擇後會把使用者的「手機號」注入訊息內容(需要先在「使用者管理」裡為使用者設定手機號)
    變數設定 參數設定 保持預設,不要刪除 已預先設定 access_tokenbot_name 兩個參數,真正的 Token 在第三步的通知規則裡填寫
    HTTP 設定 URL 保持預設 https://oapi.dingtalk.com/robot/send
    HTTP 設定 請求方法 POST 釘釘 Webhook 只接受 POST
    HTTP 設定 請求標頭 Content-Type: application/json 預設已填好
  4. 繼續往下可以看到「請求參數」和「請求內容」,這兩段是釘釘發送的核心邏輯,保持預設即可

    HTTP 設定和請求內容

    • 請求參數 裡預先設定了 access_token = {{$params.access_token}},表示真正的 Token 來自於通知規則裡填寫的 access_token 參數;

    • 請求內容 已預先設定為釘釘 Markdown 訊息格式:

      {
        "msgtype": "markdown",
        "markdown": {
          "title": "{{$tpl.title}}",
          "text": "{{$tpl.content}}\n{{batchContactsAts $sendtos}}"
        },
        "at": {
          "atMobiles": {{batchContactsJsonMarshal $sendtos}}
        }
      }
      

      其中 {{$tpl.title}}{{$tpl.content}} 來自於名為 Dingtalk 的訊息範本,{{$sendtos}} 則是需要 @ 的聯絡方式列表(一般是手機號)。

  5. 點擊左下角 儲存,一條類型為「釘釘」的通知媒介就建好了。

說明:夜鶯 v8 已不再像舊版那樣把 Token 存在媒介本身,同一個釘釘媒介可以被多個群組/多個機器人重複使用,每條通知規則填自己的 access_token 即可。

第三步:在通知規則裡填入 access_token

釘釘機器人 Webhook 位址裡的 access_token 那一段,要在通知規則裡填寫:

  1. 左側選單 通知 → 通知規則 → 新增(或編輯既有規則)。

  2. 在「通知設定」區塊:

    通知規則中填寫 Access Token

    • 通知媒介:選擇你剛剛建立的釘釘媒介;
    • 訊息範本:選擇 Dingtalk(系統內建,若沒有,請到「訊息範本」裡匯入預設範本);
    • Access Token:貼上第一步從釘釘取得的 Token(只填 access_token= 後面那一串,不要帶 URL);
    • Bot Name:選填,填一個方便自己辨識的名稱,例如 夜鶯監控
    • 適用級別 / 適用時段 / 適用標籤:依需求過濾要推送的事件。
  3. 儲存後,點擊「通知測試」即可發送一條測試訊息,正常情況下釘釘群組會立即收到一條 Markdown 告警。

一個釘釘媒介 + 多個機器人

如果不同業務線希望推送到不同群組,不需要新建媒介,只要在「通知規則」裡新增一條規則、填入不同的 access_token 即可。

常見問題

Q1:提示「keywords not in content」(關鍵字不符)?

A:釘釘機器人啟用了「自訂關鍵字」安全策略,但告警標題/內容裡沒有出現任一關鍵字。解法:把你設定的關鍵字放到告警規則名稱裡,或在釘釘機器人裡新增更寬鬆的關鍵字(例如 告警)。

Q2:提示「sign not match」(簽章錯誤)?

A:釘釘機器人選擇了「加簽」模式,而夜鶯預設不帶 sign/timestamp 參數。建議改用「自訂關鍵字」方式;如果一定要使用加簽,請在通知規則的 access_token 裡直接填完整帶簽章的 URL(格式為 https://oapi.dingtalk.com/robot/send?access_token=xxx&timestamp=yyy&sign=zzz),或在夜鶯的訊息範本中手動拼接簽章(進階用法)。

Q3:收到訊息但 @ 沒生效?

A:釘釘只會根據訊息裡 atMobiles手機號判斷是否 @,且該手機號必須是群組成員。請在夜鶯「使用者管理」裡為相關使用者設定好手機號,並在通知媒介的「變數設定 → 聯絡方式」中選擇對應的使用者欄位。

Q4:訊息太多被限流?

A:釘釘官方限制單機器人 20 條/分鐘。建議:

  • 啟用告警收斂/告警聚合;
  • 依業務拆分到多個群組;
  • 僅把一級/二級告警發到釘釘,三級告警改用電子郵件等非同步管道。

Q5:可以直接在 access_token 欄位裡填完整 URL 嗎?

A:可以。系統對 access_token 的取值做了相容處理——如果填寫的值以 http://https:// 開頭,會當作完整 Webhook 位址直接發送;否則會拼接為 https://oapi.dingtalk.com/robot/send?access_token=<你填的值>

參考資料

快猫星云 联系方式 快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云 联系方式
快猫星云