import { hmac } from "https://deno.land/x/hmac@v2.0.1/mod.ts"; 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(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"); 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}`; } }