diff --git a/src/core/request/getTokens.ts b/src/core/request/getTokens.ts deleted file mode 100644 index 92370375..00000000 --- a/src/core/request/getTokens.ts +++ /dev/null @@ -1,104 +0,0 @@ -/** - * @file core request getTokens.ts - * @description 获取游戏 Token - * @author BTMuli - * @since Alpha v0.2.0 - */ - -// tauri -import { http } from "@tauri-apps/api"; -// api -import TGApi from "../api/TGApi"; -// utils -import TGUtils from "../utils/TGUtils"; - -/** - * @description 根据 login_ticket 获取游戏 Token,包括 stoken 和 ltoken - * @since Alpha v0.2.0 - * @param {BTMuli.User.Base.Cookie} cookie 用户 Cookie - * @returns {Promise} - */ -export async function getTokensByLoginTicket (cookie: BTMuli.User.Base.Cookie): Promise { - const url = `${TGApi.GameTokens.getTokens}?login_ticket=${cookie.login_ticket}&token_types=3&uid=${cookie.login_uid}`; - const ck = TGUtils.Tools.cookieToString(cookie); - const query = `login_ticket=${cookie.login_ticket}&token_types=3&uid=${cookie.login_uid}`; - const header = TGUtils.User.getHeader(ck, query); - console.log("header:", header); - return await http.fetch(url, { - method: "GET", - headers: header, - }).then((res) => { - if (res.data.retcode !== 0) return res.data; - return res.data.data.list; - }); -} - -/** - * @description 根据 stoken 获取 ltoken - * @since Alpha v0.2.0 - * @param {BTMuli.User.Base.Cookie} cookie 用户 Cookie - * @param {string} stoken stoken - * @returns {Promise} - */ -export async function getLtokenBySToken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { - const url = `${TGApi.GameTokens.getLToken}`; - const ck = TGUtils.Tools.cookieToString(cookie); - const query = `stoken=${stoken}`; - const header = TGUtils.User.getHeader(ck, query); - console.log("header:", header); - return await http.fetch(url, { - method: "POST", - headers: header, - }).then((res) => { - console.log(res.data); - if (res.data.retcode !== 0) return res.data; - }); -} - -/** - * @description 根据 stoken 获取 cookieToken - * @since Alpha v0.2.0 - * @param {BTMuli.User.Base.Cookie} cookie 用户 Cookie - * @param {string} stoken stoken - * @returns {Promise} - */ -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); - console.log("header:", header); - return await http.fetch(url, { - method: "GET", - headers: header, - }).then((res) => { - console.log(res.data); - return res.data; - }); -} - -/** - * @description 验证 stoken 有效性 - * @since Alpha v0.2.0 - * @param {BTMuli.User.Base.Cookie} cookie 用户 Cookie - * @param {string} stoken stoken - * @returns {Promise} - */ -export async function vetifySToken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { - const url = `${TGApi.GameTokens.vetifyStoken}`; - const ck = TGUtils.Tools.cookieToString(cookie); - const query = `stoken=${stoken}`; - const header = TGUtils.User.getHeader(ck, query); - console.log("header:", header); - return await http.fetch(url, { - method: "POST", - headers: header, - body: http.Body.json({ - stoken, - }), - }).then((res) => { - console.log(res.data); - return res.data; - }); -} diff --git a/src/core/utils/getDS.ts b/src/core/utils/getDS.ts deleted file mode 100644 index 9497ea8f..00000000 --- a/src/core/utils/getDS.ts +++ /dev/null @@ -1,33 +0,0 @@ -/** - * @description ds 算法 - * @since Alpha v0.2.0 - * @author BTMuli - * @since Alpha v0.2.0 - */ - -import { MD5, random, qs } from "./tools"; -import TGConstant from "../constant/TGConstant"; - -/** - * @description 获取 ds - * @since Alpha v0.2.0 - * @version 2.34.1 - * @param {string} query 查询字符串 - * @param {string} body 请求体 - * @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: random(100000, 200000).toString(), - b: body, - q: query, - }; - const paramStr = qs(params); - const md5Str = MD5(paramStr); - const ds = `${params.t},${params.r},${md5Str}`; - return ds; -} diff --git a/src/pages/Announcements.vue b/src/pages/Announcements.vue index 100ee5ed..e73fb72f 100644 --- a/src/pages/Announcements.vue +++ b/src/pages/Announcements.vue @@ -99,8 +99,8 @@ import TLoading from "../components/t-loading.vue"; // store import { useAppStore } from "../store/modules/app"; // utils -import TGRequest from "../core/request/TGRequest"; -import TGUtils from "../core/utils/TGUtils"; +import TGRequest from "../web/request/TGRequest"; +import TGUtils from "../web/utils/TGUtils"; import { createTGWindow } from "../utils/TGWindow"; // store diff --git a/src/pages/Config.vue b/src/pages/Config.vue index bc6838f1..ad675c05 100644 --- a/src/pages/Config.vue +++ b/src/pages/Config.vue @@ -171,7 +171,7 @@ import { useAchievementsStore } from "../store/modules/achievements"; // utils import { backupUiafData, restoreUiafData } from "../utils/UIAF"; import TGSqlite from "../utils/TGSqlite"; -import TGRequest from "../core/request/TGRequest"; +import TGRequest from "../web/request/TGRequest"; // Store const appStore = useAppStore(); diff --git a/src/views/t-anno-json.vue b/src/views/t-anno-json.vue index 8752338a..a262fd4b 100644 --- a/src/views/t-anno-json.vue +++ b/src/views/t-anno-json.vue @@ -24,7 +24,7 @@ import TSwitchTheme from "../components/t-switchTheme.vue"; // tauri import { appWindow } from "@tauri-apps/api/window"; // utils -import TGRequest from "../core/request/TGRequest"; +import TGRequest from "../web/request/TGRequest"; // loading const loading = ref(true as boolean); diff --git a/src/views/t-anno.vue b/src/views/t-anno.vue index 2e1f9ee4..2be51189 100644 --- a/src/views/t-anno.vue +++ b/src/views/t-anno.vue @@ -24,8 +24,8 @@ import TSwitchTheme from "../components/t-switchTheme.vue"; // tauri import { appWindow } from "@tauri-apps/api/window"; // plugins -import TGRequest from "../core/request/TGRequest"; -import TGUtils from "../core/utils/TGUtils"; +import TGRequest from "../web/request/TGRequest"; +import TGUtils from "../web/utils/TGUtils"; // loading const loading = ref(true as boolean); diff --git a/src/core/api/ENKA.ts b/src/web/api/ENKA.ts similarity index 74% rename from src/core/api/ENKA.ts rename to src/web/api/ENKA.ts index 734a429d..208af966 100644 --- a/src/core/api/ENKA.ts +++ b/src/web/api/ENKA.ts @@ -1,8 +1,8 @@ /** - * @file core api ENKA.ts + * @file web api ENKA.ts * @description ENKA API * @author BTMuli - * @since Alpha v0.1.3 + * @since Alpha v0.2.0 */ export const ENKA_API = "https://enka.network/api/uid/"; // 基础 API diff --git a/src/core/api/Hk4e.ts b/src/web/api/Hk4e.ts similarity index 91% rename from src/core/api/Hk4e.ts rename to src/web/api/Hk4e.ts index 52467068..22715f2e 100644 --- a/src/core/api/Hk4e.ts +++ b/src/web/api/Hk4e.ts @@ -1,8 +1,8 @@ /** - * @file core api Hk4e.ts + * @file web api Hk4e.ts * @description 定义 Hk4e API * @author BTMuli - * @since Alpha v0.1.2 + * @since Alpha v0.2.0 */ const Hk4eApi = "https://hk4e-api.mihoyo.com"; // 基础 API diff --git a/src/core/api/Passport.ts b/src/web/api/Passport.ts similarity index 86% rename from src/core/api/Passport.ts rename to src/web/api/Passport.ts index ea9fb9be..8f06ff75 100644 --- a/src/core/api/Passport.ts +++ b/src/web/api/Passport.ts @@ -1,5 +1,5 @@ /** - * @file core api Passport.ts + * @file web api Passport.ts * @description 定义 Passport API * @author BTMuli * @since Alpha v0.2.0 @@ -11,4 +11,4 @@ const PassportAuthApi = `${PassportApi}account/auth/api/`; // 认证 API export const PassportTokenApi = `${PassportAuthApi}getLTokenBySToken`; // 根据 stoken 获取 ltoken export const PassportCookieTokenApi = `${PassportAuthApi}getCookieAccountInfoBySToken`; // 根据 Cookie 获取 Token -export const PassportVetifyApi = `${PassportV4Api}account/ma-cn-session/web/verifyLtoken`; // 验证 stoken 有效性 +export const PassportVerifyApi = `${PassportV4Api}account/ma-cn-session/web/verifyLtoken`; // 验证 stoken 有效性 diff --git a/src/core/api/TGApi.ts b/src/web/api/TGApi.ts similarity index 75% rename from src/core/api/TGApi.ts rename to src/web/api/TGApi.ts index 998a6497..317cb898 100644 --- a/src/core/api/TGApi.ts +++ b/src/web/api/TGApi.ts @@ -1,5 +1,5 @@ /** - * @file core api TGApi.ts + * @file web api TGApi.ts * @description 应用用到的 API * @author BTMuli * @since Alpha v0.2.0 @@ -7,12 +7,12 @@ import { ENKA_API } from "./ENKA"; import { Hk4eAnnoListApi, Hk4eAnnoContentApi, Hk4eAnnoQuery } from "./Hk4e"; -import { PassportTokenApi, PassportCookieTokenApi, PassportVetifyApi } from "./Passport"; +import { PassportTokenApi, PassportCookieTokenApi, PassportVerifyApi } from "./Passport"; import { TakumiTokensApi, TakumiRecordCardApi, TakumiRecordGenshinCharacterApi, TakumiRecordGenshinIndexApi, - TakumiRecordGenshinSpiralAbyssApi, TakumiSTokenBingdingRolesApi, - TakumiCookieBingdingRolesApi, + TakumiRecordGenshinSpiralAbyssApi, TakumiSTokenBindingRolesApi, + TakumiCookieBindingRolesApi, } from "./Takumi"; // 应用 API @@ -25,15 +25,15 @@ const TGApi = { getTokens: TakumiTokensApi, // 根据 login_ticket 获取游戏 Token getLToken: PassportTokenApi, // 根据 stoken 获取 ltoken getCookieToken: PassportCookieTokenApi, // 根据 Cookie 获取 Token - vetifyStoken: PassportVetifyApi, // 验证 stoken 有效性 + verifyStoken: PassportVerifyApi, // 验证 stoken 有效性 }, GameData: { byCookie: { - getAccounts: TakumiCookieBingdingRolesApi, // 获取绑定角色 + getAccounts: TakumiCookieBindingRolesApi, // 获取绑定角色 getCharacter: TakumiRecordGenshinCharacterApi, // 获取角色信息 }, bySToken: { - getAccounts: TakumiSTokenBingdingRolesApi, // 获取绑定角色 + getAccounts: TakumiSTokenBindingRolesApi, // 获取绑定角色 }, getUserCard: TakumiRecordCardApi, // 获取用户卡片 getUserBase: TakumiRecordGenshinIndexApi, // 获取用户基本信息 diff --git a/src/core/api/Takumi.ts b/src/web/api/Takumi.ts similarity index 62% rename from src/core/api/Takumi.ts rename to src/web/api/Takumi.ts index eb485c3d..1eec6dcd 100644 --- a/src/core/api/Takumi.ts +++ b/src/web/api/Takumi.ts @@ -1,5 +1,5 @@ /** - * @file core api Takumi.ts + * @file web api Takumi.ts * @description 定义 Takumi API * @author BTMuli * @since Alpha v0.2.0 @@ -9,13 +9,13 @@ const TakumiApi = "https://api-takumi.mihoyo.com/"; // 基础 API const TakumiRecordApi = "https://api-takumi-record.mihoyo.com/"; // 游戏记录 API const TakumiBindingApi = `${TakumiApi}binding/api/`; // 绑定 API const TakumiRecordGenshinApi = `${TakumiRecordApi}game_record/app/genshin/api/`; // 原神游戏记录 API -const TaukumiAuthApi = `${TakumiApi}auth/api/`; // 认证 API +const TakumiAuthApi = `${TakumiApi}auth/api/`; // 认证 API -export const TakumiTokensApi = `${TaukumiAuthApi}getMultiTokenByLoginTicket`; // 登录票据 API -export const TakumiActionTicketsApi = `${TaukumiAuthApi}getActionTicketByStoken`; // 行为票据 API +export const TakumiTokensApi = `${TakumiAuthApi}getMultiTokenByLoginTicket`; // 登录票据 API +export const TakumiActionTicketsApi = `${TakumiAuthApi}getActionTicketByStoken`; // 行为票据 API export const TakumiRecordCardApi = `${TakumiRecordApi}game_record/app/card/wapi/getGameRecordCard`; // 游戏记录卡片 API export const TakumiRecordGenshinIndexApi = `${TakumiRecordGenshinApi}index`; // 原神游戏记录索引 API export const TakumiRecordGenshinCharacterApi = `${TakumiRecordGenshinApi}character`; // 原神游戏记录角色 API export const TakumiRecordGenshinSpiralAbyssApi = `${TakumiRecordGenshinApi}spiralAbyss`; // 原神游戏记录深境螺旋 API -export const TakumiSTokenBingdingRolesApi = `${TakumiBindingApi}getUserGameRolesBySToken`; // 获取绑定角色 API-根据 stoken -export const TakumiCookieBingdingRolesApi = `${TakumiBindingApi}getUserGameRolesByCookie`; // 获取绑定角色 API-根据 Cookie +export const TakumiSTokenBindingRolesApi = `${TakumiBindingApi}getUserGameRolesBySToken`; // 获取绑定角色 API-根据 stoken +export const TakumiCookieBindingRolesApi = `${TakumiBindingApi}getUserGameRolesByCookie`; // 获取绑定角色 API-根据 Cookie diff --git a/src/core/constant/TGConstant.ts b/src/web/constant/TGConstant.ts similarity index 84% rename from src/core/constant/TGConstant.ts rename to src/web/constant/TGConstant.ts index 9e008845..7a633945 100644 --- a/src/core/constant/TGConstant.ts +++ b/src/web/constant/TGConstant.ts @@ -1,5 +1,5 @@ /** - * @file core constant TGConstant.ts + * @file web constant TGConstant.ts * @description 常量 * @author BTMuli * @since Alpha v0.2.0 @@ -16,9 +16,9 @@ const TGConstant = { USER_AGENT: BBS_HEADER_AGENT, REFERER: BBS_REFERER, }, - SALT, - SERVER, - UTILS: { + Salt: SALT, + Server: SERVER, + Utils: { GAME_BIZ, }, }; diff --git a/src/core/constant/bbs.ts b/src/web/constant/bbs.ts similarity index 92% rename from src/core/constant/bbs.ts rename to src/web/constant/bbs.ts index dd4e4d2d..065651c7 100644 --- a/src/core/constant/bbs.ts +++ b/src/web/constant/bbs.ts @@ -1,5 +1,5 @@ /** - * @file core constant bbs.ts + * @file web constant bbs.ts * @description 常量-应用数据 * @author BTMuli * @since Alpha v0.2.0 diff --git a/src/core/constant/salt.ts b/src/web/constant/salt.ts similarity index 84% rename from src/core/constant/salt.ts rename to src/web/constant/salt.ts index d6ace8ce..49bccdf8 100644 --- a/src/core/constant/salt.ts +++ b/src/web/constant/salt.ts @@ -1,5 +1,5 @@ /** - * @file core constant salt.ts + * @file web constant salt.ts * @description 用到的 salt 值 * @author BTMuli * @since Alpha v0.2.0 @@ -18,6 +18,7 @@ const SALT = { Other: { X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs", X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v", + prod: "JwYDpKvLj6MrMqqYU6jTKF17KNO2PXoS", }, }; diff --git a/src/core/constant/server.ts b/src/web/constant/server.ts similarity index 82% rename from src/core/constant/server.ts rename to src/web/constant/server.ts index d154d565..92367c51 100644 --- a/src/core/constant/server.ts +++ b/src/web/constant/server.ts @@ -1,7 +1,7 @@ /** - * @file core constant server.ts + * @file web constant server.ts * @description 服务器地址常量文件 - * @auther BTMuli + * @author BTMuli * @since Alpha v0.2.0 */ @@ -14,7 +14,7 @@ * @property {string} CN_TREE 国服-世界树 * @property {string} OS_USA 美服 * @property {string} OS_EURO 欧服 - * @property {string} OS_AISA 亚服 + * @property {string} OS_ASIA 亚服 * @property {string} OS_CHT 台服 * @property {string} UNKNOWN 未知 * @returns {string} 服务器地址 @@ -24,7 +24,7 @@ enum SERVER { CN_TREE = "cn_qd01", OS_USA = "os_usa", OS_EURO = "os_euro", - OS_AISA = "os_asia", + OS_ASIA = "os_asia", OS_CHT = "os_cht", UNKNOWN = "unknown", }; diff --git a/src/core/constant/utils.ts b/src/web/constant/utils.ts similarity index 82% rename from src/core/constant/utils.ts rename to src/web/constant/utils.ts index 991a8c6d..041fa4ce 100644 --- a/src/core/constant/utils.ts +++ b/src/web/constant/utils.ts @@ -1,5 +1,5 @@ /** - * @file core constant utils.ts + * @file web constant utils.ts * @description 一些杂项的常量 * @author BTMuli * @since Alpha v0.2.0 diff --git a/src/core/request/TGRequest.ts b/src/web/request/TGRequest.ts similarity index 74% rename from src/core/request/TGRequest.ts rename to src/web/request/TGRequest.ts index 400f21b5..0587faaf 100644 --- a/src/core/request/TGRequest.ts +++ b/src/web/request/TGRequest.ts @@ -11,8 +11,8 @@ import { getCookieTokenBySToken, vetifySToken, } from "./getTokens"; import { - getGameCardByCookie, getGameAccountsbyCookie, - getAccountsbySToken, getGameRoleList, + getGameCardByCookie, getGameAccountsByCookie, + getAccountsBySToken, getGameRoleListByCookie, } from "./getGameData"; const TGRequest = { @@ -25,14 +25,14 @@ const TGRequest = { getLTokens: getTokensByLoginTicket, }, byCookie: { - getAccounts: getGameAccountsbyCookie, + getAccounts: getGameAccountsByCookie, getGameCard: getGameCardByCookie, - getCharacter: getGameRoleList, + getCharacter: getGameRoleListByCookie, }, bySToken: { - vertify: vetifySToken, + verify: vetifySToken, getLToken: getLtokenBySToken, - getAccounts: getAccountsbySToken, + getAccounts: getAccountsBySToken, getCookieToken: getCookieTokenBySToken, }, }, diff --git a/src/core/request/getAnno.ts b/src/web/request/getAnno.ts similarity index 90% rename from src/core/request/getAnno.ts rename to src/web/request/getAnno.ts index d3197035..8652958e 100644 --- a/src/core/request/getAnno.ts +++ b/src/web/request/getAnno.ts @@ -1,11 +1,13 @@ /** - * @file core request getAnnouncement.ts + * @file web request getAnnouncement.ts * @description 获取游戏内公告 * @author BTMuli * @since Alpha v0.1.2 */ +// Tauri import { http } from "@tauri-apps/api"; +// Tauri.Genshin import TGApi from "../api/TGApi"; /** @@ -21,7 +23,7 @@ export async function getAnnoList (): Promise} + * @returns {Promise} */ export async function getAnnoContent (annId: number): Promise { const annoContents: BTMuli.Genshin.Announcement.ContentItem[] = await http diff --git a/src/core/request/getEnkaData.ts b/src/web/request/getEnkaData.ts similarity index 81% rename from src/core/request/getEnkaData.ts rename to src/web/request/getEnkaData.ts index 792037b5..e37d6878 100644 --- a/src/core/request/getEnkaData.ts +++ b/src/web/request/getEnkaData.ts @@ -1,18 +1,20 @@ /** - * @file core request getEnkaData.ts + * @file web request getEnkaData.ts * @description 获取 ENKA 数据 * @author BTMuli * @since Alpha v0.1.3 */ +// Tauri import { http } from "@tauri-apps/api"; +// Tauri.Genshin import TGApi from "../api/TGApi"; /** * @description 获取 ENKA 数据 * @since Alpha v0.1.3 * @param {number} uid 用户 UID - * @returns {Promise} + * @returns {Promise} */ export async function getEnkaData (uid: number): Promise { return await http.fetch(`${TGApi.GameEnka}${uid}`).then((res) => res.data); diff --git a/src/core/request/getGameData.ts b/src/web/request/getGameData.ts similarity index 65% rename from src/core/request/getGameData.ts rename to src/web/request/getGameData.ts index 4bb385d3..61957af8 100644 --- a/src/core/request/getGameData.ts +++ b/src/web/request/getGameData.ts @@ -7,6 +7,7 @@ // tauri import { http } from "@tauri-apps/api"; +import qs from "qs"; // utils import TGApi from "../api/TGApi"; import TGUtils from "../utils/TGUtils"; @@ -15,24 +16,21 @@ import TGConstant from "../constant/TGConstant"; /** * @description 获取用户游戏数据 * @since Alpha v0.2.0 - * @param {BTMuli.User.Base.Cookie} cookie 用户的 Cookie + * @param {string} cookie 用户的 Cookie + * @param {string} uid 用户的 UID * @returns {Promise} 用户基本信息 */ -export async function getGameCardByCookie (cookie: BTMuli.User.Base.Cookie): Promise { - const url = `${TGApi.GameData.getUserCard}?uid=${cookie.login_uid}`; - const query = `uid=${cookie.login_uid}`; - const ck = TGUtils.Tools.cookieToString(cookie); - const header = TGUtils.User.getHeader(ck, query); +export async function getGameCardByCookie (cookie: string, uid: string): Promise { + const url = `${TGApi.GameData.getUserCard}`; + const params = { uid }; + const header = TGUtils.User.getHeader(cookie, "GET", qs.stringify(params), "common"); console.log("header:", header); - console.log("uid:", cookie.login_uid); return await http.fetch(url, { method: "GET", headers: header, - body: http.Body.json({ - uid: cookie.login_uid, - }), + body: http.Body.json(params), }).then((res) => { - console.log(res.data); + console.log(res); return res.data; }); } @@ -40,22 +38,20 @@ export async function getGameCardByCookie (cookie: BTMuli.User.Base.Cookie): Pro /** * @description 获取用户绑定角色-通过stoken * @since Alpha v0.2.0 - * @todo 缺乏参考数据 + * @todo 暂时不考虑使用 * @param {string} cookie 用户的 Cookie * @param {string} stoken stoken * @returns {Promise} 用户绑定角色 */ -export async function getAccountsbySToken (cookie: string, stoken: string): Promise { +export async function getAccountsBySToken (cookie: string, stoken: string): Promise { const url = TGApi.GameData.bySToken.getAccounts; - 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); + const params = { stoken, game_biz: TGConstant.Utils.GAME_BIZ }; + const header = TGUtils.User.getHeader(cookie, "GET", JSON.stringify(params), "common"); return await http.fetch(url, { method: "GET", headers: header, - body: http.Body.json(data), + body: http.Body.json(params), }).then((res) => { console.log(res.data); return res.data; @@ -68,9 +64,10 @@ export async function getAccountsbySToken (cookie: string, stoken: string): Prom * @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, ""); +export async function getGameAccountsByCookie (cookie: string): Promise { + const url = TGApi.GameData.byCookie.getAccounts; + const params = { game_biz: TGConstant.Utils.GAME_BIZ }; + const header = TGUtils.User.getHeader(cookie, "GET", qs.stringify(params), "common"); return await http.fetch(url, { method: "GET", headers: header, @@ -88,12 +85,11 @@ export async function getGameAccountsbyCookie (cookie: string): Promise} 用户角色列表 */ -export async function getGameRoleList (cookie: string, uid: string): Promise { +export async function getGameRoleListByCookie (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); + const header = TGUtils.User.getHeader(cookie, "", JSON.stringify(data), "common"); return await http.fetch(url, { method: "POST", headers: header, diff --git a/src/web/request/getTokens.ts b/src/web/request/getTokens.ts new file mode 100644 index 00000000..e5e7577d --- /dev/null +++ b/src/web/request/getTokens.ts @@ -0,0 +1,107 @@ +/** + * @file web request getTokens.ts + * @description 获取游戏 Token + * @author BTMuli + * @since Alpha v0.2.0 + */ + +// tauri +import { http } from "@tauri-apps/api"; +// Node +import qs from "qs"; +// api +import TGApi from "../api/TGApi"; +// utils +import TGUtils from "../utils/TGUtils"; + +/** + * @description 根据 login_ticket 获取游戏 Token,包括 stoken 和 ltoken + * @since Alpha v0.2.0 + * @param {string} cookie cookie + * @param {string} ticket 登录票证 + * @param {string} uid 登录用户 uid + * @returns {Promise} + */ +// eslint-disable-next-line camelcase +export async function getTokensByLoginTicket (cookie: string, ticket: string, uid: string): Promise { + // eslint-disable-next-line camelcase + const url = `${TGApi.GameTokens.getTokens}?login_ticket=${ticket}&token_types=3&uid=${uid}`; + // eslint-disable-next-line camelcase + const param = { login_ticket: ticket, token_types: 3, uid }; + const header = TGUtils.User.getHeader(cookie, "GET", qs.stringify(param), "common"); + console.log("header:", header); + return await http.fetch(url, { + method: "GET", + headers: header, + }).then((res) => { + console.log(res); + if (res.data.retcode !== 0) return res.data; + return res.data.data.list; + }); +} + +/** + * @description 根据 stoken 获取 ltoken + * @since Alpha v0.2.0 + * @param {string} cookie 用户 Cookie + * @param {string} stoken stoken + * @returns {Promise} + */ +export async function getLtokenBySToken (cookie: string, stoken: string): Promise { + const url = TGApi.GameTokens.getLToken; + const params = { stoken }; + const header = TGUtils.User.getHeader(cookie, "GET", qs.stringify(params), "common"); + console.log("header:", header); + return await http.fetch(url, { + method: "GET", + headers: header, + body: http.Body.json(params), + }).then((res) => { + console.log(res); + if (res.data.retcode !== 0) return res.data; + }); +} + +/** + * @description 根据 stoken 获取 cookieToken + * @since Alpha v0.2.0 + * @param {string} cookie 用户 Cookie + * @param {string} stoken stoken + * @returns {Promise} + */ +export async function getCookieTokenBySToken (cookie: string, stoken: string): Promise { + const url = TGApi.GameTokens.getCookieToken; + const params = { stoken }; + const header = TGUtils.User.getHeader(cookie, "GET", qs.stringify(params), "common"); + console.log("header:", header); + return await http.fetch(url, { + method: "GET", + headers: header, + body: http.Body.json(params), + }).then((res) => { + console.log(res.data); + return res.data; + }); +} + +/** + * @description 验证 stoken 有效性 + * @since Alpha v0.2.0 + * @param {string} cookie 用户 Cookie + * @param {string} stoken stoken + * @returns {Promise} + */ +export async function verifySToken (cookie: string, stoken: string): Promise { + const url = TGApi.GameTokens.verifyStoken; + const data = { stoken }; + const header = TGUtils.User.getHeader(cookie, "POST", qs.stringify(data), "common"); + 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/utils/TGUtils.ts b/src/web/utils/TGUtils.ts similarity index 94% rename from src/core/utils/TGUtils.ts rename to src/web/utils/TGUtils.ts index 43221377..0fa4ccf6 100644 --- a/src/core/utils/TGUtils.ts +++ b/src/web/utils/TGUtils.ts @@ -1,5 +1,5 @@ /** - * @file core utils TGUtils.ts + * @file web utils TGUtils.ts * @description 应用用到的工具函数 * @author BTMuli * @since Alpha v0.2.0 diff --git a/src/core/utils/getAnnoCard.ts b/src/web/utils/getAnnoCard.ts similarity index 90% rename from src/core/utils/getAnnoCard.ts rename to src/web/utils/getAnnoCard.ts index d3542fa3..f733aba8 100644 --- a/src/core/utils/getAnnoCard.ts +++ b/src/web/utils/getAnnoCard.ts @@ -1,5 +1,5 @@ /** - * @file core utils transAnno.ts + * @file web utils transAnno.ts * @description 公告数据转换工具 * @author BTMuli * @since Alpha v0.1.2 @@ -12,7 +12,7 @@ const defaultCover = "/source/UI/defaultCover.webp"; * @description 将获取到的数据转为渲染用的卡片 * @since Alpha v0.1.2 * @param {BTMuli.Genshin.Announcement.ListData} data 公告数据 - * @returns {AnnoListCard[]} 渲染用的卡片 + * @returns {BTMuli.Genshin.Announcement.ListCard[]} 渲染用的卡片 */ export function getAnnoCard (data: BTMuli.Genshin.Announcement.ListData): BTMuli.Genshin.Announcement.ListCard[] { const cards: BTMuli.Genshin.Announcement.ListCard[] = []; diff --git a/src/web/utils/getDS.ts b/src/web/utils/getDS.ts new file mode 100644 index 00000000..35ee01dd --- /dev/null +++ b/src/web/utils/getDS.ts @@ -0,0 +1,53 @@ +/** + * @file web utils getDS.ts + * @description ds 算法 + * @author BTMuli + * @since Alpha v0.2.0 + */ + +// Node +import md5 from "js-md5"; +import qs from "qs"; +// Tauri.Genshin +import { random } from "./tools"; +import TGConstant from "../constant/TGConstant"; + +/** + * @description 获取 salt + * @since Alpha v0.2.0 + * @version 2.49.1 + * @param {string} saltType salt 类型 + * @returns {string} salt + */ +function getSalt (saltType: string) { + switch (saltType) { + case "common": + return TGConstant.Salt.Other.X4; + case "prod": + return TGConstant.Salt.Other.prod; + default: + return TGConstant.Salt.Other.X4; + } +} + +/** + * @description 获取 ds + * @since Alpha v0.2.0 + * @version 2.49.1 + * @param {string} saltType salt 类型 + * @param {string} method 请求方法 + * @param {string} data 请求数据 + * @returns {string} ds + */ +export function getDS (method: string, data: string, saltType: string): string { + const salt = getSalt(saltType); + const params = { + salt, + t: Math.floor(Date.now() / 1000).toString(), + r: random(100000, 200000).toString(), + b: method === "GET" ? "" : data, + q: method === "GET" ? data : "", + }; + const md5Str = md5.update(qs.stringify(params)).hex(); + return `${params.t},${params.r},${md5Str}`; +} diff --git a/src/core/utils/getRequestHeader.ts b/src/web/utils/getRequestHeader.ts similarity index 59% rename from src/core/utils/getRequestHeader.ts rename to src/web/utils/getRequestHeader.ts index b2f801e8..556df711 100644 --- a/src/core/utils/getRequestHeader.ts +++ b/src/web/utils/getRequestHeader.ts @@ -1,5 +1,5 @@ /** - * @file core utils getRequestHeader.ts + * @file web utils getRequestHeader.ts * @description 获取请求头 * @author BTMuli * @since Alpha v0.2.0 @@ -12,19 +12,18 @@ import { getDS } from "./getDS"; * @description 获取请求头 * @since Alpha v0.2.0 * @param {string} cookie cookie - * @param {string} query query - * @param {string} body body + * @param {string} method 请求方法 + * @param {string} data 请求数据 + * @param {string} saltType salt 类型 * @returns {Record} 请求头 */ -export function getRequestHeader (cookie: string, query: string, body: string = ""): Record { - const header = { +export function getRequestHeader (cookie: string, method: string, data: string, saltType: string): Record { + return { "User-Agent": TGConstant.BBS.USER_AGENT, - // "x-requested-with": "com.mihoyo.hyperion", "x-rpc-app_version": TGConstant.BBS.VERSION, "x-rpc-client_type": "5", Referer: "https://webstatic.mihoyo.com/", - DS: getDS(query, body), - cookie, + DS: getDS(method, data, saltType), + Cookie: cookie, }; - return header; } diff --git a/src/core/utils/parseAnno.ts b/src/web/utils/parseAnno.ts similarity index 98% rename from src/core/utils/parseAnno.ts rename to src/web/utils/parseAnno.ts index 6d4b48bb..4f3ad9de 100644 --- a/src/core/utils/parseAnno.ts +++ b/src/web/utils/parseAnno.ts @@ -1,5 +1,5 @@ /** - * @file core utils parseAnno.ts + * @file web utils parseAnno.ts * @description 解析游戏内公告数据 * @author BTMuli * @since Alpha v0.1.2 diff --git a/src/core/utils/tools.ts b/src/web/utils/tools.ts similarity index 79% rename from src/core/utils/tools.ts rename to src/web/utils/tools.ts index e8a77479..f293f394 100644 --- a/src/core/utils/tools.ts +++ b/src/web/utils/tools.ts @@ -1,12 +1,13 @@ /** - * @file core utils tools.ts + * @file web utils tools.ts * @description 应用用到的工具函数 * @author BTMuli * @since Alpha v0.2.0 */ -import md5 from "js-md5"; +// Node import { stringify } from "qs"; +// TauriGenshin import TGConstant from "../constant/TGConstant"; /** @@ -43,16 +44,6 @@ export function getRandomString (length: number): string { return res; } -/** - * @description md5 加密 - * @since Alpha v0.2.0 - * @param {string} data 要加密的内容 - * @returns {string} 加密后的内容 - */ -export function MD5 (data: string): string { - return md5.update(data).hex(); -} - /** * @description 获取随机数 * @since Alpha v0.2.0 @@ -100,17 +91,17 @@ export function getServerByUid (uid: string): string { // 获取第一个字符 const first = uid[0]; // 1-4 为国服-天空岛 - if (first >= "1" && first <= "4") return TGConstant.SERVER.CN_ISLAND; + if (first >= "1" && first <= "4") return TGConstant.Server.CN_ISLAND; // 5 为国服-世界树 - if (first === "5") return TGConstant.SERVER.CN_TREE; + if (first === "5") return TGConstant.Server.CN_TREE; // 6 为美服 - if (first === "6") return TGConstant.SERVER.OS_USA; + if (first === "6") return TGConstant.Server.OS_USA; // 7 为欧服 - if (first === "7") return TGConstant.SERVER.OS_EURO; + if (first === "7") return TGConstant.Server.OS_EURO; // 8 为亚服 - if (first === "8") return TGConstant.SERVER.OS_AISA; + if (first === "8") return TGConstant.Server.OS_ASIA; // 9 为台服 - if (first === "9") return TGConstant.SERVER.OS_CHT; + if (first === "9") return TGConstant.Server.OS_CHT; // 其他情况返回未知 - return TGConstant.SERVER.UNKNOWN; + return TGConstant.Server.UNKNOWN; }