mirror of
https://github.com/whyour/qinglong.git
synced 2025-05-24 07:16:08 +08:00
Merge branch 'develop' into develop
This commit is contained in:
commit
022e42f8bb
|
@ -360,6 +360,31 @@ export function parseHeaders(headers: string) {
|
||||||
return parsed;
|
return parsed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function parseString(input: string): Record<string, string> {
|
||||||
|
const regex = /(\w+):\s*((?:(?!\n\w+:).)*)/g;
|
||||||
|
const matches: Record<string, string> = {};
|
||||||
|
|
||||||
|
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(
|
export function parseBody(
|
||||||
body: string,
|
body: string,
|
||||||
contentType:
|
contentType:
|
||||||
|
@ -372,28 +397,7 @@ export function parseBody(
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsed: any = {};
|
const parsed = parseString(body);
|
||||||
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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
switch (contentType) {
|
switch (contentType) {
|
||||||
case 'multipart/form-data':
|
case 'multipart/form-data':
|
||||||
|
|
|
@ -53,7 +53,8 @@ RUN set -x \
|
||||||
&& rm -rf /root/.pnpm-store \
|
&& rm -rf /root/.pnpm-store \
|
||||||
&& rm -rf /root/.local/share/pnpm/store \
|
&& rm -rf /root/.local/share/pnpm/store \
|
||||||
&& rm -rf /root/.cache \
|
&& rm -rf /root/.cache \
|
||||||
&& rm -rf /root/.npm
|
&& rm -rf /root/.npm \
|
||||||
|
&& ulimit -c 0
|
||||||
|
|
||||||
ARG SOURCE_COMMIT
|
ARG SOURCE_COMMIT
|
||||||
RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
||||||
|
|
|
@ -57,7 +57,8 @@ RUN set -x \
|
||||||
&& rm -rf /root/.pnpm-store \
|
&& rm -rf /root/.pnpm-store \
|
||||||
&& rm -rf /root/.local/share/pnpm/store \
|
&& rm -rf /root/.local/share/pnpm/store \
|
||||||
&& rm -rf /root/.cache \
|
&& rm -rf /root/.cache \
|
||||||
&& rm -rf /root/.npm
|
&& rm -rf /root/.npm \
|
||||||
|
&& ulimit -c 0
|
||||||
|
|
||||||
ARG SOURCE_COMMIT
|
ARG SOURCE_COMMIT
|
||||||
RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
RUN git clone --depth=1 -b ${QL_BRANCH} ${QL_URL} ${QL_DIR} \
|
||||||
|
|
|
@ -816,7 +816,18 @@ function ChangeUserId(desp) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function qywxamNotify(text, desp) {
|
async function qywxamNotify(text, desp) {
|
||||||
|
const MAX_LENGTH = 900;
|
||||||
|
if (desp.length > MAX_LENGTH) {
|
||||||
|
let d = desp.substr(0, MAX_LENGTH) + "\n==More==";
|
||||||
|
await do_qywxamNotify(text, d);
|
||||||
|
await qywxamNotify(text, desp.substr(MAX_LENGTH));
|
||||||
|
} else {
|
||||||
|
return await do_qywxamNotify(text,desp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_qywxamNotify(text, desp) {
|
||||||
return new Promise((resolve) => {
|
return new Promise((resolve) => {
|
||||||
if (QYWX_AM) {
|
if (QYWX_AM) {
|
||||||
const QYWX_AM_AY = QYWX_AM.split(',');
|
const QYWX_AM_AY = QYWX_AM.split(',');
|
||||||
|
@ -1315,6 +1326,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) {
|
function parseHeaders(headers) {
|
||||||
if (!headers) return {};
|
if (!headers) return {};
|
||||||
|
|
||||||
|
@ -1344,28 +1380,7 @@ function parseBody(body, contentType) {
|
||||||
return body;
|
return body;
|
||||||
}
|
}
|
||||||
|
|
||||||
const parsed = {};
|
const parsed = parseString(body);
|
||||||
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;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
switch (contentType) {
|
switch (contentType) {
|
||||||
case 'multipart/form-data':
|
case 'multipart/form-data':
|
||||||
|
|
|
@ -646,7 +646,9 @@ def aibotk(title: str, content: str, **kwargs) -> None:
|
||||||
and push_config.get("AIBOTK_NAME")
|
and push_config.get("AIBOTK_NAME")
|
||||||
)
|
)
|
||||||
):
|
):
|
||||||
print("智能微秘书 的 AIBOTK_KEY 或者 AIBOTK_TYPE 或者 AIBOTK_NAME 未设置!!\n取消推送")
|
print(
|
||||||
|
"智能微秘书 的 AIBOTK_KEY 或者 AIBOTK_TYPE 或者 AIBOTK_NAME 未设置!!\n取消推送"
|
||||||
|
)
|
||||||
return
|
return
|
||||||
print("智能微秘书 服务启动")
|
print("智能微秘书 服务启动")
|
||||||
if kwargs.get("AIBOTK_KEY") and kwargs.get("AIBOTK_TYPE") and kwargs.get("AIBOTK_NAME"):
|
if kwargs.get("AIBOTK_KEY") and kwargs.get("AIBOTK_TYPE") and kwargs.get("AIBOTK_NAME"):
|
||||||
|
@ -863,29 +865,25 @@ def parse_headers(headers):
|
||||||
return parsed
|
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):
|
def parse_body(body, content_type):
|
||||||
if not body or content_type == "text/plain":
|
if not body or content_type == "text/plain":
|
||||||
return body
|
return body
|
||||||
|
|
||||||
parsed = {}
|
parsed = parse_string(input_string)
|
||||||
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
|
|
||||||
|
|
||||||
if content_type == "application/x-www-form-urlencoded":
|
if content_type == "application/x-www-form-urlencoded":
|
||||||
data = urlencode(parsed, doseq=True)
|
data = urlencode(parsed, doseq=True)
|
||||||
|
|
|
@ -68,13 +68,13 @@ const Log = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSelect = (value: any, node: any) => {
|
const onSelect = (value: any, node: any) => {
|
||||||
setCurrentNode(node);
|
|
||||||
setSelect(value);
|
|
||||||
|
|
||||||
if (node.key === select || !value) {
|
if (node.key === select || !value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setCurrentNode(node);
|
||||||
|
setSelect(value);
|
||||||
|
|
||||||
if (node.type === 'directory') {
|
if (node.type === 'directory') {
|
||||||
setValue(intl.get('请选择日志文件'));
|
setValue(intl.get('请选择日志文件'));
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -115,13 +115,13 @@ const Script = () => {
|
||||||
};
|
};
|
||||||
|
|
||||||
const onSelect = (value: any, node: any) => {
|
const onSelect = (value: any, node: any) => {
|
||||||
setSelect(node.key);
|
|
||||||
setCurrentNode(node);
|
|
||||||
|
|
||||||
if (node.key === select || !value) {
|
if (node.key === select || !value) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
setSelect(node.key);
|
||||||
|
setCurrentNode(node);
|
||||||
|
|
||||||
if (node.type === 'directory') {
|
if (node.type === 'directory') {
|
||||||
setValue(intl.get('请选择脚本文件'));
|
setValue(intl.get('请选择脚本文件'));
|
||||||
return;
|
return;
|
||||||
|
|
18
version.yaml
18
version.yaml
|
@ -1,13 +1,7 @@
|
||||||
version: 2.17.1
|
version: 2.17.2
|
||||||
changeLogLink: https://t.me/jiao_long/402
|
changeLogLink: https://t.me/jiao_long/403
|
||||||
publishTime: 2024-02-07 23:00
|
publishTime: 2024-03-02 17:00
|
||||||
changeLog: |
|
changeLog: |
|
||||||
1. 系统设置增加重启
|
1. 依赖管理支持队列中依赖取消安装,支持状态筛选
|
||||||
2. 修复 debian 系统内更新源代码分支错误
|
2. 修复 webhook 通知 body 拆分逻辑
|
||||||
3. 修复启动时依赖配置未初始化
|
3. 企业微信有长度限制,超长的进行分段提交 https://github.com/pharaoh2012
|
||||||
4. 修复未开启一言时多余空行, 通知渠道改发送前检查,感谢 https://github.com/Cp0204
|
|
||||||
5. Dockerfile 添加发布端口和数据卷 https://github.com/Akimio521
|
|
||||||
6. 修复有反向代理时脚本管理获取文件可能失败
|
|
||||||
7. 脚本管理重命名增加默认值,增加新建(mod+o)、删除快捷键(mod+d)
|
|
||||||
8. 修复对比工具保存文件
|
|
||||||
9. 其他 bug 修复
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user