Skip to content

DingTalk

DingTalk 통합은 오늘 알림 전용 입니다 (DingTalk 그룹으로 발화된 알림 push). IM 브릿지 양방향 모드는 계획되어 있지만 출하되지 않음; validator 는 향후 호환을 위해 stream/webhook 모드에서 dingtalk 를 수락합니다.

ModeStatus
알림지원됨. 커스텀 그룹 봇, 서명됨.
IM 브릿지스캐폴드 존재; 프로덕션 지원 보류.

Payload

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"}
}

body 자체는 서명되지 않음. DingTalk 은 대신 URL 쿼리 파라미터로 요청을 인증합니다 — 서명 참고.

이것은 Feishu 와 WeCom sender 가 사용하는 같은 flat-text 포매터이며, formatText 가 생성합니다.

서명

커스텀 봇에 加签 (signed) 가 켜져 있으면 DingTalk 은 요청에 timestampsign URL 쿼리 파라미터를 요구합니다.

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

서명 키는 시크릿 단독 (Feishu 와 다름 — Feishu 는 시크릿이 string-to-sign 의 일부). signDingTalkURL 헬퍼는 두 쿼리 파라미터를 모두 추가:

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

body 는 plain JSON 으로 유지. 서명된 URL + body 가 DingTalk 이 인증하는 대상.

밀리초 timestamp 사용

DingTalk 서명은 초가 아닌 밀리초 를 기대합니다. signer 는 time.Now().UnixMilli() 를 사용. 초 정밀도 timestamp 는 310000 "sign invalid" 응답을 줍니다.

설정

  1. 대상 DingTalk 그룹에서 → 群设置 → 智能群助手 → 添加机器人 → 自定义. 이름과 아바타 부여.
  2. 安全设置 → 加签 선택, 시크릿 복사. (IP 화이트리스트 또는 키워드 필터를 대신 선택할 수도 있음; Ongrid sender 는 어느 것이든 지원하나 서명 모드 권장.)
  3. webhook URL 복사 — 다음과 같이 생김: https://oapi.dingtalk.com/robot/send?access_token=<token>.
  4. Ongrid 에서: Settings → Channels → New → Provider = dingtalk → Endpoint = webhook URL → Secret = 2 단계의 서명 시크릿 (키워드 또는 IP 화이트리스트 모드를 선택했다면 건너뜀).

테스트 메시지는 그룹의 "안전" 규칙과 일치해야 함

키워드 필터를 선택했다면 테스트 메시지 body 가 반드시 그 키워드를 포함해야 합니다. 아니면 DingTalk 이 거부. 기본 Ongrid 테스트 메시지는 [INFO] Ongrid test. 일치하는 키워드 (Ongrid 가 동작) 를 구성하거나 서명 모드를 선택하세요.

특이점

at 미지원

현재 sender 는 순수 msgtype: text 만 출하. 특정 사용자 멘션 (atMobiles / atUserIds / isAtAll) 은 아직 payload 빌더에 없음. 오늘 필요하다면 일반 webhook 을 사용; 네이티브 지원은 향후 개선 사항.

4xx 에서의 재시도는 의도적

DingTalk 은 프로토콜 레벨 실패 (서명 불일치, 메시지 너무 김, 봇 rate-limit) 에도 HTTP 200 을 반환하며 JSON body 에 errcode 가 들어 있습니다. sender 는 모든 2xx 를 성공으로 취급하고 non-2xx HTTP 상태 코드만 표면화합니다. 봇이 조용히 전달을 멈추면 매니저 로그에서 dingtalk: send_text: code=… 를 확인하세요 — Feishu 와 DingTalk 은 "200 OK + body 의 errcode" 패턴을 공유합니다.

DingTalk 메시지 rate-limit

DingTalk 은 커스텀 봇 메시지를 봇당 분당 20 으로 제한합니다. 알림 파이프라인의 댐핑 (dedupe 키당 기본 5 분) 은 대개 이 아래에 있지만, 고-카디널리티 클러스터는 더 높은 댐핑 윈도우 또는 규칙별 채널 라우팅이 필요할 수 있습니다.

Feishu 와의 비교

AspectDingTalkFeishu
서명 쿼리 / bodyURL 쿼리 (timestamp, sign)Body 필드 (timestamp, sign)
Timestamp 단위밀리초
서명 키secrettimestamp + "\n" + secret
HMAC 알고리즘SHA-256SHA-256
빈 body 서명아니오 (sign 은 stringToSign 위)예 (HMAC 메시지는 비어 있음)

표면적으로 비슷한 두 프로토콜, 세 가지 실제 차이. 정확히 이 이유로 별도 Sender 에 존재합니다.

관련

  • Webhook — Ongrid 가 네이티브로 말하지 않는 프로토콜용 (Wecom Mass app, Microsoft Teams, Mattermost, Rocket Chat, OpsGenie, PagerDuty…).
  • 채널 개요 — 모든 Sender 가 소비하는 통일된 notify.Message 형태.