mirror of https://github.com/certd/certd
				
				
				
			Merge remote-tracking branch 'origin/v2-dev' into v2-dev
						commit
						b6fd38e293
					
				| 
						 | 
				
			
			@ -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