♻️ 减少耦合

This commit is contained in:
BTMuli
2023-05-20 12:53:44 +08:00
parent 51b8d0277a
commit 4899879b02
9 changed files with 40 additions and 69 deletions

31
package-lock.json generated
View File

@@ -15,7 +15,6 @@
"js-md5": "^0.7.3",
"pinia": "^2.0.36",
"pinia-plugin-persistedstate": "^3.1.0",
"qs": "^6.11.1",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql",
"vue": "^3.3.1",
"vue-json-viewer": "^3.0.4",
@@ -26,7 +25,6 @@
"@tauri-apps/cli": "^1.3.1",
"@types/js-md5": "^0.7.0",
"@types/node": "^20.1.2",
"@types/qs": "^6.9.7",
"@typescript-eslint/eslint-plugin": "^5.59.5",
"@typescript-eslint/parser": "^5.59.5",
"@vitejs/plugin-vue": "^4.2.2",
@@ -530,12 +528,6 @@
"integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==",
"dev": true
},
"node_modules/@types/qs": {
"version": "6.9.7",
"resolved": "https://registry.npmmirror.com/@types/qs/-/qs-6.9.7.tgz",
"integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==",
"dev": true
},
"node_modules/@types/semver": {
"version": "7.5.0",
"resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.0.tgz",
@@ -1190,6 +1182,7 @@
"version": "1.0.2",
"resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
@@ -2711,7 +2704,8 @@
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/function.prototype.name": {
"version": "1.1.5",
@@ -2747,6 +2741,7 @@
"version": "1.2.1",
"resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
"integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
@@ -3003,6 +2998,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
@@ -3038,6 +3034,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz",
"integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -3046,6 +3043,7 @@
"version": "1.0.3",
"resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
@@ -3983,7 +3981,8 @@
"node_modules/object-inspect": {
"version": "1.12.3",
"resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.12.3.tgz",
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g=="
"integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==",
"dev": true
},
"node_modules/object-keys": {
"version": "1.1.1",
@@ -4489,17 +4488,6 @@
"node": ">=6"
}
},
"node_modules/qs": {
"version": "6.11.2",
"resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.2.tgz",
"integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
}
},
"node_modules/queue-microtask": {
"version": "1.2.3",
"resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -4998,6 +4986,7 @@
"version": "1.0.4",
"resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",

View File

@@ -48,7 +48,6 @@
"js-md5": "^0.7.3",
"pinia": "^2.0.36",
"pinia-plugin-persistedstate": "^3.1.0",
"qs": "^6.11.1",
"tauri-plugin-sql-api": "github:tauri-apps/tauri-plugin-sql",
"vue": "^3.3.1",
"vue-json-viewer": "^3.0.4",
@@ -59,7 +58,6 @@
"@tauri-apps/cli": "^1.3.1",
"@types/js-md5": "^0.7.0",
"@types/node": "^20.1.2",
"@types/qs": "^6.9.7",
"@typescript-eslint/eslint-plugin": "^5.59.5",
"@typescript-eslint/parser": "^5.59.5",
"@vitejs/plugin-vue": "^4.2.2",

View File

@@ -7,13 +7,10 @@
// tauri
import { http } from "@tauri-apps/api";
// Node
import qs from "qs";
// api
import TGApi from "../api/TGApi";
// utils
import TGUtils from "../utils/TGUtils";
import { transCookie } from "../utils/tools";
/**
* @description 根据 stoken 获取 cookie_token
@@ -29,7 +26,7 @@ export async function getCookieTokenBySToken (stuid: string, stoken: string): Pr
stoken,
};
const params = { stoken };
const header = TGUtils.User.getHeader(transCookie(cookie), "GET", qs.stringify(params), "common");
const header = TGUtils.User.getHeader(cookie, "GET", params, "common");
return await http.fetch<BTMuli.User.Response.CookieToken>(url, {
method: "GET",
headers: header,

View File

@@ -7,13 +7,10 @@
// tauri
import { http } from "@tauri-apps/api";
// Node
import qs from "qs";
// api
import TGApi from "../api/TGApi";
// utils
import TGUtils from "../utils/TGUtils";
import { transCookie } from "../utils/tools";
import TGConstant from "../constant/TGConstant";
/**
@@ -30,7 +27,6 @@ export async function getGameAccountsBySToken (stoken: string, stuid: string): P
stoken,
};
const params = { stoke: stoken, game_biz: TGConstant.Utils.GAME_BIZ };
const header = TGUtils.User.getHeader(transCookie(cookie), "GET", qs.stringify(params), "common");
return await getGameAccounts(url, cookie, params);
}
@@ -60,7 +56,7 @@ export async function getGameAccountsByCookie (cookie_token: string, account_id:
* @returns {Promise<BTMuli.User.Game.Account[]|BTMuli.Genshin.Base.Response>}
*/
async function getGameAccounts (url: string, cookie: Record<string, string>, params: Record<string, string>): Promise<BTMuli.User.Game.Account[] | BTMuli.Genshin.Base.Response> {
const header = TGUtils.User.getHeader(transCookie(cookie), "GET", qs.stringify(params), "common");
const header = TGUtils.User.getHeader(cookie, "GET", params, "common");
return await http.fetch<BTMuli.User.Response.GameAccounts>(url, {
method: "GET",
headers: header,

View File

@@ -7,13 +7,10 @@
// tauri
import { http } from "@tauri-apps/api";
// Node
import qs from "qs";
// api
import TGApi from "../api/TGApi";
// utils
import TGUtils from "../utils/TGUtils";
import { transCookie } from "../utils/tools";
/**
* @description 根据 stoken 获取 ltoken
@@ -29,7 +26,7 @@ export async function getLTokenBySToken (stuid: string, stoken: string): Promise
stoken,
};
const params = { stoken };
const header = TGUtils.User.getHeader(transCookie(cookie), "GET", qs.stringify(params), "common");
const header = TGUtils.User.getHeader(cookie, "GET", params, "common");
return await http.fetch<BTMuli.User.Response.LToken>(url, {
method: "GET",
headers: header,

View File

@@ -7,13 +7,10 @@
// tauri
import { http } from "@tauri-apps/api";
// Node
import qs from "qs";
// api
import TGApi from "../api/TGApi";
// utils
import TGUtils from "../utils/TGUtils";
import { transCookie } from "../utils/tools";
/**
* @description 根据 login_ticket 获取游戏 Token包括 stoken 和 ltoken
@@ -30,7 +27,7 @@ export async function getTokensByLoginTicket (ticket: string, uid: string): Prom
const url = TGApi.GameTokens.getTokens;
// eslint-disable-next-line camelcase
const params = { login_ticket: ticket, token_types: 3, uid };
const header = TGUtils.User.getHeader(transCookie(cookie), "GET", qs.stringify(params), "common");
const header = TGUtils.User.getHeader(cookie, "GET", params, "common");
return await http.fetch<BTMuli.User.Response.Tokens>(url, {
method: "GET",
headers: header,

View File

@@ -7,30 +7,26 @@
// tauri
import { http } from "@tauri-apps/api";
// Node
import qs from "qs";
// api
import TGApi from "../api/TGApi";
// utils
import TGUtils from "../utils/TGUtils";
import { transCookie } from "../utils/tools";
/**
* @description 验证 stoken 有效性,返回 mid
* @description 验证 ltoken 有效性,返回 mid
* @since Alpha v0.2.0
* @param {string} ltoken ltoken
* @param {string} ltuid 登录用户 uid
* @param {string} stoken stoken
* @returns {Promise<string | BTMuli.Genshin.Base.Response>}
*/
export async function verifyLToken (ltoken: string, ltuid: string, stoken: string): Promise<string | BTMuli.Genshin.Base.Response> {
export async function verifyLToken (ltoken: string, ltuid: string): Promise<string | BTMuli.Genshin.Base.Response> {
const url = TGApi.GameTokens.verifyLToken;
const cookie = {
ltoken,
ltuid,
};
const data = { stoken };
const header = TGUtils.User.getHeader(transCookie(cookie), "POST", qs.stringify(data), "common");
const data = { ltoken };
const header = TGUtils.User.getHeader(cookie, "POST", data, "common");
console.log("header:", header);
return await http.fetch<BTMuli.User.Response.Verify>(url, {
method: "POST",

View File

@@ -7,9 +7,9 @@
// Node
import md5 from "js-md5";
import qs from "qs";
// Tauri.Genshin
import TGConstant from "../constant/TGConstant";
import { transCookie, transParams } from "./tools";
/**
* @description 获取 salt
@@ -56,26 +56,26 @@ function getDS (method: string, data: string, saltType: string): string {
const body = method === "GET" ? "" : data;
const query = method === "GET" ? data : "";
const hashStr = `salt=${salt}&t=${time}&r=${random}&b=${body}&q=${query}`;
const md5Str = md5.update(qs.stringify(hashStr)).hex();
const md5Str = md5.update(hashStr).hex();
return `${time},${random},${md5Str}`;
}
/**
* @description 获取请求头
* @since Alpha v0.2.0
* @param {string} cookie cookie
* @param {Record<string, string>} cookie cookie
* @param {string} method 请求方法
* @param {string} data 请求数据
* @param {Record<string, string|number>} data 请求数据
* @param {string} saltType salt 类型
* @returns {Record<string, string>} 请求头
*/
export function getRequestHeader (cookie: string, method: string, data: string, saltType: string): Record<string, string> {
export function getRequestHeader (cookie: Record<string, string>, method: string, data: Record<string, string | number>, saltType: string): Record<string, string> {
return {
"User-Agent": TGConstant.BBS.USER_AGENT,
"x-rpc-app_version": TGConstant.BBS.VERSION,
"x-rpc-client_type": "5",
Referer: "https://webstatic.mihoyo.com/",
DS: getDS(method, data, saltType),
Cookie: cookie,
DS: getDS(method, transParams(data), saltType),
Cookie: transCookie(cookie),
};
}

View File

@@ -42,20 +42,6 @@ export function getRandomString (length: number): string {
return res;
}
/**
* @description object 转换为 query string
* @since Alpha v0.2.0
* @param {Record<string, string>} obj object
* @param {boolean} encode 是否编码
* @returns {string} query string
*/
export function qs (obj: Record<string, string>, encode: boolean = false): string {
let res = "";
for (const [k, v] of Object.entries(obj)) res += `${k}=${encode ? encodeURIComponent(v) : v}&`;
res = res.slice(0, res.length - 1);
return res;
}
/**
* @description 将 cookie 对象转换为字符串
* @since Alpha v0.2.0
@@ -70,6 +56,21 @@ export function transCookie (cookie: Record<string, string>) {
return res;
}
/**
* @description ds 算法需要数据转换后的字符串是按照字典序排序的
* @since Alpha v0.2.0
* @param {Record<string, string|number>} obj object
* @returns {string} query string
*/
export function transParams (obj: Record<string, string | number>): string {
let res = "";
const keys = Object.keys(obj).sort();
for (const key of keys) {
res += `${key}=${obj[key]}&`;
}
return res.slice(0, -1);
}
/**
* @description 根据 uid 获取 server
* @since Alpha v0.2.0