From 04d66b765a84f810e5768253f28deb7a7f29f0fe Mon Sep 17 00:00:00 2001 From: Hermes Date: Fri, 15 May 2026 21:20:52 +0800 Subject: [PATCH] =?UTF-8?q?=E4=B8=8A=E4=BC=A0=E6=96=87=E4=BB=B6=E8=87=B3?= =?UTF-8?q?=E3=80=8Cjs=E3=80=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- js/qlck.js | 206 +++++++++++++++++++++++++++++++++++++++++++++ js/今日新闻.js | 18 ++++ js/历史上的今天.js | 18 ++++ js/消息推送群1.js | 103 +++++++++++++++++++++++ 4 files changed, 345 insertions(+) create mode 100644 js/qlck.js create mode 100644 js/今日新闻.js create mode 100644 js/历史上的今天.js create mode 100644 js/消息推送群1.js diff --git a/js/qlck.js b/js/qlck.js new file mode 100644 index 0000000..86a3213 --- /dev/null +++ b/js/qlck.js @@ -0,0 +1,206 @@ +//[create_at: 2026-03-18 20:45:00] +//[router: /m/myck] +//[method: get] +//[method: post] +//[title: qlck] +//[author: authook] +//[class: 工具类] +//[price: 0] +//[disable: false] +//[version: 2.3] +//[service: authook] +//[description: 青龙CK同步API:将CK同步到autMan已对接的青龙面板。] + +//==========================参数配置数据=============================== +//[param: {"required":true,"key":"otto.vhook_qlck_token","bool":false,"placeholder":"鉴权token","name":"接口鉴权Token","desc":"鉴权token,自定义鉴权token(防止恶意调用)"}] +//[param: {"required":false,"key":"otto.vhook_ql_default","bool":false,"placeholder":"青龙容器全称","name":"默认青龙容器名","desc":"未指定容器时,默认同步到此名称的青龙容器(全称匹配)"}] + +/** + * 核心逻辑: + * 1. 参考 消息推送群1.js 的解析风格。 + * 2. 支持 GET/POST 参数混合读取。 + * 3. 探测回复使用 JSON 对象以防网页无法渲染。 + */ + +const method = getMethod() +const params = getRouterParams() || {} + +var j = { + "ok": true, + "status": "ok", + "retcode": 0, + "msg": "success" +} + +// 1. 数据解析 +let access_token = params.access_token || params.token || "" +let ck = params.ck || params.cookie || "" +let env_name = params.env_name || "" +let ql_name = params.ql_name || "" +let mode = params.mode || "replace" +let joiner = params.joiner || "\n" + +if (method == "post") { + const data = getRouterData() + if (data) { + try { + const body = JSON.parse(data) + access_token = body.access_token || body.token || access_token + ck = body.ck || body.cookie || ck + env_name = body.env_name || env_name + ql_name = body.ql_name || ql_name + mode = body.mode || mode + joiner = body.joiner || joiner + match = body.match || "" // 新增:匹配关键字 + } catch (e) { + console.error("JSON解析失败: " + e.message) + } + } +} + +// 如果 GET 方式下也有 match +if (typeof match === "undefined") match = "" + +// --- 探测逻辑提示 (无参数访问) --- +if (!access_token && !ck && !env_name) { + j.msg = "接口已启用" + j.version = "2.3" + sender.reply(j) + // 退出 +} else { + // 2. 鉴权 + const configured_token = get("vhook_qlck_token") + if (configured_token && configured_token !== access_token) { + sender.reply({ "ok": false, "status": "fail", "retcode": -1, "msg": "token错误" }) + } else if (!ck || !env_name) { + sender.reply({ "ok": false, "status": "fail", "retcode": -2, "msg": "ck 或 env_name 不能为空" }) + } else { + // 3. 执行同步逻辑 + try { + main_sync(ck, env_name, ql_name, mode, joiner) + } catch (e) { + sender.reply({ "ok": false, "status": "error", "msg": "执行中出现异常: " + e.message }) + } + } +} + +function main_sync(ck, env_name, ql_name, mode, joiner) { + // 读取容器 + let ql_configs = [] + const ql_ids = bucketKeys("qls") + if (ql_ids) { + for (let id of ql_ids) { + let val = bucketGet("qls", id) + if (val) { + try { + let conf = JSON.parse(val) + ql_configs.push(conf) + } catch (e) { } + } + } + } + + if (ql_configs.length === 0) { + sender.reply({ "ok": false, "retcode": -3, "msg": "未在面板[青龙管理]中添加容器" }) + return + } + + // 确定容器列表 + let target_ql_name = ql_name || get("vhook_ql_default") || "" + let target_qls = [] + if (target_ql_name) { + target_qls = ql_configs.filter(ql => ql.name === target_ql_name) + } else { + target_qls = [ql_configs[0]] + } + + if (target_qls.length === 0) { + sender.reply({ "ok": false, "retcode": -4, "msg": "未找到名为 [" + target_ql_name + "] 的容器" }) + return + } + + let results = [] + for (let target_ql of target_qls) { + let ql_res = { container: target_ql.name, ok: false, msg: "" } + let host = target_ql.host.replace(/\/+$/, "") + + // 分步执行 + let loginUrl = host + "/open/auth/token?client_id=" + target_ql.client_id + "&client_secret=" + target_ql.client_secret + let loginResp = request({ url: loginUrl, method: "get", dataType: "json" }) + + if (loginResp && loginResp.code == 200 && loginResp.data && loginResp.data.token) { + let ql_token = loginResp.data.token + let envsResp = request({ + url: host + "/open/envs?searchValue=" + env_name, + method: "get", + headers: { "Authorization": "Bearer " + ql_token }, + dataType: "json" + }) + + let existing = null + if (envsResp && envsResp.code == 200 && Array.isArray(envsResp.data)) { + existing = envsResp.data.find(e => e.name === env_name) + } + + if (existing && mode !== "add") { + let final_ck = ck + let envId = existing.id || existing._id + if (mode === "append") { + // 追加/精准聚合模式 + if (match) { + // 如果提供了匹配键,执行“局部替换” + let items = existing.value.split(joiner) + let found = false + items = items.map(item => { + if (item.indexOf(match) > -1) { + found = true + return ck // 用新 CK 替换该子项 + } + return item + }) + if (!found) items.push(ck) // 如果没找到匹配项,仍执行追加 + final_ck = items.join(joiner) + } else { + // 原有的普通去重追加逻辑 + if (existing.value.indexOf(ck) === -1) { + final_ck = existing.value + joiner + ck + } else { + ql_res.ok = true; ql_res.msg = "CK已存在,跳过"; results.push(ql_res); continue + } + } + } + + let updateResp = request({ + url: host + "/open/envs", + method: "put", + headers: { "Authorization": "Bearer " + ql_token, "Content-Type": "application/json" }, + body: { id: envId, name: env_name, value: final_ck, remarks: existing.remarks || "" }, + dataType: "json" + }) + if (updateResp && updateResp.code == 200) { + ql_res.ok = true; ql_res.msg = "更新成功" + } else { + ql_res.msg = "更新失败: " + JSON.stringify(updateResp) + } + } else { + let createResp = request({ + url: host + "/open/envs", + method: "post", + headers: { "Authorization": "Bearer " + ql_token, "Content-Type": "application/json" }, + body: [{ name: env_name, value: ck, remarks: "qlck同步" }], + dataType: "json" + }) + if (createResp && createResp.code == 200) { + ql_res.ok = true; ql_res.msg = "新建成功" + } else { + ql_res.msg = "新建失败: " + JSON.stringify(createResp) + } + } + } else { + ql_res.msg = "登录失败: " + JSON.stringify(loginResp) + } + results.push(ql_res) + } + + sender.reply({ "ok": results.every(r => r.ok), "results": results }) +} diff --git a/js/今日新闻.js b/js/今日新闻.js new file mode 100644 index 0000000..4338ce0 --- /dev/null +++ b/js/今日新闻.js @@ -0,0 +1,18 @@ +//[author: funyhook] +//[create_at: 2023-02-09 10:36:11] +//[public: true] +//[title: 今日新闻] +//[version: 1.0] +//[description: 今日新闻top10 ] +//[class: 生活类] +//[price: 0.1] +//[rule: ^今日新闻$] +//[disable: false] +//======================= +//脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 您必须在下载后的24小时内从计算机或手机中完全删除此脚本 + + +function main() { + sendImage("https://api.03c3.cn/api/zb") +} +main() \ No newline at end of file diff --git a/js/历史上的今天.js b/js/历史上的今天.js new file mode 100644 index 0000000..a0ec3ad --- /dev/null +++ b/js/历史上的今天.js @@ -0,0 +1,18 @@ +//[author: funyhook] +//[create_at: 2023-02-09 10:36:11] +//[public: true] +//[title: 历史上的今天] +//[version: 1.0] +//[description: 历史上的今天 ] +//[class: 生活类] +//[price: 0.1] +//[rule: 历史上的今天] +//[disable: false] +//======================= +//脚本及其中涉及的任何解锁和解密分析脚本,仅用于测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。 您必须在下载后的24小时内从计算机或手机中完全删除此脚本 + + +function main() { + sendImage("https://xiaoapi.cn/API/lssdjt_pic.php") +} +main() \ No newline at end of file diff --git a/js/消息推送群1.js b/js/消息推送群1.js new file mode 100644 index 0000000..f08c65e --- /dev/null +++ b/js/消息推送群1.js @@ -0,0 +1,103 @@ +//[create_at: 2024-02-28 14:29:43] +//[router: /m/push1] +//[method: get] +//[method: post] +//[title: 消息推送群1] +//[author: authook] +//[create_at: 2023-11-09 09:17:51] +//[class: 工具类] +//[price: 0] +//[disable:false] +//[version: 3.1] +//[service: authook] +//[description: autman消息推送api(支持通过调用接口推送到任何对接autman的平台) :http://ip:port/m/push1 ] +//==========================参数配置数据(最下面)=============================== +//[param: {"required":true,"key":"otto.vhook_m_push_token1","bool":false,"placeholder":"鉴权token","name":"鉴权token","desc":"鉴权token,自定义鉴权token(防止恶意调用)"}] +//[param: {"required":true,"key":"otto.vhook_push_group1","bool":true,"placeholder":"是否推送群","name":"推送群开关","desc":"是否推送群"}] +//[param: {"required":true,"key":"otto.vhook_m_push_groups1","bool":false,"placeholder":"wx:123456,qq:123456","name":"推送群","desc":"退群群:wx:123456,qq:123456"}] +//[param: {"required":true,"key":"otto.vhook_push_person1","bool":true,"placeholder":"是否推送个人","name":"推送个人开关","desc":"是否推送个人"}] +//[param: {"required":true,"key":"otto.vhook_m_push_persons1","bool":false,"placeholder":"wx:123456,qq:123456","name":"推送个人","desc":"推送个人:wx:123456,qq:123456"}] + +const router = getRouter() +console.error("路由:" + router) +const method = getMethod() +console.error("方法:" + method) + + +var j = { + "ok": true, + "status":"ok", + "retcode": 0, + "msg":"success" +} +let message = "" +let access_token = "" +if(method=="get"){ + const params = getRouterParams() + console.error("参数:" + JSON.stringify(params)) + message = params.message + access_token = params.access_token + console +}else{ + const data = getRouterData() + console.error("内容:" + JSON.stringify(data)) + let datajson = JSON.parse(data); + console.error(`路由流程==>路由:${router} 方法:${method} body:${data}`) + message = datajson.message + access_token = datajson.access_token +} +message = message.replace("标题:", "").replace("内容:", "") +console.error(message) +token = get("vhook_m_push_token1") +console.error(token) +console.error(access_token) +if(token && token !== access_token){ + j = { + "ok": false, + "status":"fail", + "retcode": -1, + "msg":"token错误" + } + sender.reply(j) +} + + +if(get("vhook_push_group1")){ + if(get("vhook_m_push_groups1")){ + let groups = get("vhook_m_push_groups1").split(",") + console.log(groups) + groups.forEach(item => { + console.log(item) + let imType = item.split(":")[0] + let group = item.split(":")[1] + push({ + imType: imType, //发送到指定渠道,如qq,wx,必须 + userID: undefined, //groupCode不为0时为@指定用户,可选 + groupCode: group, //可选 + chatID:group, + content: message + }) //给指定im发送消息 + }); + } +} +if(get("vhook_push_person1")){ + if(get("vhook_m_push_persons1")){ + let groups = get("vhook_m_push_persons1").split(",") + console.log(groups) + groups.forEach(item => { + console.log(item) + let imType = item.split(":")[0] + let group = item.split(":")[1] + push({ + imType: imType, //发送到指定渠道,如qq,wx,必须 + userID: group, //groupCode不为0时为@指定用户,可选 + // groupCode: group, //可选 + // chatID:group, + content: message + }) //给指定im发送消息 + }); + } +} +sender.reply(j) + +