82 lines
2.6 KiB
TypeScript
82 lines
2.6 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);
|
|
}
|
|
|
|
// deno-lint-ignore no-explicit-any
|
|
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") 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}`;
|
|
}
|
|
}
|
|
|