This commit is contained in:
truewhile
2026-09-30 19:22:24 +08:00
parent fa41936095
commit c1ff55ffbf
28 changed files with 3793 additions and 201 deletions
+117
View File
@@ -0,0 +1,117 @@
// 测试用 jsLib:模拟聚合类书源的公共函数库结构。
//
// 真实书源(如光遇聚合)的 jsLib 有十几万字符,但关键结构就是这些:
// 用 source.getVariable 做设置读写、用 cookie 存取凭证、用 BaseUrl() 拼接口地址。
// 该文件由 JSRunner 在创建时执行一次,其函数对后续所有规则 JS 可见。
// 同时保留了源码里常见的 lexical 声明(let hosts),验证跨执行可见性。
// 当前书源版本号
let localVersion = '26.9.29.1';
// 初始服务器列表
let hosts = [
'https://v1.example-aggregate.com',
'https://v2.example-aggregate.com'
];
// 源变量默认值
const defaultConfig = {
线路: hosts[0],
发现页来源: '番茄'
};
// 获取源变量
function getVariable(k) {
if (k == undefined) k = "";
let parsed = {};
try {
parsed = JSON.parse(source.getVariable());
} catch (e) {}
if (k == "") {
return parsed;
}
let value = parsed[k];
if (value == undefined) {
value = defaultConfig[k];
}
return value != undefined ? value : "";
}
// 设置源变量
function setVariable(k, v, t) {
if (t == undefined) t = true;
const vs = getVariable();
vs[k] = v;
source.setVariable(JSON.stringify(vs, null, 4));
if (k != '云端配置' && t) {
java.toast('设置 ' + k + ' 为 ' + v);
}
}
// 获取正在使用的线路
function BaseUrl() {
let h = getVariable("线路");
if (!h || String(h) == "undefined") {
h = hosts[0];
}
return h;
}
// 获取登陆 token
function getToken() {
let hostsbk = getVariable('云端配置') && getVariable('云端配置')['hosts'] || hosts;
for (let i = 0; i < hostsbk.length; i++) {
let cookieValue = String(cookie.getCookie(hostsbk[i]));
let parts = cookieValue.split(";");
for (let j = 0; j < parts.length; j++) {
if (parts[j].indexOf("qttoken") != -1) {
return parts[j].split("=")[1];
}
}
}
return "";
}
// 设置 ck
function setAllCookies(ck) {
let hostsbk = hosts;
for (let i = 0; i < hostsbk.length; i++) {
cookie.setCookie(hostsbk[i], ck);
}
}
// 移除 ck
function removeAllCookies() {
for (let i = 0; i < hosts.length; i++) {
cookie.removeCookie(hosts[i]);
}
java.toast('已退出登陆');
}
// 请求封装(自动带 token)
function request(url, method, body) {
if (method == undefined) method = 'GET';
if (body == undefined) body = {};
let urla = url;
if (url.indexOf('http') != 0) {
urla = BaseUrl() + url;
}
let qttoken = getToken();
let options = {
method: method,
headers: {
'cookie': 'qttoken=' + qttoken,
'Content-Type': 'application/json'
},
body: JSON.stringify(body)
};
return java.ajax(urla + ',' + JSON.stringify(options));
}
function parseJsonSafely(str) {
try {
return JSON.parse(str);
} catch (e) {
return null;
}
}
@@ -0,0 +1,46 @@
[
{
"name": "线路设置",
"type": "button",
"action": "switchLine()",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
},
{
"name": "邮箱",
"type": "text"
},
{
"name": "密码",
"type": "password"
},
{
"name": "🔅登录账号",
"type": "button",
"action": "login(true)",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
},
{
"name": "🔐注册账号",
"type": "button",
"action": "register()",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
},
{
"name": " 🔚 退出登录",
"type": "button",
"action": "logout()",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
},
{
"name": "🪪 查看信息",
"type": "button",
"action": "checkStatus()",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
},
{
"name": "🏝用户后台",
"type": "button",
"action": "user()",
"style": { "layout_flexGrow": 1, "layout_flexBasisPercent": 0.4 }
}
]
@@ -0,0 +1,67 @@
// 测试用 loginUrl:模拟聚合类书源的登录逻辑。
//
// 约定与 legado 一致:
// - loginUrl 本身是一段 JS,既是登录逻辑,也是 loginUi 各按钮 action 的函数库;
// - 表单值通过作用域里的 result 对象读取;
// - 成功与否靠抛异常区分(返回值被忽略)。
function login(flag) {
let token = getToken();
if (String(token).length > 10) {
java.longToast('当前已登录,请退出登录后重新登录');
return true;
}
let email = result.邮箱;
let pwd = result.密码;
if (!email || !pwd) {
java.longToast('请先输入账号密码!');
return false;
}
try {
let data = request('/login_api', 'POST', {
register_email: email,
password: pwd
});
let response = parseJsonSafely(data);
if (response && response.code == 0) {
setAllCookies('qttoken=' + response.key);
java.longToast('✅️登录成功');
return true;
}
java.longToast('❌登录失败:' + ((response && response.msg) || '未知错误'));
return false;
} catch (e) {
java.longToast('❌登录失败,服务器错误');
return false;
}
}
// 退出登陆
function logout() {
removeAllCookies();
}
// 用户后台(需要浏览器打开)
function user() {
if (String(getToken()).length < 10) {
java.longToast('请先登陆');
return;
}
java.startBrowserAwait(BaseUrl() + '/user', '用户后台');
}
// 查看信息
function checkStatus() {
if (String(getToken()).length < 10) {
java.longToast('请先登陆');
return;
}
let res = parseJsonSafely(request('/user_api', 'POST'));
if (!res || res.id == undefined) {
java.toast('获取用户信息失败');
return;
}
result.邮箱 = res.email;
source.putLoginInfo(JSON.stringify(result));
java.longToast('昵称:' + (res.nickname || '未设置'));
}