From 11c789c71c32b2247e5cbc421d615ce5334547c7 Mon Sep 17 00:00:00 2001 From: whyour Date: Sun, 25 Feb 2024 15:27:48 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=20webhook=20=E9=80=9A?= =?UTF-8?q?=E7=9F=A5=20body=20=E6=8B=86=E5=88=86=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- back/config/util.ts | 48 +++++++++++++++++++++----------------- sample/notify.js | 48 +++++++++++++++++++++----------------- sample/notify.py | 38 ++++++++++++++---------------- src/pages/log/index.tsx | 6 ++--- src/pages/script/index.tsx | 6 ++--- 5 files changed, 76 insertions(+), 70 deletions(-) diff --git a/back/config/util.ts b/back/config/util.ts index 0872547a..4f53280a 100644 --- a/back/config/util.ts +++ b/back/config/util.ts @@ -360,6 +360,31 @@ export function parseHeaders(headers: string) { return parsed; } +function parseString(input: string): Record { + const regex = /(\w+):\s*((?:(?!\n\w+:).)*)/g; + const matches: Record = {}; + + let match; + while ((match = regex.exec(input)) !== null) { + const [, key, value] = match; + const _key = key.trim(); + if (!_key || matches[_key]) { + continue; + } + + const _value = value.trim(); + + try { + const jsonValue = JSON.parse(_value); + matches[_key] = jsonValue; + } catch (error) { + matches[_key] = _value; + } + } + + return matches; +} + export function parseBody( body: string, contentType: @@ -372,28 +397,7 @@ export function parseBody( return body; } - const parsed: any = {}; - let key; - let val; - let i; - - body && - body.split('\n').forEach(function parser(line) { - i = line.indexOf(':'); - key = line.substring(0, i).trim(); - 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; - } - }); + const parsed = parseString(body); switch (contentType) { case 'multipart/form-data': diff --git a/sample/notify.js b/sample/notify.js index 74776b0f..1e5eee95 100644 --- a/sample/notify.js +++ b/sample/notify.js @@ -1315,6 +1315,31 @@ function webhookNotify(text, desp) { }); } +function parseString(input) { + const regex = /(\w+):\s*((?:(?!\n\w+:).)*)/g; + const matches = {}; + + let match; + while ((match = regex.exec(input)) !== null) { + const [, key, value] = match; + const _key = key.trim(); + if (!_key || matches[_key]) { + continue; + } + + const _value = value.trim(); + + try { + const jsonValue = JSON.parse(_value); + matches[_key] = jsonValue; + } catch (error) { + matches[_key] = _value; + } + } + + return matches; +} + function parseHeaders(headers) { if (!headers) return {}; @@ -1344,28 +1369,7 @@ function parseBody(body, contentType) { return body; } - 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(); - 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; - } - }); + const parsed = parseString(body); switch (contentType) { case 'multipart/form-data': diff --git a/sample/notify.py b/sample/notify.py index 66fc5c1e..1cb4a944 100644 --- a/sample/notify.py +++ b/sample/notify.py @@ -578,7 +578,9 @@ def aibotk(title: str, content: str) -> None: or not push_config.get("AIBOTK_TYPE") or not push_config.get("AIBOTK_NAME") ): - print("智能微秘书 的 AIBOTK_KEY 或者 AIBOTK_TYPE 或者 AIBOTK_NAME 未设置!!\n取消推送") + print( + "智能微秘书 的 AIBOTK_KEY 或者 AIBOTK_TYPE 或者 AIBOTK_NAME 未设置!!\n取消推送" + ) return print("智能微秘书 服务启动") @@ -748,29 +750,25 @@ def parse_headers(headers): return parsed +def parse_string(input_string): + matches = {} + pattern = r'(\w+):\s*((?:(?!\n\w+:).)*)' + regex = re.compile(pattern) + for match in regex.finditer(input_string): + key, value = match.group(1).strip(), match.group(2).strip() + try: + json_value = json.loads(value) + matches[key] = json_value + except: + matches[key] = value + return matches + + def parse_body(body, content_type): if not body or content_type == "text/plain": return body - parsed = {} - lines = body.split("\n") - - for line in lines: - i = line.find(":") - if i == -1: - continue - - key = line[:i].strip() - val = line[i + 1 :].strip() - - if not key or key in parsed: - continue - - try: - json_value = json.loads(val) - parsed[key] = json_value - except: - parsed[key] = val + parsed = parse_string(input_string) if content_type == "application/x-www-form-urlencoded": data = urlencode(parsed, doseq=True) diff --git a/src/pages/log/index.tsx b/src/pages/log/index.tsx index f2fc232a..818a74e1 100644 --- a/src/pages/log/index.tsx +++ b/src/pages/log/index.tsx @@ -68,13 +68,13 @@ const Log = () => { }; const onSelect = (value: any, node: any) => { - setCurrentNode(node); - setSelect(value); - if (node.key === select || !value) { return; } + setCurrentNode(node); + setSelect(value); + if (node.type === 'directory') { setValue(intl.get('请选择日志文件')); return; diff --git a/src/pages/script/index.tsx b/src/pages/script/index.tsx index b46954e9..10251b1b 100644 --- a/src/pages/script/index.tsx +++ b/src/pages/script/index.tsx @@ -115,13 +115,13 @@ const Script = () => { }; const onSelect = (value: any, node: any) => { - setSelect(node.key); - setCurrentNode(node); - if (node.key === select || !value) { return; } + setSelect(node.key); + setCurrentNode(node); + if (node.type === 'directory') { setValue(intl.get('请选择脚本文件')); return;