import { hmac } from "https://deno.land/x/hmac@v2.0.1/mod.ts"; // deno-lint-ignore no-explicit-any async function postHttpJson(url: string, body: any) { const resp = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify(body), }); if (resp.status !== 200) { console.error("Send HTTP POST failed", resp); throw `Send HTTP POST to: ${url}, failed: ${resp.status}`; } return resp; } const BASE_DING_TALK_URL = "https://oapi.dingtalk.com/robot/send"; export interface SendDingTalkMessageOptions { base_url?: string; access_token: string; sec_token?: string; } export interface DingTalkMessageAt { atMobiles?: Array; atUserIds?: Array; isAtAll?: boolean; } export interface DingTalkTextMessage { content: string; at?: DingTalkMessageAt; } export interface DingTalkMarkdownMessage { title?: string; content: string; at?: DingTalkMessageAt; } export async function sendDingTalkTextMessage( message: DingTalkTextMessage, options: SendDingTalkMessageOptions, ) { return await sendDingTalkMessage({ msgtype: "text", text: { content: message.content, }, }, options); } export async function sendDingTalkMarkdownMessage( message: DingTalkMarkdownMessage, options: SendDingTalkMessageOptions, ) { return await sendDingTalkMessage({ msgtype: "markdown", markdown: { title: message.title || "untitled", text: message.content, }, }, options); } export async function sendDingTalkMessage( // deno-lint-ignore no-explicit-any message: any, options: SendDingTalkMessageOptions, ) { let send_url = options.base_url || BASE_DING_TALK_URL; send_url += "?access_token=" + encodeURIComponent(options.access_token); if (options.sec_token) { const timestamp = new Date().getTime(); const timestamp_and_secret = `${timestamp}\n${options.sec_token}`; const sec_token_sign = hmac( "sha256", options.sec_token, timestamp_and_secret, "utf8", "base64", ) as string; send_url += "×tamp=" + timestamp; send_url += "&sign=" + encodeURIComponent(sec_token_sign); } const resp = await postHttpJson(send_url, message); const send_ding_talk_resp_body = await resp.json(); if (send_ding_talk_resp_body.errcode !== 0) { console.error("Send DingTalk message failed", send_ding_talk_resp_body); throw `Send DingTalk message failed: ${send_ding_talk_resp_body.errcode}`; } }