Skip to content

DingTalk

DingTalk 統合は今日 通知のみ(発火したアラートを DingTalk グループに プッシュ)です。IM ブリッジの双方向モードは計画中ですが出荷していません。 バリデーターは前方互換のため stream/webhook モードで dingtalk を受け 入れます。

モードステータス
通知サポート。カスタムグループボット、署名付き。
IM ブリッジスキャフォールド存在。本番サポートは延期。

ペイロード

DingTalk のカスタムボットは標準的なテキストメッセージ形式を受け入れます:

json
{
  "msgtype": "text",
  "text": {"content": "[CRITICAL] node-01 swap_high\nswap_in_pages > 1000 for 5m\nsource: alert\ndedupe: alert:swap_high:device=7"}
}

ボディ自体は未署名です。DingTalk は代わりに URL クエリパラメータでリクエスト を認証します —— 署名 を参照。

これは Feishu と WeCom 送信者が使うのと同じフラットテキストフォーマッタで、 formatText が生成します。

署名

カスタムボットが 加签 (signed) をオンにしていると、DingTalk はリクエスト が timestampsign の URL クエリパラメータを持つことを要求します:

text
timestamp    = milliseconds since epoch
stringToSign = timestamp + "\n" + secret
sign         = base64(HMAC-SHA256(key=secret, message=stringToSign))

署名キーは secret のみ(Feishu と異なり、Feishu では secret が string-to-sign の一部)。 signDingTalkURL ヘルパーが両方のクエリパラメータを付加します:

text
POST https://oapi.dingtalk.com/robot/send?access_token=…&timestamp=1717012345000&sign=…

ボディはプレーン JSON のままです。署名済み URL + ボディが DingTalk の 認証対象です。

ミリ秒タイムスタンプを使ってください

DingTalk の署名は秒ではなく ミリ秒 を期待します。署名者は time.Now().UnixMilli() を使います。秒精度のタイムスタンプだと 310000「sign invalid」レスポンスが返ります。

セットアップ

  1. 対象 DingTalk グループで → 群设置 → 智能群助手 → 添加机器人 → 自定义。名前とアバターを設定。
  2. 安全设置 → 加签 を選んで secret をコピー(IP allowlist や keyword filter を代わりに選んでも構いません。Ongrid 送信者はどれもサポート しますが、署名モード推奨)。
  3. webhook URL をコピー —— こんな感じ: https://oapi.dingtalk.com/robot/send?access_token=<token>
  4. Ongrid で:Settings → Channels → New → Provider = dingtalk → Endpoint = webhook URL → Secret = ステップ 2 の署名 secret (keyword または IP allowlist モードを選んだ場合はスキップ)。

テストメッセージはグループの「安全」ルールに合致する必要あり

keyword filter を選んだなら、テストメッセージボディはそのキーワードを 含む必要があります。さもなくば DingTalk が拒否します。Ongrid のデフォルト テストメッセージは [INFO] Ongrid test です。マッチするキーワード (Ongrid で動きます)を設定するか、署名モードを選んでください。

クセ

at はサポートされていない

現在の送信者は純粋な msgtype: text を出荷します。特定ユーザーへの メンション(atMobiles / atUserIds / isAtAll)はまだペイロード ビルダーに入っていません。今日それが必要なら 汎用 webhook 経由で追加してください。ネイティブサポートは将来のエンハンスメントです。

4xx でのリトライは意図的

DingTalk はプロトコルレベルの失敗(署名ミスマッチ、メッセージ長すぎ、 ボットのレート制限)でも HTTP 200 を返し、JSON ボディに errcode を 入れます。送信者は 2xx を成功として扱い、非 2xx の HTTP ステータスコード のみを表面化します。ボットがサイレントに配信を停止したら、manager ログで dingtalk: send_text: code=… を確認してください —— Feishu と DingTalk は 「200 OK + ボディに errcode」の同じパターンを共有します。

DingTalk メッセージのレート制限

DingTalk はカスタムボットメッセージをボットあたり毎分 20 件にキャップ します。アラートパイプラインのダンピング(dedupe key ごとデフォルト 5 分)は通常これより十分下に収まりますが、高カーディナリティクラスタ ではより高いダンピングウィンドウかルールごとのチャネルルーティングが 必要かもしれません。

Feishu との比較

観点DingTalkFeishu
署名クエリ / ボディURL クエリ(timestampsignボディフィールド(timestampsign
タイムスタンプ単位ミリ秒
署名キーsecrettimestamp + "\n" + secret
HMAC アルゴリズムSHA-256SHA-256
空ボディ署名いいえ(sign は stringToSign 対象)はい(HMAC メッセージが空)

表面的に似た 2 つのプロトコル、3 つの実際の違い。まさにこの理由で、別個の Sender として存在します。

関連

  • Webhook —— Ongrid がネイティブに話さない プロトコル用(Wecom Mass app、Microsoft Teams、Mattermost、Rocket Chat、OpsGenie、PagerDuty…)。
  • チャネル概要 —— 各 Sender が消費する 統一された notify.Message の形。