From ca796503c53026fb57d816fa48c82ea9a26f3f93 Mon Sep 17 00:00:00 2001 From: MIt_gancm <72749591+MIt-gancm@users.noreply.github.com> Date: Sat, 9 Aug 2025 17:45:15 +0800 Subject: [PATCH] Update notify.js MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 自定义通知测试通知正常发送电报机器人正常发送但正常执行就是不响应 不知道有没有其他深意防止我调用自定义请求出问题于是写了调试(注释掉了) 调试信息 - webhookNotify: 传入的标题 (text): xxx 签到结果 传入的内容 (desp): ℹ️ xxx 今日已签到,无需重复签到 相信十年后的八月,我们还会相遇。 ----未闻花名 Webhook URL: https://tz.wd123456789095r.workers.dev/webhook?tk=qlmb123456a Webhook BODY: type: 青龙面板 title: $ content: Webhook HEADERS: Webhook METHOD: POST Webhook CONTENT TYPE: application/json Webhook URL及内容标题无效,跳过推送 于是 解析并替换 BODY 中的占位符: $title / $text => 消息标题 text $content / $desp => 消息内容 desp $ => 向下兼容的写法,替换为 text 稍微兼容了一下其他的不知道有没有问题 建议稍微检查一下其他通知形式有没有类似问题 --- sample/notify.js | 115 +++++++++++++++++++++++------------------------ 1 file changed, 57 insertions(+), 58 deletions(-) diff --git a/sample/notify.js b/sample/notify.js index 8dfe8851..04da4df2 100644 --- a/sample/notify.js +++ b/sample/notify.js @@ -1209,80 +1209,79 @@ function webhookNotify(text, desp) { WEBHOOK_CONTENT_TYPE, WEBHOOK_METHOD, } = push_config; - if ( - !WEBHOOK_METHOD || - !WEBHOOK_URL || - (!WEBHOOK_URL.includes('$title') && !WEBHOOK_BODY.includes('$title')) - ) { - resolve(); - return; + + /** + * // ====== 调试信息输出(方便定位问题)====== + * console.log('===== 调试开始 - webhookNotify ====='); + * console.log('标题 (text):', text); + * console.log('内容 (desp):', desp); + * console.log('Webhook URL:', WEBHOOK_URL); + * console.log('Webhook BODY 模板:', WEBHOOK_BODY); + * console.log('Webhook HEADERS:', WEBHOOK_HEADERS); + * console.log('Webhook METHOD:', WEBHOOK_METHOD); + * console.log('Webhook CONTENT TYPE:', WEBHOOK_CONTENT_TYPE); + * console.log('===== 调试结束 ====================='); + */ + if (!WEBHOOK_METHOD || !WEBHOOK_URL) { + console.warn('Webhook 参数不足(URL 或 METHOD 缺失),跳过推送。'); + return resolve(); } const headers = parseHeaders(WEBHOOK_HEADERS); - const body = parseBody(WEBHOOK_BODY, WEBHOOK_CONTENT_TYPE, (v) => - v - ?.replaceAll('$title', text?.replaceAll('\n', '\\n')) - ?.replaceAll('$content', desp?.replaceAll('\n', '\\n')), + + /** + * 解析并替换 BODY 中的占位符: + * - $title / $text => 消息标题 text + * - $content / $desp => 消息内容 desp + * - 单个 $ => 向下兼容的写法,替换为 text + */ + let bodyObj = parseBody(WEBHOOK_BODY, WEBHOOK_CONTENT_TYPE, (v) => + v.replaceAll('$title', text || '') + .replaceAll('$text', text || '') + .replaceAll('$', text || '') + .replaceAll('$content', desp || '') + .replaceAll('$desp', desp || '') ); - const bodyParam = formatBodyFun(WEBHOOK_CONTENT_TYPE, body); + + if (typeof bodyObj === 'object') { + if (!bodyObj.title) bodyObj.title = text || ''; + if (!bodyObj.content) bodyObj.content = desp || ''; + } + + const bodyParam = formatBodyFun(WEBHOOK_CONTENT_TYPE, bodyObj); + + const formatUrl = WEBHOOK_URL + .replaceAll('$title', encodeURIComponent(text || '')) + .replaceAll('$content', encodeURIComponent(desp || '')); + const options = { method: WEBHOOK_METHOD, headers, - allowGetBody: true, + allowGetBody: true, ...bodyParam, - timeout, - retry: 1, + timeout, + retry: 1, }; - const formatUrl = WEBHOOK_URL.replaceAll( - '$title', - encodeURIComponent(text), - ).replaceAll('$content', encodeURIComponent(desp)); - httpClient.request(formatUrl, options).then(async (resp) => { - const body = await resp.body.text(); - try { + console.log('Webhook 请求信息:', { formatUrl, options }); + + httpClient.request(formatUrl, options) + .then(async (resp) => { + const respBody = await resp.body.text(); if (resp.statusCode !== 200) { - console.log(`自定义发送通知消息失败😞 ${body}\n`); + console.error(`Webhook 推送失败 😞 响应: ${respBody}`); } else { - console.log(`自定义发送通知消息成功🎉 ${body}\n`); + console.log(`Webhook 推送成功 🎉 响应: ${respBody}`); } - } catch (e) { - $.logErr(e, resp); - } finally { - resolve(body); - } - }); + resolve(respBody); + }) + .catch((err) => { + console.error('Webhook HTTP 请求失败:', err); + resolve(); + }); }); } -function ntfyNotify(text, desp) { - function encodeRFC2047(text) { - const encodedBase64 = Buffer.from(text).toString('base64'); - return `=?utf-8?B?${encodedBase64}?=`; - } - - return new Promise((resolve) => { - const { NTFY_URL, NTFY_TOPIC, NTFY_PRIORITY, NTFY_TOKEN, NTFY_USERNAME, NTFY_PASSWORD, NTFY_ACTIONS } = push_config; - if (NTFY_TOPIC) { - const options = { - url: `${NTFY_URL || 'https://ntfy.sh'}/${NTFY_TOPIC}`, - body: `${desp}`, - headers: { - Title: `${encodeRFC2047(text)}`, - Priority: NTFY_PRIORITY || '3', - Icon: 'https://qn.whyour.cn/logo.png', - }, - timeout, - }; - if (NTFY_TOKEN) { - options.headers['Authorization'] = `Bearer ${NTFY_TOKEN}`; - } else if (NTFY_USERNAME && NTFY_PASSWORD) { - options.headers['Authorization'] = `Basic ${Buffer.from(`${NTFY_USERNAME}:${NTFY_PASSWORD}`).toString('base64')}`; - } - if (NTFY_ACTIONS) { - options.headers['Actions'] = encodeRFC2047(NTFY_ACTIONS); - } - $.post(options, (err, resp, data) => { try { if (err) {