From 4899879b024960bf1c45fdef5792ef59bda3ab48 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Sat, 20 May 2023 12:53:44 +0800 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=E5=87=8F=E5=B0=91?= =?UTF-8?q?=E8=80=A6=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 31 ++++++++++-------------------- package.json | 2 -- src/web/request/getCookieToken.ts | 5 +---- src/web/request/getGameAccounts.ts | 6 +----- src/web/request/getLToken.ts | 5 +---- src/web/request/getTokens.ts | 5 +---- src/web/request/verifyLToken.ts | 12 ++++-------- src/web/utils/getRequestHeader.ts | 14 +++++++------- src/web/utils/tools.ts | 29 ++++++++++++++-------------- 9 files changed, 40 insertions(+), 69 deletions(-) diff --git a/package-lock.json b/package-lock.json index 84d3ac83..d06e2b0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 52b8979d..8f2337a0 100644 --- a/package.json +++ b/package.json @@ -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", diff --git a/src/web/request/getCookieToken.ts b/src/web/request/getCookieToken.ts index 415a9c55..bcbe52a4 100644 --- a/src/web/request/getCookieToken.ts +++ b/src/web/request/getCookieToken.ts @@ -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(url, { method: "GET", headers: header, diff --git a/src/web/request/getGameAccounts.ts b/src/web/request/getGameAccounts.ts index d1c5476c..22d8a3ac 100644 --- a/src/web/request/getGameAccounts.ts +++ b/src/web/request/getGameAccounts.ts @@ -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} */ async function getGameAccounts (url: string, cookie: Record, params: Record): Promise { - 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(url, { method: "GET", headers: header, diff --git a/src/web/request/getLToken.ts b/src/web/request/getLToken.ts index 5ee06ff7..dc2325e4 100644 --- a/src/web/request/getLToken.ts +++ b/src/web/request/getLToken.ts @@ -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(url, { method: "GET", headers: header, diff --git a/src/web/request/getTokens.ts b/src/web/request/getTokens.ts index afc958d1..a02a4532 100644 --- a/src/web/request/getTokens.ts +++ b/src/web/request/getTokens.ts @@ -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(url, { method: "GET", headers: header, diff --git a/src/web/request/verifyLToken.ts b/src/web/request/verifyLToken.ts index b31e7212..cb1b349c 100644 --- a/src/web/request/verifyLToken.ts +++ b/src/web/request/verifyLToken.ts @@ -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} */ -export async function verifyLToken (ltoken: string, ltuid: string, stoken: string): Promise { +export async function verifyLToken (ltoken: string, ltuid: string): Promise { 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(url, { method: "POST", diff --git a/src/web/utils/getRequestHeader.ts b/src/web/utils/getRequestHeader.ts index 243ed934..21897f43 100644 --- a/src/web/utils/getRequestHeader.ts +++ b/src/web/utils/getRequestHeader.ts @@ -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} cookie cookie * @param {string} method 请求方法 - * @param {string} data 请求数据 + * @param {Record} data 请求数据 * @param {string} saltType salt 类型 * @returns {Record} 请求头 */ -export function getRequestHeader (cookie: string, method: string, data: string, saltType: string): Record { +export function getRequestHeader (cookie: Record, method: string, data: Record, saltType: string): Record { 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), }; } diff --git a/src/web/utils/tools.ts b/src/web/utils/tools.ts index bec3565d..5b65c330 100644 --- a/src/web/utils/tools.ts +++ b/src/web/utils/tools.ts @@ -42,20 +42,6 @@ export function getRandomString (length: number): string { return res; } -/** - * @description object 转换为 query string - * @since Alpha v0.2.0 - * @param {Record} obj object - * @param {boolean} encode 是否编码 - * @returns {string} query string - */ -export function qs (obj: Record, 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) { return res; } +/** + * @description ds 算法需要数据转换后的字符串是按照字典序排序的 + * @since Alpha v0.2.0 + * @param {Record} obj object + * @returns {string} query string + */ +export function transParams (obj: Record): 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