mirror of
https://github.com/truewhile/MeBox.git
synced 2026-10-01 20:16:36 +08:00
开发
This commit is contained in:
@@ -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 || '未设置'));
|
||||
}
|
||||
Reference in New Issue
Block a user