Skip to content

DingTalk

DingTalk-Integration ist heute nur-Benachrichtigung (gefeuerte Alarme in eine DingTalk-Gruppe pushen). Der IM-Bridge-Zweiseitig-Modus ist geplant, aber nicht ausgeliefert; der Validator akzeptiert dingtalk in Stream-/Webhook-Mode für Vorwärtskompatibilität.

ModusStatus
NotificationUnterstützt. Custom Group Bot, signiert.
IM bridgeScaffold vorhanden; produktive Unterstützung aufgeschoben.

Payload

DingTalks Custom Bot akzeptiert die Standard-Text-Message-Form:

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

Der Body selbst ist unsigniert. DingTalk authentifiziert die Anfrage stattdessen über URL-Query-Parameter — siehe Signatur.

Das ist derselbe Flat-Text-Formatter, den die Feishu- und WeCom-Sender verwenden, produziert von formatText.

Signatur

Wenn der Custom Bot 加签 (signiert) eingeschaltet hat, erfordert DingTalk, dass die Anfrage einen timestamp- und einen sign-URL-Query-Parameter trägt:

text
timestamp    = Millisekunden seit Epoch
stringToSign = timestamp + "\n" + secret
sign         = base64(HMAC-SHA256(key=secret, message=stringToSign))

Der Signaturschlüssel ist nur das Secret (anders als Feishu, wo das Secret Teil des String-to-Sign ist). Der signDingTalkURL-Helper hängt beide Query-Parameter an:

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

Der Body bleibt reines JSON. Die signierte URL plus der Body ist, gegen was DingTalk authentifiziert.

Millisekunden-Zeitstempel verwenden

DingTalks Signatur erwartet Millisekunden, keine Sekunden. Der Signer verwendet time.Now().UnixMilli(). Ein Zeitstempel mit Sekundengenauigkeit gibt eine 310000 „sign invalid"-Antwort.

Setup

  1. In der Ziel-DingTalk-Gruppe → 群设置 → 智能群助手 → 添加机器人 → 自定义. Geben Sie ihm einen Namen und ein Avatar.
  2. 安全设置 → 加签 wählen und das Secret kopieren. (Sie können auch stattdessen IP-Allowlist oder Keyword-Filter wählen; der Ongrid-Sender unterstützt jeden davon, aber signierter Modus wird empfohlen.)
  3. Die Webhook-URL kopieren — sieht aus wie https://oapi.dingtalk.com/robot/send?access_token=<token>.
  4. In Ongrid: Settings → Channels → New → Provider = dingtalk → Endpoint = die Webhook-URL → Secret = das Signatur-Secret aus Schritt 2 (überspringen, wenn Sie Keyword- oder IP-Allowlist-Modus gewählt haben).

Test-Nachricht muss zur „Safety"-Regel der Gruppe passen

Wenn Sie Keyword-Filter gewählt haben, MUSS der Test-Nachrichtenbody dieses Keyword enthalten, sonst lehnt DingTalk ihn ab. Die Default-Ongrid-Test-Nachricht ist [INFO] Ongrid test. Konfigurieren Sie entweder ein passendes Keyword (Ongrid funktioniert) oder wählen Sie den signierten Modus.

Eigenheiten

at wird nicht unterstützt

Der aktuelle Sender liefert reines msgtype: text. Einen spezifischen Benutzer zu erwähnen (atMobiles / atUserIds / isAtAll) ist im Payload-Builder noch nicht. Fügen Sie es via generischen Webhook hinzu, wenn Sie es heute brauchen; native Unterstützung ist eine zukünftige Erweiterung.

Retry auf 4xx ist beabsichtigt

DingTalk gibt HTTP 200 auch für protokoll-level Fehler zurück (Signatur-Mismatch, Nachricht zu lang, Bot rate-limited), mit einem errcode im JSON-Body. Der Sender behandelt jeden 2xx als Erfolg und zeigt nur Nicht-2xx-HTTP-Status-Codes. Wenn der Bot stillschweigend aufhört zu liefern, prüfen Sie das Manager-Log nach dingtalk: send_text: code=… — Feishu und DingTalk teilen das gleiche Muster von „200 OK + errcode im Body".

DingTalk-Message-Rate-Limit

DingTalk cappt Custom-Bot-Messages bei 20 pro Minute pro Bot. Die Dämpfung der Alarmpipeline (Default 5m pro Dedupe-Key) bleibt normalerweise deutlich darunter; High-Cardinality-Cluster könnten ein höheres Dämpfungsfenster oder Per-Regel-Channel-Routing brauchen.

Vergleich mit Feishu

AspektDingTalkFeishu
Signiert Query / BodyURL-Query (timestamp, sign)Body-Felder (timestamp, sign)
Zeitstempel-EinheitMillisekundenSekunden
Signaturschlüsselsecrettimestamp + "\n" + secret
HMAC-AlgorithmusSHA-256SHA-256
Leerer Body signiertNein (Sign ist über stringToSign)Ja (HMAC-Message ist leer)

Zwei oberflächlich ähnliche Protokolle, drei reale Unterschiede. Sie existieren genau aus diesem Grund in separaten Sendern.

Verwandt

  • Webhook — für Protokolle, die Ongrid nicht nativ spricht (Wecom Mass App, Microsoft Teams, Mattermost, Rocket Chat, OpsGenie, PagerDuty…).
  • Kanäle-Übersicht — die einheitliche notify.Message-Form, die jeder Sender konsumiert.