From d959ab44f5d9876c2de5ed86f800c415c64f8dc4 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Fri, 5 May 2023 20:52:30 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=A4=94=20add(sth):=20=E5=8A=A0=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=20api=EF=BC=8C=E8=AF=B7=E6=B1=82=E8=BF=98?= =?UTF-8?q?=E6=98=AF=E8=B7=91=E4=B8=8D=E9=80=9A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/core/api/TGApi.ts | 3 +- src/core/api/Takumi.ts | 4 ++- src/core/constant/bbs.ts | 4 +-- src/core/request/TGRequest.ts | 3 +- src/core/request/getGameData.ts | 45 ++++++++++++++++++++++++------ src/core/request/getTokens.ts | 37 +++++++++++++----------- src/core/utils/TGUtils.ts | 6 ++-- src/core/utils/getDS.ts | 9 +++--- src/core/utils/getRequestHeader.ts | 21 ++++++++++---- src/core/utils/tools.ts | 13 +++++++++ src/pages/User.vue | 19 ++++++++++--- 11 files changed, 118 insertions(+), 46 deletions(-) diff --git a/src/core/api/TGApi.ts b/src/core/api/TGApi.ts index e9d493d5..9f16a813 100644 --- a/src/core/api/TGApi.ts +++ b/src/core/api/TGApi.ts @@ -8,7 +8,7 @@ import { ENKA_API } from "./ENKA"; import { Hk4eAnnoListApi, Hk4eAnnoContentApi, Hk4eAnnoQuery } from "./Hk4e"; import { PassportTokenApi, PassportCookieTokenApi, PassportVetifyApi } from "./Passport"; -import { TakumiTokensApi, TakumiRecordCardApi, TakumiRecordGenshinCharacterApi, TakumiRecordGenshinIndexApi, TakumiRecordGenshinSpiralAbyssApi } from "./Takumi"; +import { TakumiTokensApi, TakumiRecordCardApi, TakumiRecordGenshinCharacterApi, TakumiRecordGenshinIndexApi, TakumiRecordGenshinSpiralAbyssApi, TakumiBingdingRolesApi } from "./Takumi"; // 应用 API const TGApi = { @@ -26,6 +26,7 @@ const TGApi = { 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 cb9a9cbc..5864b870 100644 --- a/src/core/api/Takumi.ts +++ b/src/core/api/Takumi.ts @@ -6,7 +6,8 @@ */ const TakumiApi = "https://api-takumi.mihoyo.com/"; // 基础 API -const TakumiRecordApi = "https://api-takumi-record.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 @@ -16,3 +17,4 @@ 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 diff --git a/src/core/constant/bbs.ts b/src/core/constant/bbs.ts index 42afdd79..a37dd4c6 100644 --- a/src/core/constant/bbs.ts +++ b/src/core/constant/bbs.ts @@ -5,5 +5,5 @@ * @since Alpha v0.2.0 */ -export const BBS_VERSION = "2.49.1"; -export const BBS_HEADER_AGENT = `Mozilla/5.0 (iPhone; CPU iPhone OS 16_0_2 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/${BBS_VERSION}`; +export const BBS_VERSION = "2.11.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}`; diff --git a/src/core/request/TGRequest.ts b/src/core/request/TGRequest.ts index b281f6a3..84a53fee 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 } from "./getGameData"; +import { getGameCard, getGameRoles } from "./getGameData"; const TGRequest = { Anno: { @@ -20,6 +20,7 @@ const TGRequest = { getCookieToken: getCookieTokenByStoken, vetifyStoken, getGameCard, + getGameRoles, }, }; diff --git a/src/core/request/getGameData.ts b/src/core/request/getGameData.ts index a9b4519e..83bb32d5 100644 --- a/src/core/request/getGameData.ts +++ b/src/core/request/getGameData.ts @@ -9,24 +9,53 @@ import { http } from "@tauri-apps/api"; // utils import TGApi from "../api/TGApi"; -import { getDS } from "../utils/getDS"; -import { getRequestHeader } from "../utils/getRequestHeader"; +import TGUtils from "../utils/TGUtils"; /** * @description 获取用户游戏数据 + * @since Alpha v0.2.0 * @param {BTMuli.User.Base.Cookie} cookie 用户的 Cookie * @returns {Promise} 用户基本信息 */ export async function getGameCard (cookie: BTMuli.User.Base.Cookie): Promise { - const url = TGApi.GameData.getUserCard; - const header = { - ...getRequestHeader(cookie), - cookie: JSON.stringify(cookie), - DS: getDS(`uid=${cookie.login_uid}`, ""), - }; + 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); + 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, + }), + }).then((res) => { + console.log(res.data); + return res.data; + }); +} + +/** + * @description 获取用户绑定角色 + * @since Alpha v0.2.0 + * @param {BTMuli.User.Base.Cookie} cookie 用户的 Cookie + * @param {string} stoken stoken + * @returns {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); + console.log("header:", header); + console.log("stoken:", stoken); + return await http.fetch(url, { + method: "GET", + headers: header, + body: http.Body.json({ + stoken, + }), }).then((res) => { console.log(res.data); return res.data; diff --git a/src/core/request/getTokens.ts b/src/core/request/getTokens.ts index c774a129..1849453b 100644 --- a/src/core/request/getTokens.ts +++ b/src/core/request/getTokens.ts @@ -20,7 +20,10 @@ import TGUtils from "../utils/TGUtils"; */ 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 header = TGUtils.User.getHeader(cookie); + 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, @@ -39,17 +42,13 @@ export async function getTokensByLoginTicket (cookie: BTMuli.User.Base.Cookie): */ export async function getLtokenByStoken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { const url = `${TGApi.GameTokens.getLToken}`; - const header = TGUtils.User.getHeader(cookie); - const ds = TGUtils.User.getDS(`stoken=${stoken}`, ""); - console.log("DS:", ds); - console.log("Cookie:", JSON.stringify(cookie)); + 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, - cookie: JSON.stringify(cookie), - DS: `${ds}`, - }, + headers: header, }).then((res) => { console.log(res.data); if (res.data.retcode !== 0) return res.data; @@ -65,13 +64,16 @@ 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}`; - const header = TGUtils.User.getHeader(cookie); - return await http.fetch(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); - if (res.data.retcode !== 0) return res.data; + return res.data; }); } @@ -84,8 +86,11 @@ export async function getCookieTokenByStoken (cookie: BTMuli.User.Base.Cookie, s */ export async function vetifyStoken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise { const url = `${TGApi.GameTokens.vetifyStoken}`; - const header = TGUtils.User.getHeader(cookie); - return await http.fetch(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: "POST", headers: header, body: http.Body.json({ @@ -93,6 +98,6 @@ export async function vetifyStoken (cookie: BTMuli.User.Base.Cookie, stoken: str }), }).then((res) => { console.log(res.data); - if (res.data.retcode !== 0) return res.data; + return res.data; }); } diff --git a/src/core/utils/TGUtils.ts b/src/core/utils/TGUtils.ts index baf7da61..28cd39de 100644 --- a/src/core/utils/TGUtils.ts +++ b/src/core/utils/TGUtils.ts @@ -7,8 +7,8 @@ import { parseAnnoContent } from "./parseAnno"; import { getAnnoCard } from "./getAnnoCard"; -import { getDS } from "./getDS"; import { getRequestHeader } from "./getRequestHeader"; +import { cookieToString } from "./tools"; const TGUtils = { Anno: { @@ -16,9 +16,11 @@ const TGUtils = { parseContent: parseAnnoContent, }, User: { - getDS, getHeader: getRequestHeader, }, + Tools: { + cookieToString, + }, }; export default TGUtils; diff --git a/src/core/utils/getDS.ts b/src/core/utils/getDS.ts index 406d8ad0..f13a6ccf 100644 --- a/src/core/utils/getDS.ts +++ b/src/core/utils/getDS.ts @@ -5,8 +5,6 @@ * @since Alpha v0.2.0 */ -// Node -import qs from "qs"; // Tauri.Genshin import { MD5 } from "./tools"; import TGConstant from "../constant/TGConstant"; @@ -19,15 +17,16 @@ import TGConstant from "../constant/TGConstant"; * @param {string} body 请求体 * @returns {string} ds */ -export function getDS (query: string, body: string): string { +export function getDS (query: string, body: string = ""): string { const params = { salt: TGConstant.SALT.Other.X4, t: Math.floor(Date.now() / 1000).toString(), - r: Math.floor(Math.random() * 900000 + 100000).toString(), + r: Math.floor(Math.random() * 100000 + 100000).toString(), b: body, q: query, }; - const md5Str = MD5(qs.stringify(params)); + const paramStr = `salt=${params.salt}&t=${params.t}&r=${params.r}&b=${params.b}&q=${params.q}`; + 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 5e94b4e7..9def15eb 100644 --- a/src/core/utils/getRequestHeader.ts +++ b/src/core/utils/getRequestHeader.ts @@ -6,17 +6,26 @@ */ import TGConstant from "../constant/TGConstant"; +import { getDS } from "./getDS"; -export function getRequestHeader (cookie: BTMuli.User.Base.Cookie): Record { +/** + * @description 获取请求头 + * @since Alpha v0.2.0 + * @param {string} cookie cookie + * @param {string} q query + * @param {string} b body + * @returns {Record} 请求头 + */ +export function getRequestHeader (cookie: string, q: string, b: string = ""): Record { const header = { "User-Agent": TGConstant.BBS.USER_AGENT, - "content-type": "application/json;charset=UTF-8", - "x-requested-with": "com.mihoyo.hyperion", + // "x-requested-with": "com.mihoyo.hyperion", "x-rpc-app_version": TGConstant.BBS.VERSION, "x-rpc-client_type": "5", - "x-rpc-device_id": cookie.DEVICEFP, - Origin: "https://www.miyoushe.com", - Referer: "https://www.miyoushe.com", + Origin: "https://webstatic.mihoyo.com/", + Referer: "https://webstatic.mihoyo.com/", + DS: getDS(q, b), + Cookie: cookie, }; return header; } diff --git a/src/core/utils/tools.ts b/src/core/utils/tools.ts index d32f0ccc..5a755d74 100644 --- a/src/core/utils/tools.ts +++ b/src/core/utils/tools.ts @@ -6,6 +6,7 @@ */ import md5 from "js-md5"; +import qs from "qs"; /** * @description 转义正则表达式 @@ -50,3 +51,15 @@ export function getRandomString (length: number): string { export function MD5 (data: string): string { return md5.update(data).hex(); } + +/** + * @description 将 ck JSON 对象转换为字符串 + * @since Alpha v0.2.0 + * @param {object} ck ck JSON 对象 + * @returns {string} ck 字符串 + */ +export function cookieToString (ck: object): string { + let res = qs.stringify(ck); + res = res.replace(/&/g, ";"); + return res; +} diff --git a/src/pages/User.vue b/src/pages/User.vue index 620f733e..20b0bd07 100644 --- a/src/pages/User.vue +++ b/src/pages/User.vue @@ -16,6 +16,9 @@ 获取游戏数据 + + 获取绑定角色 +