mirror of https://github.com/certd/certd
perf: 支持飞书通知
parent
74c6a2266f
commit
b82e1dcd62
|
@ -119,7 +119,7 @@ export abstract class BaseNotification implements INotification {
|
|||
}
|
||||
|
||||
async onTestRequest() {
|
||||
await this.doSend({
|
||||
return await this.doSend({
|
||||
userId: 0,
|
||||
title: "【Certd】测试通知【*.foo.com】,标题长度测试、测试、测试",
|
||||
content: "测试通知,*.foo.com",
|
||||
|
|
|
@ -60,6 +60,9 @@ const doTest = async () => {
|
|||
}
|
||||
);
|
||||
message.value = "测试请求成功";
|
||||
if (res) {
|
||||
message.value += `,返回:${JSON.stringify(res)}`;
|
||||
}
|
||||
} finally {
|
||||
loading.value = false;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,137 @@
|
|||
import { BaseNotification, IsNotification, NotificationBody, NotificationInput } from "@certd/pipeline";
|
||||
|
||||
@IsNotification({
|
||||
name: 'feishu',
|
||||
title: '飞书通知',
|
||||
desc: '飞书群聊webhook通知',
|
||||
needPlus: true,
|
||||
})
|
||||
// https://open.dingtalk.com/document/orgapp/the-creation-and-installation-of-the-application-robot-in-the?spm=ding_open_doc.document.0.0.242d1563cDgZz3
|
||||
export class DingTalkNotification extends BaseNotification {
|
||||
@NotificationInput({
|
||||
title: 'webhook地址',
|
||||
component: {
|
||||
placeholder: 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxxxxxxxxxxxxx',
|
||||
},
|
||||
helper: '飞书APP->群聊->设置->机器人->添加机器人->自定义webhook->[创建机器人->复制webhook地址](https://open.feishu.cn/document/client-docs/bot-v3/add-custom-bot?lang=zh-CN)',
|
||||
required: true,
|
||||
})
|
||||
webhook = '';
|
||||
|
||||
@NotificationInput({
|
||||
title: '加签密钥',
|
||||
component: {
|
||||
placeholder: 'SECxxxxxxxxxxxxxxxxxxxxx',
|
||||
},
|
||||
helper: '必须选择一种安全设置,建议选择加密密钥',
|
||||
required: false,
|
||||
})
|
||||
secret = '';
|
||||
|
||||
|
||||
@NotificationInput({
|
||||
title: '@用户',
|
||||
component: {
|
||||
placeholder: '非必填,支持多个,填写完一个按回车',
|
||||
name: 'a-select',
|
||||
vModel: 'value',
|
||||
mode: 'tags',
|
||||
multiple: true,
|
||||
open: false,
|
||||
},
|
||||
helper: '填写要@的用户ID:【ou_xxxxxxxxx】\n用户ID获取方法,[查看OpenId获取方法](https://open.feishu.cn/document/home/user-identity-introduction/open-id)',
|
||||
required: false,
|
||||
})
|
||||
atUserIds:string[];
|
||||
|
||||
|
||||
@NotificationInput({
|
||||
title: '@all',
|
||||
component: {
|
||||
placeholder: '非必填',
|
||||
name: 'a-switch',
|
||||
vModel:"checked"
|
||||
},
|
||||
helper: '是否@所有人',
|
||||
required: false,
|
||||
})
|
||||
isAtAll:boolean;
|
||||
|
||||
|
||||
async sign(){
|
||||
const crypto = await import('crypto');
|
||||
const secret = this.secret;
|
||||
const timestamp = Math.floor(Date.now() / 1000);
|
||||
const str = Buffer.from(`${timestamp}\n${secret}`, 'utf8');
|
||||
const sign = crypto.createHmac('SHA256', str);
|
||||
sign.update(Buffer.alloc(0));
|
||||
return { timestamp, sign: sign.digest('base64') };
|
||||
}
|
||||
|
||||
async send(body: NotificationBody) {
|
||||
if (!this.webhook) {
|
||||
throw new Error('webhook地址不能为空');
|
||||
}
|
||||
/**
|
||||
*
|
||||
* "msgtype": "text",
|
||||
* "text": {
|
||||
* "content": "hello world"
|
||||
* }
|
||||
* }
|
||||
*/
|
||||
|
||||
let webhook = this.webhook;
|
||||
|
||||
|
||||
/*
|
||||
// @ 单个用户
|
||||
<at user_id="ou_xxx">名字</at>
|
||||
// @ 所有人
|
||||
<at user_id="all">所有人</at>
|
||||
*/
|
||||
let atText = ""
|
||||
if(this.atUserIds && this.atUserIds.length>0){
|
||||
atText = this.atUserIds.map((id:string)=>{
|
||||
const nameIndex = id.indexOf(".");
|
||||
let name = id
|
||||
if(nameIndex>0){
|
||||
name = id.substring(nameIndex+1)
|
||||
}
|
||||
return `<at user_id="${id}">${name}</at>`
|
||||
}).join("");
|
||||
}
|
||||
if(this.isAtAll){
|
||||
atText = `<at user_id="all">所有人</at>`
|
||||
}
|
||||
|
||||
if (atText){
|
||||
atText = `\n· ${atText}`
|
||||
}
|
||||
|
||||
let sign:any = {}
|
||||
if(this.secret){
|
||||
const signRet = await this.sign();
|
||||
sign = {
|
||||
timestamp: signRet.timestamp,
|
||||
sign: signRet.sign
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
const res = await this.http.request({
|
||||
url: webhook,
|
||||
method: 'POST',
|
||||
data: {
|
||||
...sign,
|
||||
content: {
|
||||
text: `· ${body.title}\n· ${body.content}\n· 查看详情: ${body.url}${atText}`,
|
||||
},
|
||||
msg_type:"text"
|
||||
},
|
||||
});
|
||||
if(res.code>100){
|
||||
throw new Error(`发送失败:${res.msg}`);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -9,3 +9,4 @@ export * from './telegram/index.js';
|
|||
export * from './discord/index.js';
|
||||
export * from './slack/index.js';
|
||||
export * from './bark/index.js';
|
||||
export * from './feishu/index.js';
|
||||
|
|
|
@ -148,7 +148,7 @@ export class WebhookNotification extends BaseNotification {
|
|||
}
|
||||
|
||||
try {
|
||||
await this.http.request({
|
||||
const res = await this.http.request({
|
||||
url: url,
|
||||
method: this.method,
|
||||
headers: {
|
||||
|
@ -158,6 +158,7 @@ export class WebhookNotification extends BaseNotification {
|
|||
data: data,
|
||||
skipSslVerify: this.skipSslVerify,
|
||||
});
|
||||
return res
|
||||
} catch (e) {
|
||||
if (e.response?.data) {
|
||||
throw new Error(e.message + ',' + JSON.stringify(e.response.data));
|
||||
|
|
|
@ -46,7 +46,7 @@ importers:
|
|||
packages/core/acme-client:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../basic
|
||||
'@peculiar/x509':
|
||||
specifier: ^1.11.0
|
||||
|
@ -204,10 +204,10 @@ importers:
|
|||
packages/core/pipeline:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../basic
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../pro/plus-core
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
|
@ -342,7 +342,7 @@ importers:
|
|||
packages/libs/lib-k8s:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
|
@ -382,16 +382,16 @@ importers:
|
|||
packages/libs/lib-server:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../pro/plus-core
|
||||
'@midwayjs/cache':
|
||||
specifier: ~3.14.0
|
||||
|
@ -534,16 +534,16 @@ importers:
|
|||
packages/plugins/plugin-cert:
|
||||
dependencies:
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../plugin-lib
|
||||
'@google-cloud/publicca':
|
||||
specifier: ^1.3.0
|
||||
|
@ -610,10 +610,10 @@ importers:
|
|||
specifier: ^1.7.10
|
||||
version: 1.8.0
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@kubernetes/client-node':
|
||||
specifier: 0.21.0
|
||||
|
@ -701,19 +701,19 @@ importers:
|
|||
packages/pro/commercial-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-plus':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../plugin-plus
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../plus-core
|
||||
'@midwayjs/core':
|
||||
specifier: ~3.20.3
|
||||
|
@ -798,22 +798,22 @@ importers:
|
|||
specifier: ^1.0.2
|
||||
version: 1.0.2
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/lib-k8s':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-k8s
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-cert':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../plugins/plugin-cert
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../plus-core
|
||||
ali-oss:
|
||||
specifier: ^6.21.0
|
||||
|
@ -910,7 +910,7 @@ importers:
|
|||
packages/pro/plus-core:
|
||||
dependencies:
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
dayjs:
|
||||
specifier: ^1.11.7
|
||||
|
@ -1182,10 +1182,10 @@ importers:
|
|||
version: 0.1.3(zod@3.24.2)
|
||||
devDependencies:
|
||||
'@certd/lib-iframe':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-iframe
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@rollup/plugin-commonjs':
|
||||
specifier: ^25.0.7
|
||||
|
@ -1365,40 +1365,40 @@ importers:
|
|||
specifier: ^3.705.0
|
||||
version: 3.758.0(aws-crt@1.25.3)
|
||||
'@certd/acme-client':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/acme-client
|
||||
'@certd/basic':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/basic
|
||||
'@certd/commercial-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../pro/commercial-core
|
||||
'@certd/lib-huawei':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-huawei
|
||||
'@certd/lib-k8s':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-k8s
|
||||
'@certd/lib-server':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/lib-server
|
||||
'@certd/midway-flyway-js':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../libs/midway-flyway-js
|
||||
'@certd/pipeline':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../core/pipeline
|
||||
'@certd/plugin-cert':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../plugins/plugin-cert
|
||||
'@certd/plugin-lib':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../plugins/plugin-lib
|
||||
'@certd/plugin-plus':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../pro/plugin-plus
|
||||
'@certd/plus-core':
|
||||
specifier: ^1.31.2
|
||||
specifier: ^1.31.3
|
||||
version: link:../../pro/plus-core
|
||||
'@corsinvest/cv4pve-api-javascript':
|
||||
specifier: ^8.3.0
|
||||
|
|
Loading…
Reference in New Issue