Files
ts-scripts/libraries/deno-dingtalk-mod.ts
2025-01-19 09:48:56 +08:00

96 lines
2.7 KiB
TypeScript

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<string>;
atUserIds?: Array<string>;
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 += "&timestamp=" + 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}`;
}
}