mirror of
				https://github.com/whyour/qinglong.git
				synced 2025-11-04 11:16:07 +08:00 
			
		
		
		
	增加飞书机器人通知
This commit is contained in:
		
							parent
							
								
									2789119882
								
							
						
					
					
						commit
						6385e053ae
					
				| 
						 | 
					@ -15,6 +15,7 @@ export enum NotificationMode {
 | 
				
			||||||
  'iGot' = 'iGot',
 | 
					  'iGot' = 'iGot',
 | 
				
			||||||
  'pushPlus' = 'pushPlus',
 | 
					  'pushPlus' = 'pushPlus',
 | 
				
			||||||
  'email' = 'email',
 | 
					  'email' = 'email',
 | 
				
			||||||
 | 
					  'feishu' = 'feishu',
 | 
				
			||||||
  'webhook' = 'webhook',
 | 
					  'webhook' = 'webhook',
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -102,7 +103,14 @@ export class WebhookNotification extends NotificationBaseInfo {
 | 
				
			||||||
  public webhookBody: string = '';
 | 
					  public webhookBody: string = '';
 | 
				
			||||||
  public webhookUrl: string = '';
 | 
					  public webhookUrl: string = '';
 | 
				
			||||||
  public webhookMethod: 'GET' | 'POST' | 'PUT' = 'GET';
 | 
					  public webhookMethod: 'GET' | 'POST' | 'PUT' = 'GET';
 | 
				
			||||||
  public webhookContentType: 'application/json' | 'multipart/form-data' | 'application/x-www-form-urlencoded' = 'application/json';
 | 
					  public webhookContentType:
 | 
				
			||||||
 | 
					    | 'application/json'
 | 
				
			||||||
 | 
					    | 'multipart/form-data'
 | 
				
			||||||
 | 
					    | 'application/x-www-form-urlencoded' = 'application/json';
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export class LarkNotification extends NotificationBaseInfo {
 | 
				
			||||||
 | 
					  public larkKey = '';
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface NotificationInfo
 | 
					export interface NotificationInfo
 | 
				
			||||||
| 
						 | 
					@ -120,4 +128,5 @@ export interface NotificationInfo
 | 
				
			||||||
    IGotNotification,
 | 
					    IGotNotification,
 | 
				
			||||||
    PushPlusNotification,
 | 
					    PushPlusNotification,
 | 
				
			||||||
    EmailNotification,
 | 
					    EmailNotification,
 | 
				
			||||||
    WebhookNotification {}
 | 
					    WebhookNotification,
 | 
				
			||||||
 | 
					    LarkNotification {}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -29,6 +29,7 @@ export default class NotificationService {
 | 
				
			||||||
    ['pushPlus', this.pushPlus],
 | 
					    ['pushPlus', this.pushPlus],
 | 
				
			||||||
    ['email', this.email],
 | 
					    ['email', this.email],
 | 
				
			||||||
    ['webhook', this.webhook],
 | 
					    ['webhook', this.webhook],
 | 
				
			||||||
 | 
					    ['lark', this.lark],
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private title = '';
 | 
					  private title = '';
 | 
				
			||||||
| 
						 | 
					@ -37,9 +38,9 @@ export default class NotificationService {
 | 
				
			||||||
  private gotOption = {
 | 
					  private gotOption = {
 | 
				
			||||||
    timeout: 30000,
 | 
					    timeout: 30000,
 | 
				
			||||||
    retry: 1,
 | 
					    retry: 1,
 | 
				
			||||||
  }
 | 
					  };
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  constructor(@Inject('logger') private logger: winston.Logger) { }
 | 
					  constructor(@Inject('logger') private logger: winston.Logger) {}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  public async notify(
 | 
					  public async notify(
 | 
				
			||||||
    title: string,
 | 
					    title: string,
 | 
				
			||||||
| 
						 | 
					@ -180,7 +181,8 @@ export default class NotificationService {
 | 
				
			||||||
      telegramBotUserId,
 | 
					      telegramBotUserId,
 | 
				
			||||||
    } = this.params;
 | 
					    } = this.params;
 | 
				
			||||||
    const authStr = telegramBotProxyAuth ? `${telegramBotProxyAuth}@` : '';
 | 
					    const authStr = telegramBotProxyAuth ? `${telegramBotProxyAuth}@` : '';
 | 
				
			||||||
    const url = `https://${telegramBotApiHost ? telegramBotApiHost : 'api.telegram.org'
 | 
					    const url = `https://${
 | 
				
			||||||
 | 
					      telegramBotApiHost ? telegramBotApiHost : 'api.telegram.org'
 | 
				
			||||||
    }/bot${telegramBotToken}/sendMessage`;
 | 
					    }/bot${telegramBotToken}/sendMessage`;
 | 
				
			||||||
    let agent;
 | 
					    let agent;
 | 
				
			||||||
    if (telegramBotProxyHost && telegramBotProxyPort) {
 | 
					    if (telegramBotProxyHost && telegramBotProxyPort) {
 | 
				
			||||||
| 
						 | 
					@ -324,30 +326,30 @@ export default class NotificationService {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private async aibotk() {
 | 
					  private async aibotk() {
 | 
				
			||||||
    const { aibotkKey, aibotkType, aibotkName } = this.params;
 | 
					    const { aibotkKey, aibotkType, aibotkName } = this.params;
 | 
				
			||||||
    let url = ''
 | 
					    let url = '';
 | 
				
			||||||
    let json = {}
 | 
					    let json = {};
 | 
				
			||||||
    switch (aibotkType) {
 | 
					    switch (aibotkType) {
 | 
				
			||||||
      case 'room':
 | 
					      case 'room':
 | 
				
			||||||
        url = 'https://api-bot.aibotk.com/openapi/v1/chat/room'
 | 
					        url = 'https://api-bot.aibotk.com/openapi/v1/chat/room';
 | 
				
			||||||
        json = {
 | 
					        json = {
 | 
				
			||||||
          apiKey: `${aibotkKey}`,
 | 
					          apiKey: `${aibotkKey}`,
 | 
				
			||||||
          roomName: `${aibotkName}`,
 | 
					          roomName: `${aibotkName}`,
 | 
				
			||||||
          message: {
 | 
					          message: {
 | 
				
			||||||
            type: 1,
 | 
					            type: 1,
 | 
				
			||||||
            content: `【青龙快讯】\n\n${this.title}\n${this.content}`
 | 
					            content: `【青龙快讯】\n\n${this.title}\n${this.content}`,
 | 
				
			||||||
          }
 | 
					          },
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
      case 'contact':
 | 
					      case 'contact':
 | 
				
			||||||
        url = 'https://api-bot.aibotk.com/openapi/v1/chat/contact'
 | 
					        url = 'https://api-bot.aibotk.com/openapi/v1/chat/contact';
 | 
				
			||||||
        json = {
 | 
					        json = {
 | 
				
			||||||
          apiKey: `${aibotkKey}`,
 | 
					          apiKey: `${aibotkKey}`,
 | 
				
			||||||
          name: `${aibotkName}`,
 | 
					          name: `${aibotkName}`,
 | 
				
			||||||
          message: {
 | 
					          message: {
 | 
				
			||||||
            type: 1,
 | 
					            type: 1,
 | 
				
			||||||
            content: `【青龙快讯】\n\n${this.title}\n${this.content}`
 | 
					            content: `【青龙快讯】\n\n${this.title}\n${this.content}`,
 | 
				
			||||||
          }
 | 
					          },
 | 
				
			||||||
        }
 | 
					        };
 | 
				
			||||||
        break;
 | 
					        break;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -355,9 +357,10 @@ export default class NotificationService {
 | 
				
			||||||
      .post(url, {
 | 
					      .post(url, {
 | 
				
			||||||
        ...this.gotOption,
 | 
					        ...this.gotOption,
 | 
				
			||||||
        json: {
 | 
					        json: {
 | 
				
			||||||
          ...json
 | 
					          ...json,
 | 
				
			||||||
        }
 | 
					        },
 | 
				
			||||||
      }).json();
 | 
					      })
 | 
				
			||||||
 | 
					      .json();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return res.code === 0;
 | 
					    return res.code === 0;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -394,6 +397,21 @@ export default class NotificationService {
 | 
				
			||||||
    return res.code === 200;
 | 
					    return res.code === 200;
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  private async lark() {
 | 
				
			||||||
 | 
					    const { larkKey } = this.params;
 | 
				
			||||||
 | 
					    const res: any = await got
 | 
				
			||||||
 | 
					      .post(`https://open.feishu.cn/open-apis/bot/v2/hook/${larkKey}`, {
 | 
				
			||||||
 | 
					        ...this.gotOption,
 | 
				
			||||||
 | 
					        json: {
 | 
				
			||||||
 | 
					          msg_type: 'text',
 | 
				
			||||||
 | 
					          content: { text: `${this.title}\n\n${this.content}` },
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        headers: { 'Content-Type': 'application/json' },
 | 
				
			||||||
 | 
					      })
 | 
				
			||||||
 | 
					      .json();
 | 
				
			||||||
 | 
					    return res.StatusCode === 0;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private async email() {
 | 
					  private async email() {
 | 
				
			||||||
    const { emailPass, emailService, emailUser } = this.params;
 | 
					    const { emailPass, emailService, emailUser } = this.params;
 | 
				
			||||||
    const transporter = nodemailer.createTransport({
 | 
					    const transporter = nodemailer.createTransport({
 | 
				
			||||||
| 
						 | 
					@ -417,10 +435,18 @@ export default class NotificationService {
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  private async webhook() {
 | 
					  private async webhook() {
 | 
				
			||||||
    const { webhookUrl, webhookBody, webhookHeaders, webhookMethod, webhookContentType } =
 | 
					    const {
 | 
				
			||||||
      this.params;
 | 
					      webhookUrl,
 | 
				
			||||||
 | 
					      webhookBody,
 | 
				
			||||||
 | 
					      webhookHeaders,
 | 
				
			||||||
 | 
					      webhookMethod,
 | 
				
			||||||
 | 
					      webhookContentType,
 | 
				
			||||||
 | 
					    } = this.params;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    const { formatBody, formatUrl } = this.formatNotifyContent(webhookUrl, webhookBody);
 | 
					    const { formatBody, formatUrl } = this.formatNotifyContent(
 | 
				
			||||||
 | 
					      webhookUrl,
 | 
				
			||||||
 | 
					      webhookBody,
 | 
				
			||||||
 | 
					    );
 | 
				
			||||||
    if (!formatUrl && !formatBody) {
 | 
					    if (!formatUrl && !formatBody) {
 | 
				
			||||||
      return false;
 | 
					      return false;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -432,8 +458,8 @@ export default class NotificationService {
 | 
				
			||||||
      headers,
 | 
					      headers,
 | 
				
			||||||
      ...this.gotOption,
 | 
					      ...this.gotOption,
 | 
				
			||||||
      allowGetBody: true,
 | 
					      allowGetBody: true,
 | 
				
			||||||
      ...bodyParam
 | 
					      ...bodyParam,
 | 
				
			||||||
    }
 | 
					    };
 | 
				
			||||||
    const res = await got(formatUrl, options);
 | 
					    const res = await got(formatUrl, options);
 | 
				
			||||||
    return String(res.statusCode).startsWith('20');
 | 
					    return String(res.statusCode).startsWith('20');
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
| 
						 | 
					@ -457,8 +483,12 @@ export default class NotificationService {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return {
 | 
					    return {
 | 
				
			||||||
      formatUrl: url.replaceAll('$title', encodeURIComponent(this.title)).replaceAll('$content', encodeURIComponent(this.content)),
 | 
					      formatUrl: url
 | 
				
			||||||
      formatBody: body.replaceAll('$title', this.title).replaceAll('$content', this.content),
 | 
					        .replaceAll('$title', encodeURIComponent(this.title))
 | 
				
			||||||
    }
 | 
					        .replaceAll('$content', encodeURIComponent(this.content)),
 | 
				
			||||||
 | 
					      formatBody: body
 | 
				
			||||||
 | 
					        .replaceAll('$title', this.title)
 | 
				
			||||||
 | 
					        .replaceAll('$content', this.content),
 | 
				
			||||||
 | 
					    };
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										189
									
								
								sample/notify.js
									
									
									
									
									
								
							
							
						
						
									
										189
									
								
								sample/notify.js
									
									
									
									
									
								
							| 
						 | 
					@ -110,7 +110,6 @@ let PUSH_PLUS_USER = '';
 | 
				
			||||||
let QQ_SKEY = '';
 | 
					let QQ_SKEY = '';
 | 
				
			||||||
let QQ_MODE = '';
 | 
					let QQ_MODE = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
// =======================================智能微秘书设置区域=======================================
 | 
					// =======================================智能微秘书设置区域=======================================
 | 
				
			||||||
//官方文档:http://wechat.aibotk.com/docs/about
 | 
					//官方文档:http://wechat.aibotk.com/docs/about
 | 
				
			||||||
//AIBOTK_KEY: 填写智能微秘书个人中心的apikey
 | 
					//AIBOTK_KEY: 填写智能微秘书个人中心的apikey
 | 
				
			||||||
| 
						 | 
					@ -120,6 +119,11 @@ let AIBOTK_KEY = '';
 | 
				
			||||||
let AIBOTK_TYPE = '';
 | 
					let AIBOTK_TYPE = '';
 | 
				
			||||||
let AIBOTK_NAME = '';
 | 
					let AIBOTK_NAME = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// =======================================飞书机器人设置区域=======================================
 | 
				
			||||||
 | 
					//官方文档:https://www.feishu.cn/hc/zh-CN/articles/360024984973
 | 
				
			||||||
 | 
					//FSKEY 飞书机器人的 FSKEY
 | 
				
			||||||
 | 
					let FSKEY = '';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
//==========================云端环境变量的判断与接收=========================
 | 
					//==========================云端环境变量的判断与接收=========================
 | 
				
			||||||
if (process.env.GOTIFY_URL) {
 | 
					if (process.env.GOTIFY_URL) {
 | 
				
			||||||
  GOTIFY_URL = process.env.GOTIFY_URL;
 | 
					  GOTIFY_URL = process.env.GOTIFY_URL;
 | 
				
			||||||
| 
						 | 
					@ -230,14 +234,19 @@ if (process.env.PUSH_PLUS_TOKEN) {
 | 
				
			||||||
if (process.env.PUSH_PLUS_USER) {
 | 
					if (process.env.PUSH_PLUS_USER) {
 | 
				
			||||||
  PUSH_PLUS_USER = process.env.PUSH_PLUS_USER;
 | 
					  PUSH_PLUS_USER = process.env.PUSH_PLUS_USER;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if(process.env.AIBOTK_KEY) {
 | 
					
 | 
				
			||||||
  AIBOTK_KEY = process.env.AIBOTK_KEY
 | 
					if (process.env.AIBOTK_KEY) {
 | 
				
			||||||
 | 
					  AIBOTK_KEY = process.env.AIBOTK_KEY;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if(process.env.AIBOTK_TYPE) {
 | 
					if (process.env.AIBOTK_TYPE) {
 | 
				
			||||||
  AIBOTK_TYPE = process.env.AIBOTK_TYPE
 | 
					  AIBOTK_TYPE = process.env.AIBOTK_TYPE;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
if(process.env.AIBOTK_NAME) {
 | 
					if (process.env.AIBOTK_NAME) {
 | 
				
			||||||
  AIBOTK_NAME = process.env.AIBOTK_NAME
 | 
					  AIBOTK_NAME = process.env.AIBOTK_NAME;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if (process.env.FSKEY) {
 | 
				
			||||||
 | 
					  FSKEY = process.env.FSKEY;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
//==========================云端环境变量的判断与接收=========================
 | 
					//==========================云端环境变量的判断与接收=========================
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -275,6 +284,7 @@ async function sendNotify(
 | 
				
			||||||
    ChatNotify(text, desp), //synolog chat
 | 
					    ChatNotify(text, desp), //synolog chat
 | 
				
			||||||
    PushDeerNotify(text, desp), //PushDeer
 | 
					    PushDeerNotify(text, desp), //PushDeer
 | 
				
			||||||
    aibotkNotify(text, desp), //智能微秘书
 | 
					    aibotkNotify(text, desp), //智能微秘书
 | 
				
			||||||
 | 
					    fsBotNotify(text, desp), //飞书机器人
 | 
				
			||||||
  ]);
 | 
					  ]);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -315,7 +325,7 @@ function gotifyNotify(text, desp) {
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function gobotNotify(text, desp, time = 2100) {
 | 
					function gobotNotify(text, desp) {
 | 
				
			||||||
  return new Promise((resolve) => {
 | 
					  return new Promise((resolve) => {
 | 
				
			||||||
    if (GOBOT_URL) {
 | 
					    if (GOBOT_URL) {
 | 
				
			||||||
      const options = {
 | 
					      const options = {
 | 
				
			||||||
| 
						 | 
					@ -326,7 +336,6 @@ function gobotNotify(text, desp, time = 2100) {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        timeout,
 | 
					        timeout,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      setTimeout(() => {
 | 
					 | 
				
			||||||
      $.post(options, (err, resp, data) => {
 | 
					      $.post(options, (err, resp, data) => {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
          if (err) {
 | 
					          if (err) {
 | 
				
			||||||
| 
						 | 
					@ -339,9 +348,7 @@ function gobotNotify(text, desp, time = 2100) {
 | 
				
			||||||
            } else if (data.retcode === 100) {
 | 
					            } else if (data.retcode === 100) {
 | 
				
			||||||
              console.log(`go-cqhttp发送通知消息异常: ${data.errmsg}\n`);
 | 
					              console.log(`go-cqhttp发送通知消息异常: ${data.errmsg}\n`);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                console.log(
 | 
					              console.log(`go-cqhttp发送通知消息异常\n${JSON.stringify(data)}`);
 | 
				
			||||||
                  `go-cqhttp发送通知消息异常\n${JSON.stringify(data)}`,
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } catch (e) {
 | 
					        } catch (e) {
 | 
				
			||||||
| 
						 | 
					@ -350,14 +357,13 @@ function gobotNotify(text, desp, time = 2100) {
 | 
				
			||||||
          resolve(data);
 | 
					          resolve(data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      }, time);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      resolve();
 | 
					      resolve();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function serverNotify(text, desp, time = 2100) {
 | 
					function serverNotify(text, desp) {
 | 
				
			||||||
  return new Promise((resolve) => {
 | 
					  return new Promise((resolve) => {
 | 
				
			||||||
    if (SCKEY) {
 | 
					    if (SCKEY) {
 | 
				
			||||||
      //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换
 | 
					      //微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换
 | 
				
			||||||
| 
						 | 
					@ -372,7 +378,6 @@ function serverNotify(text, desp, time = 2100) {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        timeout,
 | 
					        timeout,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      setTimeout(() => {
 | 
					 | 
				
			||||||
      $.post(options, (err, resp, data) => {
 | 
					      $.post(options, (err, resp, data) => {
 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
          if (err) {
 | 
					          if (err) {
 | 
				
			||||||
| 
						 | 
					@ -387,9 +392,7 @@ function serverNotify(text, desp, time = 2100) {
 | 
				
			||||||
              // 一分钟内发送相同的内容会触发
 | 
					              // 一分钟内发送相同的内容会触发
 | 
				
			||||||
              console.log(`server酱发送通知消息异常: ${data.errmsg}\n`);
 | 
					              console.log(`server酱发送通知消息异常: ${data.errmsg}\n`);
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                console.log(
 | 
					              console.log(`server酱发送通知消息异常\n${JSON.stringify(data)}`);
 | 
				
			||||||
                  `server酱发送通知消息异常\n${JSON.stringify(data)}`,
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } catch (e) {
 | 
					        } catch (e) {
 | 
				
			||||||
| 
						 | 
					@ -398,7 +401,6 @@ function serverNotify(text, desp, time = 2100) {
 | 
				
			||||||
          resolve(data);
 | 
					          resolve(data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
      }, time);
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      resolve();
 | 
					      resolve();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -418,9 +420,7 @@ function PushDeerNotify(text, desp) {
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        timeout,
 | 
					        timeout,
 | 
				
			||||||
      };
 | 
					      };
 | 
				
			||||||
      $.post(
 | 
					      $.post(options, (err, resp, data) => {
 | 
				
			||||||
        options,
 | 
					 | 
				
			||||||
        (err, resp, data) => {
 | 
					 | 
				
			||||||
        try {
 | 
					        try {
 | 
				
			||||||
          if (err) {
 | 
					          if (err) {
 | 
				
			||||||
            console.log('发送通知调用API失败!!\n');
 | 
					            console.log('发送通知调用API失败!!\n');
 | 
				
			||||||
| 
						 | 
					@ -434,9 +434,7 @@ function PushDeerNotify(text, desp) {
 | 
				
			||||||
            ) {
 | 
					            ) {
 | 
				
			||||||
              console.log('PushDeer发送通知消息成功🎉\n');
 | 
					              console.log('PushDeer发送通知消息成功🎉\n');
 | 
				
			||||||
            } else {
 | 
					            } else {
 | 
				
			||||||
                console.log(
 | 
					              console.log(`PushDeer发送通知消息异常\n${JSON.stringify(data)}`);
 | 
				
			||||||
                  `PushDeer发送通知消息异常\n${JSON.stringify(data)}`,
 | 
					 | 
				
			||||||
                );
 | 
					 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
          }
 | 
					          }
 | 
				
			||||||
        } catch (e) {
 | 
					        } catch (e) {
 | 
				
			||||||
| 
						 | 
					@ -444,9 +442,7 @@ function PushDeerNotify(text, desp) {
 | 
				
			||||||
        } finally {
 | 
					        } finally {
 | 
				
			||||||
          resolve(data);
 | 
					          resolve(data);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        },
 | 
					      });
 | 
				
			||||||
        time,
 | 
					 | 
				
			||||||
      );
 | 
					 | 
				
			||||||
    } else {
 | 
					    } else {
 | 
				
			||||||
      resolve();
 | 
					      resolve();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -490,83 +486,6 @@ function ChatNotify(text, desp) {
 | 
				
			||||||
  });
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function CoolPush(text, desp) {
 | 
					 | 
				
			||||||
  return new Promise((resolve) => {
 | 
					 | 
				
			||||||
    if (QQ_SKEY) {
 | 
					 | 
				
			||||||
      let options = {
 | 
					 | 
				
			||||||
        url: `https://push.xuthus.cc/${QQ_MODE}/${QQ_SKEY}`,
 | 
					 | 
				
			||||||
        headers: {
 | 
					 | 
				
			||||||
          'Content-Type': 'application/json',
 | 
					 | 
				
			||||||
        },
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      // 已知敏感词
 | 
					 | 
				
			||||||
      text = text.replace(/京豆/g, '豆豆');
 | 
					 | 
				
			||||||
      desp = desp.replace(/京豆/g, '');
 | 
					 | 
				
			||||||
      desp = desp.replace(/🐶/g, '');
 | 
					 | 
				
			||||||
      desp = desp.replace(/红包/g, 'H包');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      switch (QQ_MODE) {
 | 
					 | 
				
			||||||
        case 'email':
 | 
					 | 
				
			||||||
          options.json = {
 | 
					 | 
				
			||||||
            t: text,
 | 
					 | 
				
			||||||
            c: desp,
 | 
					 | 
				
			||||||
          };
 | 
					 | 
				
			||||||
          break;
 | 
					 | 
				
			||||||
        default:
 | 
					 | 
				
			||||||
          options.body = `${text}\n\n${desp}`;
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      let pushMode = function (t) {
 | 
					 | 
				
			||||||
        switch (t) {
 | 
					 | 
				
			||||||
          case 'send':
 | 
					 | 
				
			||||||
            return '个人';
 | 
					 | 
				
			||||||
          case 'group':
 | 
					 | 
				
			||||||
            return 'QQ群';
 | 
					 | 
				
			||||||
          case 'wx':
 | 
					 | 
				
			||||||
            return '微信';
 | 
					 | 
				
			||||||
          case 'ww':
 | 
					 | 
				
			||||||
            return '企业微信';
 | 
					 | 
				
			||||||
          case 'email':
 | 
					 | 
				
			||||||
            return '邮件';
 | 
					 | 
				
			||||||
          default:
 | 
					 | 
				
			||||||
            return '未知方式';
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      };
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
      $.post(options, (err, resp, data) => {
 | 
					 | 
				
			||||||
        try {
 | 
					 | 
				
			||||||
          if (err) {
 | 
					 | 
				
			||||||
            console.log(`发送${pushMode(QQ_MODE)}通知调用API失败!!\n`);
 | 
					 | 
				
			||||||
            console.log(err);
 | 
					 | 
				
			||||||
          } else {
 | 
					 | 
				
			||||||
            data = JSON.parse(data);
 | 
					 | 
				
			||||||
            if (data.code === 200) {
 | 
					 | 
				
			||||||
              console.log(`酷推发送${pushMode(QQ_MODE)}通知消息成功🎉\n`);
 | 
					 | 
				
			||||||
            } else if (data.code === 400) {
 | 
					 | 
				
			||||||
              console.log(
 | 
					 | 
				
			||||||
                `QQ酷推(Cool Push)发送${pushMode(QQ_MODE)}推送失败:${
 | 
					 | 
				
			||||||
                  data.msg
 | 
					 | 
				
			||||||
                }\n`,
 | 
					 | 
				
			||||||
              );
 | 
					 | 
				
			||||||
            } else if (data.code === 503) {
 | 
					 | 
				
			||||||
              console.log(`QQ酷推出错,${data.message}:${data.data}\n`);
 | 
					 | 
				
			||||||
            } else {
 | 
					 | 
				
			||||||
              console.log(`酷推推送异常: ${JSON.stringify(data)}`);
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
          }
 | 
					 | 
				
			||||||
        } catch (e) {
 | 
					 | 
				
			||||||
          $.logErr(e, resp);
 | 
					 | 
				
			||||||
        } finally {
 | 
					 | 
				
			||||||
          resolve(data);
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
      });
 | 
					 | 
				
			||||||
    } else {
 | 
					 | 
				
			||||||
      resolve();
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
  });
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
function BarkNotify(text, desp, params = {}) {
 | 
					function BarkNotify(text, desp, params = {}) {
 | 
				
			||||||
  return new Promise((resolve) => {
 | 
					  return new Promise((resolve) => {
 | 
				
			||||||
    if (BARK_PUSH) {
 | 
					    if (BARK_PUSH) {
 | 
				
			||||||
| 
						 | 
					@ -669,7 +588,7 @@ function ddBotNotify(text, desp) {
 | 
				
			||||||
      json: {
 | 
					      json: {
 | 
				
			||||||
        msgtype: 'text',
 | 
					        msgtype: 'text',
 | 
				
			||||||
        text: {
 | 
					        text: {
 | 
				
			||||||
          content: ` ${text}\n\n${desp}`,
 | 
					          content: `${text}\n\n${desp}`,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      headers: {
 | 
					      headers: {
 | 
				
			||||||
| 
						 | 
					@ -736,7 +655,7 @@ function qywxBotNotify(text, desp) {
 | 
				
			||||||
      json: {
 | 
					      json: {
 | 
				
			||||||
        msgtype: 'text',
 | 
					        msgtype: 'text',
 | 
				
			||||||
        text: {
 | 
					        text: {
 | 
				
			||||||
          content: ` ${text}\n\n${desp}`,
 | 
					          content: `${text}\n\n${desp}`,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      headers: {
 | 
					      headers: {
 | 
				
			||||||
| 
						 | 
					@ -1005,31 +924,31 @@ function pushPlusNotify(text, desp) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
function aibotkNotify(text, desp) {
 | 
					function aibotkNotify(text, desp) {
 | 
				
			||||||
  return new Promise((resolve) => {
 | 
					  return new Promise((resolve) => {
 | 
				
			||||||
    if(AIBOTK_KEY&&AIBOTK_TYPE&&AIBOTK_NAME) {
 | 
					    if (AIBOTK_KEY && AIBOTK_TYPE && AIBOTK_NAME) {
 | 
				
			||||||
      let json = {};
 | 
					      let json = {};
 | 
				
			||||||
      let url = '';
 | 
					      let url = '';
 | 
				
			||||||
      switch (AIBOTK_TYPE) {
 | 
					      switch (AIBOTK_TYPE) {
 | 
				
			||||||
        case 'room':
 | 
					        case 'room':
 | 
				
			||||||
          url = 'https://api-bot.aibotk.com/openapi/v1/chat/room'
 | 
					          url = 'https://api-bot.aibotk.com/openapi/v1/chat/room';
 | 
				
			||||||
          json = {
 | 
					          json = {
 | 
				
			||||||
            apiKey: `${AIBOTK_KEY}`,
 | 
					            apiKey: `${AIBOTK_KEY}`,
 | 
				
			||||||
            roomName: `${AIBOTK_NAME}`,
 | 
					            roomName: `${AIBOTK_NAME}`,
 | 
				
			||||||
            message: {
 | 
					            message: {
 | 
				
			||||||
              type: 1,
 | 
					              type: 1,
 | 
				
			||||||
              content: `【青龙快讯】\n\n${text}\n${desp}`
 | 
					              content: `【青龙快讯】\n\n${text}\n${desp}`,
 | 
				
			||||||
            }
 | 
					            },
 | 
				
			||||||
          }
 | 
					          };
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
        case 'contact':
 | 
					        case 'contact':
 | 
				
			||||||
          url = 'https://api-bot.aibotk.com/openapi/v1/chat/contact'
 | 
					          url = 'https://api-bot.aibotk.com/openapi/v1/chat/contact';
 | 
				
			||||||
          json = {
 | 
					          json = {
 | 
				
			||||||
            apiKey: `${AIBOTK_KEY}`,
 | 
					            apiKey: `${AIBOTK_KEY}`,
 | 
				
			||||||
            name: `${AIBOTK_NAME}`,
 | 
					            name: `${AIBOTK_NAME}`,
 | 
				
			||||||
            message: {
 | 
					            message: {
 | 
				
			||||||
              type: 1,
 | 
					              type: 1,
 | 
				
			||||||
              content: `【青龙快讯】\n\n${text}\n${desp}`
 | 
					              content: `【青龙快讯】\n\n${text}\n${desp}`,
 | 
				
			||||||
            }
 | 
					            },
 | 
				
			||||||
          }
 | 
					          };
 | 
				
			||||||
          break;
 | 
					          break;
 | 
				
			||||||
      }
 | 
					      }
 | 
				
			||||||
      const options = {
 | 
					      const options = {
 | 
				
			||||||
| 
						 | 
					@ -1060,7 +979,43 @@ function aibotkNotify(text, desp) {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
      });
 | 
					      });
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  })
 | 
					  });
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					function fsBotNotify(text, desp) {
 | 
				
			||||||
 | 
					  return new Promise((resolve) => {
 | 
				
			||||||
 | 
					    if (FSKEY) {
 | 
				
			||||||
 | 
					      const options = {
 | 
				
			||||||
 | 
					        url: `https://open.feishu.cn/open-apis/bot/v2/hook/${FSKEY}`,
 | 
				
			||||||
 | 
					        json: { msg_type: 'text', content: { text: `${title}\n\n${content}` } },
 | 
				
			||||||
 | 
					        headers: {
 | 
				
			||||||
 | 
					          'Content-Type': 'application/json',
 | 
				
			||||||
 | 
					        },
 | 
				
			||||||
 | 
					        timeout,
 | 
				
			||||||
 | 
					      };
 | 
				
			||||||
 | 
					      $.post(options, (err, resp, data) => {
 | 
				
			||||||
 | 
					        try {
 | 
				
			||||||
 | 
					          if (err) {
 | 
				
			||||||
 | 
					            console.log('发送通知调用API失败!!\n');
 | 
				
			||||||
 | 
					            console.log(err);
 | 
				
			||||||
 | 
					          } else {
 | 
				
			||||||
 | 
					            data = JSON.parse(data);
 | 
				
			||||||
 | 
					            if (data.StatusCode === 0) {
 | 
				
			||||||
 | 
					              console.log('飞书发送通知消息成功🎉\n');
 | 
				
			||||||
 | 
					            } else {
 | 
				
			||||||
 | 
					              console.log(`${data.msg}\n`);
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					          }
 | 
				
			||||||
 | 
					        } catch (e) {
 | 
				
			||||||
 | 
					          $.logErr(e, resp);
 | 
				
			||||||
 | 
					        } finally {
 | 
				
			||||||
 | 
					          resolve(data);
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					      });
 | 
				
			||||||
 | 
					    } else {
 | 
				
			||||||
 | 
					      resolve();
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					  });
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
module.exports = {
 | 
					module.exports = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -93,6 +93,7 @@ export default {
 | 
				
			||||||
    { value: 'pushPlus', label: 'PushPlus' },
 | 
					    { value: 'pushPlus', label: 'PushPlus' },
 | 
				
			||||||
    { value: 'chat', label: '群辉chat' },
 | 
					    { value: 'chat', label: '群辉chat' },
 | 
				
			||||||
    { value: 'email', label: '邮箱' },
 | 
					    { value: 'email', label: '邮箱' },
 | 
				
			||||||
 | 
					    { value: 'lark', label: '飞书机器人' },
 | 
				
			||||||
    { value: 'webhook', label: '自定义通知' },
 | 
					    { value: 'webhook', label: '自定义通知' },
 | 
				
			||||||
    { value: 'closed', label: '已关闭' },
 | 
					    { value: 'closed', label: '已关闭' },
 | 
				
			||||||
  ],
 | 
					  ],
 | 
				
			||||||
| 
						 | 
					@ -208,7 +209,10 @@ export default {
 | 
				
			||||||
        tip: '发送的目标,群组或者好友',
 | 
					        tip: '发送的目标,群组或者好友',
 | 
				
			||||||
        required: true,
 | 
					        required: true,
 | 
				
			||||||
        placeholder: '请输入要发送的目标',
 | 
					        placeholder: '请输入要发送的目标',
 | 
				
			||||||
        items: [{ value: 'room', label: '群聊' }, { value: 'contact', label: '好友' }],
 | 
					        items: [
 | 
				
			||||||
 | 
					          { value: 'room', label: '群聊' },
 | 
				
			||||||
 | 
					          { value: 'contact', label: '好友' },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        label: 'aibotkName',
 | 
					        label: 'aibotkName',
 | 
				
			||||||
| 
						 | 
					@ -234,6 +238,13 @@ export default {
 | 
				
			||||||
        tip: '一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)',
 | 
					        tip: '一对多推送的“群组编码”(一对多推送下面->您的群组(如无则新建)->群组编码,如果您是创建群组人。也需点击“查看二维码”扫描绑定,否则不能接受群组消息推送)',
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
 | 
					    lark: [
 | 
				
			||||||
 | 
					      {
 | 
				
			||||||
 | 
					        label: 'larkKey',
 | 
				
			||||||
 | 
					        tip: '飞书群组机器人:https://www.feishu.cn/hc/zh-CN/articles/360024984973',
 | 
				
			||||||
 | 
					        required: true,
 | 
				
			||||||
 | 
					      },
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
    email: [
 | 
					    email: [
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        label: 'emailService',
 | 
					        label: 'emailService',
 | 
				
			||||||
| 
						 | 
					@ -254,7 +265,11 @@ export default {
 | 
				
			||||||
        label: 'webhookContentType',
 | 
					        label: 'webhookContentType',
 | 
				
			||||||
        tip: '请求头Content-Type',
 | 
					        tip: '请求头Content-Type',
 | 
				
			||||||
        required: true,
 | 
					        required: true,
 | 
				
			||||||
        items: [{ value: 'application/json' }, { value: 'multipart/form-data' }, { value: 'application/x-www-form-urlencoded' }],
 | 
					        items: [
 | 
				
			||||||
 | 
					          { value: 'application/json' },
 | 
				
			||||||
 | 
					          { value: 'multipart/form-data' },
 | 
				
			||||||
 | 
					          { value: 'application/x-www-form-urlencoded' },
 | 
				
			||||||
 | 
					        ],
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      {
 | 
					      {
 | 
				
			||||||
        label: 'webhookUrl',
 | 
					        label: 'webhookUrl',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue
	
	Block a user