ks-q/js/ksjsb_ck_x.js
2025-11-11 12:59:38 +08:00

112 lines
4.3 KiB
JavaScript
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* @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 };
}