上传文件至「js」
This commit is contained in:
+206
@@ -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 })
|
||||||
|
}
|
||||||
+18
@@ -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()
|
||||||
@@ -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()
|
||||||
+103
@@ -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)
|
||||||
|
|
||||||
|
|
||||||
Reference in New Issue
Block a user