From 5074ce29532500ae1f3ab56a6f7e8831e4eb2ca0 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Sat, 6 May 2023 01:01:11 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=85=20test(sth):=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E5=86=85=E5=AE=B9=EF=BC=8C=E5=AE=8C=E6=88=90=E9=80=9A=E8=BF=87?= =?UTF-8?q?=20cookie=20=E8=8E=B7=E5=8F=96=E6=B8=B8=E6=88=8F=E8=B4=A6?= =?UTF-8?q?=E5=8F=B7=E5=9F=BA=E6=9C=AC=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src-tauri/tauri.conf.json | 2 +- src/core/api/Passport.ts | 2 +- src/core/api/TGApi.ts | 16 ++++++-- src/core/api/Takumi.ts | 3 +- src/core/constant/TGConstant.ts | 11 ++++- src/core/constant/bbs.ts | 3 +- src/core/constant/salt.ts | 2 +- src/core/constant/server.ts | 32 +++++++++++++++ src/core/constant/utils.ts | 9 +++++ src/core/request/TGRequest.ts | 12 ++++-- src/core/request/getGameData.ts | 64 +++++++++++++++++++++++++----- src/core/request/getTokens.ts | 1 + src/core/utils/TGUtils.ts | 3 +- src/core/utils/getDS.ts | 9 +++-- src/core/utils/getRequestHeader.ts | 11 +++-- src/core/utils/tools.ts | 55 ++++++++++++++++++++++++- src/pages/User.vue | 33 +++++++++++++-- src/types/Game.d.ts | 33 +++++++++++++++ src/types/UserRequest.d.ts | 13 ++++++ 19 files changed, 273 insertions(+), 41 deletions(-) create mode 100644 src/core/constant/server.ts create mode 100644 src/core/constant/utils.ts create mode 100644 src/types/Game.d.ts diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index ac8a7328..a8630cb6 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -28,7 +28,7 @@ "https://bbs-api.miyoushe.com/*", "https://bbs.mihoyo.com/*", "https://hk4e-api.mihoyo.com/*", - "https://passport.mihoyo.com/*", + "https://passport-api.mihoyo.com/*", "https://passport-api-v4.mihoyo.com/*" ] }, diff --git a/src/core/api/Passport.ts b/src/core/api/Passport.ts index bcd9780b..ea9fb9be 100644 --- a/src/core/api/Passport.ts +++ b/src/core/api/Passport.ts @@ -5,7 +5,7 @@ * @since Alpha v0.2.0 */ -const PassportApi = "https://passport.mihoyo.com/"; // 基础 API +const PassportApi = "https://passport-api.mihoyo.com/"; // 基础 API const PassportV4Api = "https://passport-api-v4.mihoyo.com/"; // 基础 API const PassportAuthApi = `${PassportApi}account/auth/api/`; // 认证 API diff --git a/src/core/api/TGApi.ts b/src/core/api/TGApi.ts index 9f16a813..74fadc30 100644 --- a/src/core/api/TGApi.ts +++ b/src/core/api/TGApi.ts @@ -8,7 +8,12 @@ import { ENKA_API } from "./ENKA"; import { Hk4eAnnoListApi, Hk4eAnnoContentApi, Hk4eAnnoQuery } from "./Hk4e"; import { PassportTokenApi, PassportCookieTokenApi, PassportVetifyApi } from "./Passport"; -import { TakumiTokensApi, TakumiRecordCardApi, TakumiRecordGenshinCharacterApi, TakumiRecordGenshinIndexApi, TakumiRecordGenshinSpiralAbyssApi, TakumiBingdingRolesApi } from "./Takumi"; +import { + TakumiTokensApi, TakumiRecordCardApi, + TakumiRecordGenshinCharacterApi, TakumiRecordGenshinIndexApi, + TakumiRecordGenshinSpiralAbyssApi, TakumiSTokenBingdingRolesApi, + TakumiCookieBingdingRolesApi, +} from "./Takumi"; // 应用 API const TGApi = { @@ -23,10 +28,15 @@ const TGApi = { vetifyStoken: PassportVetifyApi, // 验证 stoken 有效性 }, GameData: { + byCookie: { + getAccounts: TakumiCookieBingdingRolesApi, // 获取绑定角色 + getCharacter: TakumiRecordGenshinCharacterApi, // 获取角色信息 + }, + bySToken: { + getGameRoles: TakumiSTokenBingdingRolesApi, // 获取绑定角色 + }, getUserCard: TakumiRecordCardApi, // 获取用户卡片 getUserBase: TakumiRecordGenshinIndexApi, // 获取用户基本信息 - getCharacter: TakumiRecordGenshinCharacterApi, // 获取角色信息 - getGameRoles: TakumiBingdingRolesApi, // 获取绑定角色 getAbyss: TakumiRecordGenshinSpiralAbyssApi, // 获取深境螺旋信息 }, }; diff --git a/src/core/api/Takumi.ts b/src/core/api/Takumi.ts index 5864b870..eb485c3d 100644 --- a/src/core/api/Takumi.ts +++ b/src/core/api/Takumi.ts @@ -17,4 +17,5 @@ export const TakumiRecordCardApi = `${TakumiRecordApi}game_record/app/card/wapi/ export const TakumiRecordGenshinIndexApi = `${TakumiRecordGenshinApi}index`; // 原神游戏记录索引 API export const TakumiRecordGenshinCharacterApi = `${TakumiRecordGenshinApi}character`; // 原神游戏记录角色 API export const TakumiRecordGenshinSpiralAbyssApi = `${TakumiRecordGenshinApi}spiralAbyss`; // 原神游戏记录深境螺旋 API -export const TakumiBingdingRolesApi = `${TakumiBindingApi}getUserGameRolesByStoken`; // 获取绑定角色 API +export const TakumiSTokenBingdingRolesApi = `${TakumiBindingApi}getUserGameRolesBySToken`; // 获取绑定角色 API-根据 stoken +export const TakumiCookieBingdingRolesApi = `${TakumiBindingApi}getUserGameRolesByCookie`; // 获取绑定角色 API-根据 Cookie diff --git a/src/core/constant/TGConstant.ts b/src/core/constant/TGConstant.ts index e753a96d..9e008845 100644 --- a/src/core/constant/TGConstant.ts +++ b/src/core/constant/TGConstant.ts @@ -5,14 +5,21 @@ * @since Alpha v0.2.0 */ -import { BBS_VERSION, BBS_HEADER_AGENT } from "./bbs"; +import { BBS_VERSION, BBS_HEADER_AGENT, BBS_REFERER } from "./bbs"; import SALT from "./salt"; +import SERVER from "./server"; +import { GAME_BIZ } from "./utils"; const TGConstant = { - SALT, BBS: { VERSION: BBS_VERSION, USER_AGENT: BBS_HEADER_AGENT, + REFERER: BBS_REFERER, + }, + SALT, + SERVER, + UTILS: { + GAME_BIZ, }, }; diff --git a/src/core/constant/bbs.ts b/src/core/constant/bbs.ts index a37dd4c6..dd4e4d2d 100644 --- a/src/core/constant/bbs.ts +++ b/src/core/constant/bbs.ts @@ -5,5 +5,6 @@ * @since Alpha v0.2.0 */ -export const BBS_VERSION = "2.11.1"; +export const BBS_VERSION = "2.49.1"; export const BBS_HEADER_AGENT = `Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/${BBS_VERSION}`; +export const BBS_REFERER = "https://webstatic.mihoyo.com"; diff --git a/src/core/constant/salt.ts b/src/core/constant/salt.ts index c4388216..d6ace8ce 100644 --- a/src/core/constant/salt.ts +++ b/src/core/constant/salt.ts @@ -16,7 +16,7 @@ const SALT = { LK2: "DG8lqMyc9gquwAUFc7zBS62ijQRX9XF7", }, Other: { - X4: "OYcKGMRDRpnluotQHWwPDnV4xZG4WRMx", + X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs", X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v", }, }; diff --git a/src/core/constant/server.ts b/src/core/constant/server.ts new file mode 100644 index 00000000..d154d565 --- /dev/null +++ b/src/core/constant/server.ts @@ -0,0 +1,32 @@ +/** + * @file core constant server.ts + * @description 服务器地址常量文件 + * @auther BTMuli + * @since Alpha v0.2.0 + */ + +/** + * @description 服务器地址 + * @since Alpha v0.2.0 + * @enum {string} + * @readonly + * @property {string} CN_ISLAND 国服-天空岛 + * @property {string} CN_TREE 国服-世界树 + * @property {string} OS_USA 美服 + * @property {string} OS_EURO 欧服 + * @property {string} OS_AISA 亚服 + * @property {string} OS_CHT 台服 + * @property {string} UNKNOWN 未知 + * @returns {string} 服务器地址 + */ +enum SERVER { + CN_ISLAND = "cn_gf01", + CN_TREE = "cn_qd01", + OS_USA = "os_usa", + OS_EURO = "os_euro", + OS_AISA = "os_asia", + OS_CHT = "os_cht", + UNKNOWN = "unknown", +}; + +export default SERVER; diff --git a/src/core/constant/utils.ts b/src/core/constant/utils.ts new file mode 100644 index 00000000..991a8c6d --- /dev/null +++ b/src/core/constant/utils.ts @@ -0,0 +1,9 @@ +/** + * @file core constant utils.ts + * @description 一些杂项的常量 + * @author BTMuli + * @since Alpha v0.2.0 + */ + +// game_biz +export const GAME_BIZ = "hk4e_cn"; diff --git a/src/core/request/TGRequest.ts b/src/core/request/TGRequest.ts index 84a53fee..d497b989 100644 --- a/src/core/request/TGRequest.ts +++ b/src/core/request/TGRequest.ts @@ -7,7 +7,7 @@ import { getAnnoList, getAnnoContent } from "./getAnno"; import { getTokensByLoginTicket, getLtokenByStoken, getCookieTokenByStoken, vetifyStoken } from "./getTokens"; -import { getGameCard, getGameRoles } from "./getGameData"; +import { getGameCard, getGameAccountsbyCookie, getAccountsbyStoken, getGameRoleList } from "./getGameData"; const TGRequest = { Anno: { @@ -17,10 +17,16 @@ const TGRequest = { User: { getTokens: getTokensByLoginTicket, getLToken: getLtokenByStoken, - getCookieToken: getCookieTokenByStoken, + byCookie: { + getAccounts: getGameAccountsbyCookie, + getCharacter: getGameRoleList, + }, + byStoken: { + getAccounts: getAccountsbyStoken, + getCookieToken: getCookieTokenByStoken, + }, vetifyStoken, getGameCard, - getGameRoles, }, }; diff --git a/src/core/request/getGameData.ts b/src/core/request/getGameData.ts index 83bb32d5..491169f4 100644 --- a/src/core/request/getGameData.ts +++ b/src/core/request/getGameData.ts @@ -10,6 +10,7 @@ import { http } from "@tauri-apps/api"; // utils import TGApi from "../api/TGApi"; import TGUtils from "../utils/TGUtils"; +import TGConstant from "../constant/TGConstant"; /** * @description 获取用户游戏数据 @@ -37,25 +38,66 @@ export async function getGameCard (cookie: BTMuli.User.Base.Cookie): Promise} 用户绑定角色 */ -export async function getGameRoles (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { - const url = TGApi.GameData.getGameRoles; - const ck = TGUtils.Tools.cookieToString(cookie); - const query = `stoken=${stoken}`; - const header = TGUtils.User.getHeader(ck, query); +export async function getGameRolesbyStoken (cookie: string, stoken: string): Promise { + const url = TGApi.GameData.bySToken.getGameRoles; + console.log("url:", url); + // eslint-disable-next-line camelcase + const data = { stoken, game_biz: TGConstant.UTILS.GAME_BIZ }; + const header = TGUtils.User.getHeader(cookie, "", JSON.stringify(data)); console.log("header:", header); - console.log("stoken:", stoken); return await http.fetch(url, { method: "GET", headers: header, - body: http.Body.json({ - stoken, - }), + body: http.Body.json(data), + }).then((res) => { + console.log(res.data); + return res.data; + }); +} + +/** + * @description 获取用户绑定游戏账号-通过cookie + * @since Alpha v0.2.0 + * @param {string} cookie 用户的 Cookie + * @returns {Promise} 用户绑定角色 + */ +export async function getGameAccountsbyCookie (cookie: string): Promise { + const url = `${TGApi.GameData.byCookie.getAccounts}?game_biz=${TGConstant.UTILS.GAME_BIZ}`; + const header = TGUtils.User.getHeader(cookie, ""); + return await http.fetch(url, { + method: "GET", + headers: header, + }).then((res) => { + console.log(res.data); + if (res.data.retcode !== 0) return res.data; + return res.data.data.list; + }); +} + +/** + * @description 获取用户角色列表 + * @since Alpha v0.2.0 + * @param {string} cookie 用户的 Cookie + * @param {string} uid 用户 uid + * @returns {Promise} 用户角色列表 + */ +export async function getGameRoleList (cookie: string, uid: string): Promise { + const url = TGApi.GameData.byCookie.getCharacter; + // eslint-disable-next-line camelcase + const data = { role_id: uid, server: TGUtils.Tools.getServerByUid(uid) }; + const header = TGUtils.User.getHeader(cookie, "", JSON.stringify(data)); + console.log("header:", header); + return await http.fetch(url, { + method: "POST", + headers: header, + body: http.Body.json(data), }).then((res) => { console.log(res.data); return res.data; diff --git a/src/core/request/getTokens.ts b/src/core/request/getTokens.ts index 1849453b..b3401be6 100644 --- a/src/core/request/getTokens.ts +++ b/src/core/request/getTokens.ts @@ -64,6 +64,7 @@ export async function getLtokenByStoken (cookie: BTMuli.User.Base.Cookie, stoken */ export async function getCookieTokenByStoken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { const url = `${TGApi.GameTokens.getCookieToken}?stoken=${stoken}`; + console.log(url); const ck = TGUtils.Tools.cookieToString(cookie); const query = `stoken=${stoken}`; const header = TGUtils.User.getHeader(ck, query); diff --git a/src/core/utils/TGUtils.ts b/src/core/utils/TGUtils.ts index 28cd39de..43221377 100644 --- a/src/core/utils/TGUtils.ts +++ b/src/core/utils/TGUtils.ts @@ -8,7 +8,7 @@ import { parseAnnoContent } from "./parseAnno"; import { getAnnoCard } from "./getAnnoCard"; import { getRequestHeader } from "./getRequestHeader"; -import { cookieToString } from "./tools"; +import { cookieToString, getServerByUid } from "./tools"; const TGUtils = { Anno: { @@ -20,6 +20,7 @@ const TGUtils = { }, Tools: { cookieToString, + getServerByUid, }, }; diff --git a/src/core/utils/getDS.ts b/src/core/utils/getDS.ts index f13a6ccf..9497ea8f 100644 --- a/src/core/utils/getDS.ts +++ b/src/core/utils/getDS.ts @@ -5,8 +5,7 @@ * @since Alpha v0.2.0 */ -// Tauri.Genshin -import { MD5 } from "./tools"; +import { MD5, random, qs } from "./tools"; import TGConstant from "../constant/TGConstant"; /** @@ -18,14 +17,16 @@ import TGConstant from "../constant/TGConstant"; * @returns {string} ds */ export function getDS (query: string, body: string = ""): string { + console.log("ds.query", query); + console.log("ds.body", body); const params = { salt: TGConstant.SALT.Other.X4, t: Math.floor(Date.now() / 1000).toString(), - r: Math.floor(Math.random() * 100000 + 100000).toString(), + r: random(100000, 200000).toString(), b: body, q: query, }; - const paramStr = `salt=${params.salt}&t=${params.t}&r=${params.r}&b=${params.b}&q=${params.q}`; + const paramStr = qs(params); const md5Str = MD5(paramStr); const ds = `${params.t},${params.r},${md5Str}`; return ds; diff --git a/src/core/utils/getRequestHeader.ts b/src/core/utils/getRequestHeader.ts index 9def15eb..b2f801e8 100644 --- a/src/core/utils/getRequestHeader.ts +++ b/src/core/utils/getRequestHeader.ts @@ -12,20 +12,19 @@ import { getDS } from "./getDS"; * @description 获取请求头 * @since Alpha v0.2.0 * @param {string} cookie cookie - * @param {string} q query - * @param {string} b body + * @param {string} query query + * @param {string} body body * @returns {Record} 请求头 */ -export function getRequestHeader (cookie: string, q: string, b: string = ""): Record { +export function getRequestHeader (cookie: string, query: string, body: string = ""): Record { const header = { "User-Agent": TGConstant.BBS.USER_AGENT, // "x-requested-with": "com.mihoyo.hyperion", "x-rpc-app_version": TGConstant.BBS.VERSION, "x-rpc-client_type": "5", - Origin: "https://webstatic.mihoyo.com/", Referer: "https://webstatic.mihoyo.com/", - DS: getDS(q, b), - Cookie: cookie, + DS: getDS(query, body), + cookie, }; return header; } diff --git a/src/core/utils/tools.ts b/src/core/utils/tools.ts index 5a755d74..e8a77479 100644 --- a/src/core/utils/tools.ts +++ b/src/core/utils/tools.ts @@ -6,7 +6,8 @@ */ import md5 from "js-md5"; -import qs from "qs"; +import { stringify } from "qs"; +import TGConstant from "../constant/TGConstant"; /** * @description 转义正则表达式 @@ -52,6 +53,31 @@ export function MD5 (data: string): string { return md5.update(data).hex(); } +/** + * @description 获取随机数 + * @since Alpha v0.2.0 + * @param {number} min 最小值 + * @param {number} max 最大值 + * @returns {number} 随机数 + */ +export function random (min: number, max: number): number { + return Math.floor(Math.random() * (max - min + 1) + min); +} + +/** + * @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 将 ck JSON 对象转换为字符串 * @since Alpha v0.2.0 @@ -59,7 +85,32 @@ export function MD5 (data: string): string { * @returns {string} ck 字符串 */ export function cookieToString (ck: object): string { - let res = qs.stringify(ck); + let res = stringify(ck); res = res.replace(/&/g, ";"); return res; } + +/** + * @description 根据 uid 获取 server + * @since Alpha v0.2.0 + * @param {string} uid uid + * @returns {string} server + */ +export function getServerByUid (uid: string): string { + // 获取第一个字符 + const first = uid[0]; + // 1-4 为国服-天空岛 + if (first >= "1" && first <= "4") return TGConstant.SERVER.CN_ISLAND; + // 5 为国服-世界树 + if (first === "5") return TGConstant.SERVER.CN_TREE; + // 6 为美服 + if (first === "6") return TGConstant.SERVER.OS_USA; + // 7 为欧服 + if (first === "7") return TGConstant.SERVER.OS_EURO; + // 8 为亚服 + if (first === "8") return TGConstant.SERVER.OS_AISA; + // 9 为台服 + if (first === "9") return TGConstant.SERVER.OS_CHT; + // 其他情况返回未知 + return TGConstant.SERVER.UNKNOWN; +} diff --git a/src/pages/User.vue b/src/pages/User.vue index 20b0bd07..2e8d41b2 100644 --- a/src/pages/User.vue +++ b/src/pages/User.vue @@ -19,6 +19,12 @@ 获取绑定角色 + + 获取绑定角色 v2 + + + 获取 cookieToken +