自定义通知适配系统设置里的配置

This commit is contained in:
Ahaochan 2023-02-13 15:48:06 +08:00
parent b92b9c2ad4
commit 865a8212f5

View File

@ -11,8 +11,13 @@
*/ */
const querystring = require('querystring'); const querystring = require('querystring');
const got = require("got");
const $ = new Env(); const $ = new Env();
const timeout = 15000; //超时时间(单位毫秒) const timeout = 15000; //超时时间(单位毫秒)
const gotOption = {
timeout: timeout,
retry: 1,
};
// =======================================gotify通知设置区域============================================== // =======================================gotify通知设置区域==============================================
//gotify_url 填写gotify地址,如https://push.example.de:8080 //gotify_url 填写gotify地址,如https://push.example.de:8080
//gotify_token 填写gotify的消息应用token //gotify_token 填写gotify的消息应用token
@ -127,7 +132,11 @@ let FSKEY = '';
// =======================================自定义通知设置区域======================================= // =======================================自定义通知设置区域=======================================
// 自定义通知 接收回调的URL // 自定义通知 接收回调的URL
let CUSTOM_URL = ''; let WEBHOOK_URL = 'http://192.168.117.1:7788';
let WEBHOOK_BODY = 'title: $title \n content: $content';
let WEBHOOK_HEADERS = '';
let WEBHOOK_METHOD = 'post';
let WEBHOOK_CONTENT_TYPE = 'application/json';
// =======================================SMTP 邮件设置区域======================================= // =======================================SMTP 邮件设置区域=======================================
// SMTP_SERVER: 填写 SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465 // SMTP_SERVER: 填写 SMTP 发送邮件服务器,形如 smtp.exmail.qq.com:465
@ -282,8 +291,20 @@ if (process.env.SMTP_PASSWORD) {
if (process.env.SMTP_NAME) { if (process.env.SMTP_NAME) {
SMTP_NAME = process.env.SMTP_NAME; SMTP_NAME = process.env.SMTP_NAME;
} }
if (process.env.CUSTOM_URL) { if (process.env.WEBHOOK_URL) {
CUSTOM_URL = process.env.CUSTOM_URL; WEBHOOK_URL = process.env.WEBHOOK_URL;
}
if (process.env.WEBHOOK_BODY) {
WEBHOOK_BODY = process.env.WEBHOOK_BODY;
}
if (process.env.WEBHOOK_HEADERS) {
WEBHOOK_HEADERS = process.env.WEBHOOK_HEADERS;
}
if (process.env.WEBHOOK_METHOD) {
WEBHOOK_METHOD = process.env.WEBHOOK_METHOD;
}
if (process.env.WEBHOOK_CONTENT_TYPE) {
WEBHOOK_CONTENT_TYPE = process.env.WEBHOOK_CONTENT_TYPE;
} }
//==========================云端环境变量的判断与接收========================= //==========================云端环境变量的判断与接收=========================
@ -323,7 +344,7 @@ async function sendNotify(
aibotkNotify(text, desp), //智能微秘书 aibotkNotify(text, desp), //智能微秘书
fsBotNotify(text, desp), //飞书机器人 fsBotNotify(text, desp), //飞书机器人
smtpNotify(text, desp), //SMTP 邮件 smtpNotify(text, desp), //SMTP 邮件
customNotify(text, desp), //自定义通知 webhookNotify(text, desp), //自定义通知
]); ]);
} }
@ -1105,40 +1126,157 @@ function smtpNotify(text, desp) {
}); });
} }
function customNotify(text, desp) { function webhookNotify(text, desp) {
return new Promise((resolve) => { return new Promise((resolve) => {
const options = { const {
url: `${CUSTOM_URL}`, webhookUrl,
json: { webhookBody,
title: text, webhookHeaders,
content: desp webhookMethod,
}, webhookContentType,
headers: { } = {
'Content-Type': 'application/json', webhookUrl: WEBHOOK_URL,
}, webhookBody: WEBHOOK_BODY,
timeout, webhookHeaders: WEBHOOK_HEADERS,
}; webhookMethod: WEBHOOK_METHOD,
if (CUSTOM_URL) { webhookContentType: WEBHOOK_CONTENT_TYPE
$.post(options, (err, resp, data) => { }
try { const {formatBody, formatUrl} = formatNotifyContentFun(
if (err) { webhookUrl,
console.log('自定义发送通知消息失败!!\n'); webhookBody,
console.log(err); text,
} else { desp,
data = JSON.parse(data); );
console.log('自定义发送通知消息成功🎉。\n'); if (!formatUrl && !formatBody) {
console.log(data); return false;
} }
} catch (e) { const headers = parseHeaders(webhookHeaders);
$.logErr(e, resp); const body = parseBody(formatBody, webhookContentType);
} finally { const bodyParam = formatBodyFun(webhookContentType, body);
resolve(data); const options = {
} method: webhookMethod,
}); headers,
} else { ...gotOption,
resolve(); allowGetBody: true,
...bodyParam,
};
if (WEBHOOK_METHOD) {
got(formatUrl, options).then(resp => {
try {
if (resp.statusCode !== 200) {
console.log('自定义发送通知消息失败!!\n');
console.log(resp.body);
} else {
console.log('自定义发送通知消息成功🎉。\n');
console.log(resp.body);
}
} catch (e) {
$.logErr(e, resp);
} finally {
resolve(resp.body);
} }
}); });
} else {
resolve();
}
});
}
function parseHeaders(headers) {
if (!headers) return {};
const parsed = {};
let key;
let val;
let i;
headers &&
headers.split('\n').forEach(function parser(line) {
i = line.indexOf(':');
key = line.substring(0, i).trim().toLowerCase();
val = line.substring(i + 1).trim();
if (!key) {
return;
}
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
});
return parsed;
}
function parseBody(
body,
contentType
) {
if (!body) return '';
const parsed = {};
let key;
let val;
let i;
body &&
body.split('\n').forEach(function parser(line) {
i = line.indexOf(':');
key = line.substring(0, i).trim().toLowerCase();
val = line.substring(i + 1).trim();
if (!key || parsed[key]) {
return;
}
try {
const jsonValue = JSON.parse(val);
parsed[key] = jsonValue;
} catch (error) {
parsed[key] = val;
}
});
switch (contentType) {
case 'multipart/form-data':
return Object.keys(parsed).reduce((p, c) => {
p.append(c, parsed[c]);
return p;
}, new FormData());
case 'application/x-www-form-urlencoded':
return Object.keys(parsed).reduce((p, c) => {
return p ? `${p}&${c}=${parsed[c]}` : `${c}=${parsed[c]}`;
});
}
return parsed;
}
function formatBodyFun(contentType, body) {
if (!body) return {};
switch (contentType) {
case 'application/json':
return {json: body};
case 'multipart/form-data':
return {form: body};
case 'application/x-www-form-urlencoded':
return {body};
}
return {};
}
function formatNotifyContentFun(url, body, title, content) {
if (!url.includes('$title') && !body.includes('$title')) {
return {};
}
return {
formatUrl: url
.replaceAll('$title', encodeURIComponent(title))
.replaceAll('$content', encodeURIComponent(content)),
formatBody: body
.replaceAll('$title', title)
.replaceAll('$content', content),
};
} }
module.exports = { module.exports = {