From 8f70329698d7079fdc87b9c922fd9ea88daaeb74 Mon Sep 17 00:00:00 2001 From: qiaoyun680 Date: Wed, 23 Oct 2024 02:35:32 +0000 Subject: [PATCH] =?UTF-8?q?1.=E6=94=B9=E8=BF=9Bntfy=E9=80=9A=E7=9F=A5?= =?UTF-8?q?=EF=BC=8C=E5=B0=86=E4=B8=AD=E6=96=87=E6=A0=87=E9=A2=98=E8=BF=9B?= =?UTF-8?q?=E8=A1=8C=E7=BC=96=E7=A0=81=E5=90=8E=E5=8F=91=E9=80=81=EF=BC=8C?= =?UTF-8?q?=E5=8F=AF=E4=BB=A5=E7=9B=B4=E6=8E=A5=E5=B1=95=E7=A4=BA=E4=B8=AD?= =?UTF-8?q?=E6=96=87=E6=A0=87=E9=A2=98=EF=BC=9B2.=E6=94=B9=E8=BF=9Bnotify.?= =?UTF-8?q?py=E5=92=8Cnotify.js=E4=B8=ADnt=20fy=E7=9A=84=E6=8E=A8=E9=80=81?= =?UTF-8?q?;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/services/notify.ts | 18 +++++++++++------- sample/notify.js | 24 ++++++++++++++---------- sample/notify.py | 35 ++++++++++++++++++++++------------- 3 files changed, 47 insertions(+), 30 deletions(-) diff --git a/back/services/notify.ts b/back/services/notify.ts index 64201278..ea2925bb 100644 --- a/back/services/notify.ts +++ b/back/services/notify.ts @@ -152,16 +152,14 @@ export default class NotificationService { private async serverChan() { const { serverChanKey } = this.params; - const matchResult = serverChanKey.match(/^sctp(\d+)t/i); - const url = matchResult && matchResult[1] - ? `https://${matchResult[1]}.push.ft07.com/send/${serverChanKey}.send` + const url = serverChanKey.startsWith('sctp') + ? `https://${serverChanKey}.push.ft07.com/send` : `https://sctapi.ftqq.com/${serverChanKey}.send`; - try { const res: any = await got .post(url, { ...this.gotOption, - body: `title=${encodeURIComponent(this.title)}&desp=${encodeURIComponent(this.content)}`, + body: `title=${this.title}&desp=${this.content}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded' }, }) .json(); @@ -666,12 +664,18 @@ export default class NotificationService { private async ntfy() { const { ntfyUrl, ntfyTopic, ntfyPriority } = this.params; + // 编码函数 + const encodeRfc2047 = (text: string, charset: string = 'UTF-8'): string => { + const encodedText = Buffer.from(text).toString('base64'); + return `=?${charset}?B?${encodedText}?=`; + }; try { + const encodedTitle = encodeRfc2047(this.title); const res: any = await got .post(`${ntfyUrl || 'https://ntfy.sh'}/${ntfyTopic}`, { ...this.gotOption, - body: `${this.title}\n${this.content}`, - headers: { 'Title': 'qinglong', 'Priority': `${ntfyPriority || '3'}` }, + body: `${this.content}`, + headers: { 'Title': encodedTitle, 'Priority': `${ntfyPriority || '3'}` }, }); if (res.statusCode === 200) { return true; diff --git a/sample/notify.js b/sample/notify.js index 54f651b8..bf832da2 100644 --- a/sample/notify.js +++ b/sample/notify.js @@ -228,13 +228,11 @@ function serverNotify(text, desp) { if (PUSH_KEY) { // 微信server酱推送通知一个\n不会换行,需要两个\n才能换行,故做此替换 desp = desp.replace(/[\n\r]/g, '\n\n'); - - const matchResult = PUSH_KEY.match(/^sctp(\d+)t/i); const options = { - url: matchResult && matchResult[1] - ? `https://${matchResult[1]}.push.ft07.com/send/${PUSH_KEY}.send` - : `https://sctapi.ftqq.com/${PUSH_KEY}.send`, - body: `text=${encodeURIComponent(text)}&desp=${encodeURIComponent(desp)}`, + url: PUSH_KEY.startsWith('sctp') + ? `https://${PUSH_KEY}.push.ft07.com/send` + : `https://sctapi.ftqq.com/${PUSH_KEY}.send`, + body: `text=${text}&desp=${desp}`, headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, @@ -1195,14 +1193,19 @@ function webhookNotify(text, desp) { } function ntfyNotify(text, desp) { + function encodeRFC2047(text) { + const encodedBase64 = btoa(String.fromCharCode(...new TextEncoder().encode(text))); + return `=?utf-8?B?${encodedBase64}?=`; + } + return new Promise((resolve) => { const { NTFY_URL, NTFY_TOPIC, NTFY_PRIORITY } = push_config; if (NTFY_TOPIC) { const options = { - url: NTFY_URL || `https://ntfy.sh`, - body: `${desp}\n${text}`, + url: `${NTFY_URL || 'https://ntfy.sh'}/${NTFY_TOPIC}`, + body: `${desp}`, headers: { - 'Title': 'qinglong', + 'Title': `${encodeRFC2047(text)}`, 'Priority': NTFY_PRIORITY || '3' }, timeout, @@ -1212,7 +1215,7 @@ function ntfyNotify(text, desp) { if (err) { console.log('Ntfy 通知调用API失败😞\n', err); } else { - if (data.success) { + if (data.id) { console.log('Ntfy 发送通知消息成功🎉\n'); } else { console.log(`Ntfy 发送通知消息异常 ${JSON.stringify(data)}`); @@ -1230,6 +1233,7 @@ function ntfyNotify(text, desp) { }); } + function parseString(input, valueFormatFn) { const regex = /(\w+):\s*((?:(?!\n\w+:).)*)/g; const matches = {}; diff --git a/sample/notify.py b/sample/notify.py index a16da51b..93274c36 100644 --- a/sample/notify.py +++ b/sample/notify.py @@ -116,7 +116,7 @@ push_config = { 'WEBHOOK_BODY': '', # 自定义通知 请求体 'WEBHOOK_HEADERS': '', # 自定义通知 请求头 'WEBHOOK_METHOD': '', # 自定义通知 请求方法 - 'WEBHOOK_CONTENT_TYPE': '' # 自定义通知 content-type + 'WEBHOOK_CONTENT_TYPE': '', # 自定义通知 content-type 'NTFY_URL': '', # ntfy地址,如https://ntfy.sh 'NTFY_TOPIC': '', # ntfy的消息应用topic @@ -302,14 +302,10 @@ def serverJ(title: str, content: str) -> None: print("serverJ 服务启动") data = {"text": title, "desp": content.replace("\n", "\n\n")} - - match = re.match(r'sctp(\d+)t', push_config.get("PUSH_KEY")) - if match: - num = match.group(1) - url = f'https://{num}.push.ft07.com/send/{push_config.get("PUSH_KEY")}.send' + if push_config.get("PUSH_KEY").startswith("sctp"): + url = f'https://{push_config.get("PUSH_KEY")}.push.ft07.com/send' else: url = f'https://sctapi.ftqq.com/{push_config.get("PUSH_KEY")}.send' - response = requests.post(url, data=data).json() if response.get("errno") == 0 or response.get("code") == 0: @@ -785,10 +781,19 @@ def chronocat(title: str, content: str) -> None: print(f"QQ群消息:{ids}推送失败!") +import base64 +import requests + def ntfy(title: str, content: str) -> None: """ 通过 Ntfy 推送消息 """ + def encode_rfc2047(text: str) -> str: + """将文本编码为符合 RFC 2047 标准的格式""" + encoded_bytes = base64.b64encode(text.encode('utf-8')) + encoded_str = encoded_bytes.decode('utf-8') + return f'=?utf-8?B?{encoded_str}?=' + if not push_config.get("NTFY_TOPIC"): print("ntfy 服务的 NTFY_TOPIC 未设置!!\n取消推送") return @@ -798,18 +803,22 @@ def ntfy(title: str, content: str) -> None: print("ntfy 服务的NTFY_PRIORITY 未设置!!默认设置为3") else: priority = push_config.get("NTFY_PRIORITY") - data = (title + "\n" +content).encode(encoding='utf-8') + + # 使用 RFC 2047 编码 title + encoded_title = encode_rfc2047(title) + + data = content.encode(encoding='utf-8') headers = { - "Title": "qinglong", + "Title": encoded_title, # 使用编码后的 title "Priority": priority } + url = push_config.get("NTFY_URL") + "/" + push_config.get("NTFY_TOPIC") response = requests.post(url, data=data, headers=headers) - - if response["code"] == 200: + if response.status_code == 200: # 使用 response.status_code 进行检查 print("Ntfy 推送成功!") else: - print("Ntfy 推送失败!错误信息:", response) + print("Ntfy 推送失败!错误信息:", response.text) def parse_headers(headers): if not headers: @@ -1014,4 +1023,4 @@ def main(): if __name__ == "__main__": - main() + main() \ No newline at end of file