112 lines
4.3 KiB
JavaScript
112 lines
4.3 KiB
JavaScript
/*
|
||
* @name: 快手 Salt 获取
|
||
* @description: 抓取快手登录响应以获取 Salt
|
||
* @author:
|
||
* @version: 1.0.1
|
||
*
|
||
* 脚本使用方法:
|
||
* 1. 将此脚本保存到 Quantumult X 的脚本目录中 (例如 iCloud/QuantumultX/Scripts/)。
|
||
* 2. 在 Quantumult X 配置文件 ([rewrite_local] 部分) 中添加以下行:
|
||
* https:\/\/txjp\.gifshow\.com\/rest\/nebula\/user\/login\/mobileVerifyCode url script-response-body https://raw.githubusercontent.com/your/repo/ks_salt_notify.js
|
||
* (请将上面的 URL 替换为您自己的脚本路径)
|
||
* 3. 在 Quantumult X 配置文件 ([mitm] 部分) 中添加主机名:
|
||
* hostname = txjp.gifshow.com
|
||
* 4. 打开快手 App,触发登录或刷新登录状态 (访问上述 URL)。
|
||
* 5. 成功后,脚本会自动弹出通知显示获取到的 "kuaishou.api_client_salt" 值。
|
||
*/
|
||
|
||
// ###############################
|
||
// ###### 脚本主逻辑 ######
|
||
// ###############################
|
||
|
||
const $ = new Env();
|
||
|
||
(async () => {
|
||
$.log('ℹ️ 开始处理响应: ' + $request.url);
|
||
|
||
try {
|
||
// 1. 解析响应体
|
||
const body = JSON.parse($response.body);
|
||
|
||
// 2. 从响应体中获取 kuaishou.api_client_salt
|
||
const salt = body?.['kuaishou.api_client_salt'];
|
||
|
||
if (salt) {
|
||
// 3. 获取成功,发出通知
|
||
$.log(`✅ 成功获取 kuaishou.api_client_salt: ${salt}`);
|
||
$.notify("快手Salt获取成功", "点击通知可复制", salt);
|
||
} else {
|
||
// 4. 检查是否有错误信息
|
||
if (body?.error_msg) {
|
||
$.log(`❌ 服务器返回错误: ${body.error_msg}`);
|
||
$.notify("快手Salt获取失败", "服务器错误", body.error_msg);
|
||
} else {
|
||
// 5. 未找到salt字段
|
||
$.log('❌ 未在响应体中找到 kuaishou.api_client_salt');
|
||
$.log('响应体内容: ' + $response.body);
|
||
$.notify("快手Salt获取失败", "响应体中未找到", "请检查响应数据。");
|
||
}
|
||
}
|
||
} catch (e) {
|
||
$.logErr(e);
|
||
$.log('响应体内容: ' + $response.body);
|
||
$.notify("快手Salt脚本出错", "解析响应体失败", e.message);
|
||
}
|
||
})().catch((e) => {
|
||
$.logErr(e);
|
||
$.notify("快手Salt脚本异常", "发生未知错误", e.message);
|
||
}).finally(() => {
|
||
$.done();
|
||
});
|
||
|
||
|
||
// 兼容多环境的 Env 类
|
||
function Env() {
|
||
const isQuanX = typeof $task !== 'undefined';
|
||
const isSurge = typeof $httpClient !== 'undefined' && !isQuanX;
|
||
const isLoon = typeof $loon !== 'undefined';
|
||
const isNode = typeof require === 'function';
|
||
|
||
const http = {
|
||
get: (options) => {
|
||
return new Promise((resolve, reject) => {
|
||
if (isQuanX) $task.fetch(options).then(resp => resolve(resp), err => reject(err));
|
||
else if (isSurge || isLoon) $httpClient.get(options, (err, resp, body) => err ? reject(err) : resolve({ body, status: resp.statusCode, headers: resp.headers }));
|
||
else if (isNode) {
|
||
const request = require('request');
|
||
request(options, (err, resp, body) => err ? reject(err) : resolve({ body, status: resp.statusCode, headers: resp.headers }));
|
||
}
|
||
});
|
||
},
|
||
post: (options) => {
|
||
return new Promise((resolve, reject) => {
|
||
if (isQuanX) $task.fetch(options).then(resp => resolve(resp), err => reject(err));
|
||
else if (isSurge || isLoon) $httpClient.post(options, (err, resp, body) => err ? reject(err) : resolve({ body, status: resp.statusCode, headers: resp.headers }));
|
||
else if (isNode) {
|
||
const request = require('request');
|
||
request.post(options, (err, resp, body) => err ? reject(err) : resolve({ body, status: resp.statusCode, headers: resp.headers }));
|
||
}
|
||
});
|
||
},
|
||
put: (options) => {
|
||
return new Promise((resolve, reject) => {
|
||
if (isQuanX) $task.fetch({ ...options, method: 'PUT' }).then(resp => resolve(resp), err => reject(err));
|
||
// ... 其他环境的实现
|
||
});
|
||
}
|
||
};
|
||
|
||
const notify = (title, subtitle = '', body = '') => {
|
||
if (isQuanX) $notify(title, subtitle, body);
|
||
else console.log(`${title}\n${subtitle}\n${body}`);
|
||
};
|
||
|
||
const log = (msg) => console.log(msg);
|
||
const logErr = (e) => console.log(e);
|
||
|
||
const done = (value = {}) => isQuanX ? $done(value) : null;
|
||
|
||
return { http, notify, log, logErr, done };
|
||
}
|
||
|