mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-10 08:58:15 +08:00
✅ test(sth): 调整内容,完成通过 cookie 获取游戏账号基本数据
This commit is contained in:
@@ -28,7 +28,7 @@
|
|||||||
"https://bbs-api.miyoushe.com/*",
|
"https://bbs-api.miyoushe.com/*",
|
||||||
"https://bbs.mihoyo.com/*",
|
"https://bbs.mihoyo.com/*",
|
||||||
"https://hk4e-api.mihoyo.com/*",
|
"https://hk4e-api.mihoyo.com/*",
|
||||||
"https://passport.mihoyo.com/*",
|
"https://passport-api.mihoyo.com/*",
|
||||||
"https://passport-api-v4.mihoyo.com/*"
|
"https://passport-api-v4.mihoyo.com/*"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
* @since Alpha v0.2.0
|
* @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 PassportV4Api = "https://passport-api-v4.mihoyo.com/"; // 基础 API
|
||||||
const PassportAuthApi = `${PassportApi}account/auth/api/`; // 认证 API
|
const PassportAuthApi = `${PassportApi}account/auth/api/`; // 认证 API
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,12 @@
|
|||||||
import { ENKA_API } from "./ENKA";
|
import { ENKA_API } from "./ENKA";
|
||||||
import { Hk4eAnnoListApi, Hk4eAnnoContentApi, Hk4eAnnoQuery } from "./Hk4e";
|
import { Hk4eAnnoListApi, Hk4eAnnoContentApi, Hk4eAnnoQuery } from "./Hk4e";
|
||||||
import { PassportTokenApi, PassportCookieTokenApi, PassportVetifyApi } from "./Passport";
|
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
|
// 应用 API
|
||||||
const TGApi = {
|
const TGApi = {
|
||||||
@@ -23,10 +28,15 @@ const TGApi = {
|
|||||||
vetifyStoken: PassportVetifyApi, // 验证 stoken 有效性
|
vetifyStoken: PassportVetifyApi, // 验证 stoken 有效性
|
||||||
},
|
},
|
||||||
GameData: {
|
GameData: {
|
||||||
|
byCookie: {
|
||||||
|
getAccounts: TakumiCookieBingdingRolesApi, // 获取绑定角色
|
||||||
|
getCharacter: TakumiRecordGenshinCharacterApi, // 获取角色信息
|
||||||
|
},
|
||||||
|
bySToken: {
|
||||||
|
getGameRoles: TakumiSTokenBingdingRolesApi, // 获取绑定角色
|
||||||
|
},
|
||||||
getUserCard: TakumiRecordCardApi, // 获取用户卡片
|
getUserCard: TakumiRecordCardApi, // 获取用户卡片
|
||||||
getUserBase: TakumiRecordGenshinIndexApi, // 获取用户基本信息
|
getUserBase: TakumiRecordGenshinIndexApi, // 获取用户基本信息
|
||||||
getCharacter: TakumiRecordGenshinCharacterApi, // 获取角色信息
|
|
||||||
getGameRoles: TakumiBingdingRolesApi, // 获取绑定角色
|
|
||||||
getAbyss: TakumiRecordGenshinSpiralAbyssApi, // 获取深境螺旋信息
|
getAbyss: TakumiRecordGenshinSpiralAbyssApi, // 获取深境螺旋信息
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,4 +17,5 @@ export const TakumiRecordCardApi = `${TakumiRecordApi}game_record/app/card/wapi/
|
|||||||
export const TakumiRecordGenshinIndexApi = `${TakumiRecordGenshinApi}index`; // 原神游戏记录索引 API
|
export const TakumiRecordGenshinIndexApi = `${TakumiRecordGenshinApi}index`; // 原神游戏记录索引 API
|
||||||
export const TakumiRecordGenshinCharacterApi = `${TakumiRecordGenshinApi}character`; // 原神游戏记录角色 API
|
export const TakumiRecordGenshinCharacterApi = `${TakumiRecordGenshinApi}character`; // 原神游戏记录角色 API
|
||||||
export const TakumiRecordGenshinSpiralAbyssApi = `${TakumiRecordGenshinApi}spiralAbyss`; // 原神游戏记录深境螺旋 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
|
||||||
|
|||||||
@@ -5,14 +5,21 @@
|
|||||||
* @since Alpha v0.2.0
|
* @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 SALT from "./salt";
|
||||||
|
import SERVER from "./server";
|
||||||
|
import { GAME_BIZ } from "./utils";
|
||||||
|
|
||||||
const TGConstant = {
|
const TGConstant = {
|
||||||
SALT,
|
|
||||||
BBS: {
|
BBS: {
|
||||||
VERSION: BBS_VERSION,
|
VERSION: BBS_VERSION,
|
||||||
USER_AGENT: BBS_HEADER_AGENT,
|
USER_AGENT: BBS_HEADER_AGENT,
|
||||||
|
REFERER: BBS_REFERER,
|
||||||
|
},
|
||||||
|
SALT,
|
||||||
|
SERVER,
|
||||||
|
UTILS: {
|
||||||
|
GAME_BIZ,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,5 +5,6 @@
|
|||||||
* @since Alpha v0.2.0
|
* @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_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";
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ const SALT = {
|
|||||||
LK2: "DG8lqMyc9gquwAUFc7zBS62ijQRX9XF7",
|
LK2: "DG8lqMyc9gquwAUFc7zBS62ijQRX9XF7",
|
||||||
},
|
},
|
||||||
Other: {
|
Other: {
|
||||||
X4: "OYcKGMRDRpnluotQHWwPDnV4xZG4WRMx",
|
X4: "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs",
|
||||||
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
X6: "t0qEgfub6cvueAPgR5m9aQWWVciEer7v",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
32
src/core/constant/server.ts
Normal file
32
src/core/constant/server.ts
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
/**
|
||||||
|
* @file core constant server.ts
|
||||||
|
* @description 服务器地址常量文件
|
||||||
|
* @auther BTMuli<bt-muli@outlook.com>
|
||||||
|
* @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;
|
||||||
9
src/core/constant/utils.ts
Normal file
9
src/core/constant/utils.ts
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
/**
|
||||||
|
* @file core constant utils.ts
|
||||||
|
* @description 一些杂项的常量
|
||||||
|
* @author BTMuli<bt-muli@outlook.com>
|
||||||
|
* @since Alpha v0.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
// game_biz
|
||||||
|
export const GAME_BIZ = "hk4e_cn";
|
||||||
@@ -7,7 +7,7 @@
|
|||||||
|
|
||||||
import { getAnnoList, getAnnoContent } from "./getAnno";
|
import { getAnnoList, getAnnoContent } from "./getAnno";
|
||||||
import { getTokensByLoginTicket, getLtokenByStoken, getCookieTokenByStoken, vetifyStoken } from "./getTokens";
|
import { getTokensByLoginTicket, getLtokenByStoken, getCookieTokenByStoken, vetifyStoken } from "./getTokens";
|
||||||
import { getGameCard, getGameRoles } from "./getGameData";
|
import { getGameCard, getGameAccountsbyCookie, getAccountsbyStoken, getGameRoleList } from "./getGameData";
|
||||||
|
|
||||||
const TGRequest = {
|
const TGRequest = {
|
||||||
Anno: {
|
Anno: {
|
||||||
@@ -17,10 +17,16 @@ const TGRequest = {
|
|||||||
User: {
|
User: {
|
||||||
getTokens: getTokensByLoginTicket,
|
getTokens: getTokensByLoginTicket,
|
||||||
getLToken: getLtokenByStoken,
|
getLToken: getLtokenByStoken,
|
||||||
|
byCookie: {
|
||||||
|
getAccounts: getGameAccountsbyCookie,
|
||||||
|
getCharacter: getGameRoleList,
|
||||||
|
},
|
||||||
|
byStoken: {
|
||||||
|
getAccounts: getAccountsbyStoken,
|
||||||
getCookieToken: getCookieTokenByStoken,
|
getCookieToken: getCookieTokenByStoken,
|
||||||
|
},
|
||||||
vetifyStoken,
|
vetifyStoken,
|
||||||
getGameCard,
|
getGameCard,
|
||||||
getGameRoles,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ import { http } from "@tauri-apps/api";
|
|||||||
// utils
|
// utils
|
||||||
import TGApi from "../api/TGApi";
|
import TGApi from "../api/TGApi";
|
||||||
import TGUtils from "../utils/TGUtils";
|
import TGUtils from "../utils/TGUtils";
|
||||||
|
import TGConstant from "../constant/TGConstant";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取用户游戏数据
|
* @description 获取用户游戏数据
|
||||||
@@ -37,25 +38,66 @@ export async function getGameCard (cookie: BTMuli.User.Base.Cookie): Promise<unk
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 获取用户绑定角色
|
* @description 获取用户绑定角色-通过stoken
|
||||||
* @since Alpha v0.2.0
|
* @since Alpha v0.2.0
|
||||||
* @param {BTMuli.User.Base.Cookie} cookie 用户的 Cookie
|
* @todo 缺乏参考数据
|
||||||
|
* @param {string} cookie 用户的 Cookie
|
||||||
* @param {string} stoken stoken
|
* @param {string} stoken stoken
|
||||||
* @returns {Promise<unknown>} 用户绑定角色
|
* @returns {Promise<unknown>} 用户绑定角色
|
||||||
*/
|
*/
|
||||||
export async function getGameRoles (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise<unknown> {
|
export async function getGameRolesbyStoken (cookie: string, stoken: string): Promise<unknown> {
|
||||||
const url = TGApi.GameData.getGameRoles;
|
const url = TGApi.GameData.bySToken.getGameRoles;
|
||||||
const ck = TGUtils.Tools.cookieToString(cookie);
|
console.log("url:", url);
|
||||||
const query = `stoken=${stoken}`;
|
// eslint-disable-next-line camelcase
|
||||||
const header = TGUtils.User.getHeader(ck, query);
|
const data = { stoken, game_biz: TGConstant.UTILS.GAME_BIZ };
|
||||||
|
const header = TGUtils.User.getHeader(cookie, "", JSON.stringify(data));
|
||||||
console.log("header:", header);
|
console.log("header:", header);
|
||||||
console.log("stoken:", stoken);
|
|
||||||
return await http.fetch(url, {
|
return await http.fetch(url, {
|
||||||
method: "GET",
|
method: "GET",
|
||||||
headers: header,
|
headers: header,
|
||||||
body: http.Body.json({
|
body: http.Body.json(data),
|
||||||
stoken,
|
}).then((res) => {
|
||||||
}),
|
console.log(res.data);
|
||||||
|
return res.data;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @description 获取用户绑定游戏账号-通过cookie
|
||||||
|
* @since Alpha v0.2.0
|
||||||
|
* @param {string} cookie 用户的 Cookie
|
||||||
|
* @returns {Promise<BTMuli.Genshin.Base.Response| BTMuli.User.Game.Account[]>} 用户绑定角色
|
||||||
|
*/
|
||||||
|
export async function getGameAccountsbyCookie (cookie: string): Promise<BTMuli.Genshin.Base.Response | BTMuli.User.Game.Account[]> {
|
||||||
|
const url = `${TGApi.GameData.byCookie.getAccounts}?game_biz=${TGConstant.UTILS.GAME_BIZ}`;
|
||||||
|
const header = TGUtils.User.getHeader(cookie, "");
|
||||||
|
return await http.fetch<BTMuli.User.Response.GameAccounts>(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<unknown>} 用户角色列表
|
||||||
|
*/
|
||||||
|
export async function getGameRoleList (cookie: string, uid: string): Promise<unknown> {
|
||||||
|
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) => {
|
}).then((res) => {
|
||||||
console.log(res.data);
|
console.log(res.data);
|
||||||
return res.data;
|
return res.data;
|
||||||
|
|||||||
@@ -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<unknown> {
|
export async function getCookieTokenByStoken (cookie: BTMuli.User.Base.Cookie, stoken: string): Promise<unknown> {
|
||||||
const url = `${TGApi.GameTokens.getCookieToken}?stoken=${stoken}`;
|
const url = `${TGApi.GameTokens.getCookieToken}?stoken=${stoken}`;
|
||||||
|
console.log(url);
|
||||||
const ck = TGUtils.Tools.cookieToString(cookie);
|
const ck = TGUtils.Tools.cookieToString(cookie);
|
||||||
const query = `stoken=${stoken}`;
|
const query = `stoken=${stoken}`;
|
||||||
const header = TGUtils.User.getHeader(ck, query);
|
const header = TGUtils.User.getHeader(ck, query);
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
import { parseAnnoContent } from "./parseAnno";
|
import { parseAnnoContent } from "./parseAnno";
|
||||||
import { getAnnoCard } from "./getAnnoCard";
|
import { getAnnoCard } from "./getAnnoCard";
|
||||||
import { getRequestHeader } from "./getRequestHeader";
|
import { getRequestHeader } from "./getRequestHeader";
|
||||||
import { cookieToString } from "./tools";
|
import { cookieToString, getServerByUid } from "./tools";
|
||||||
|
|
||||||
const TGUtils = {
|
const TGUtils = {
|
||||||
Anno: {
|
Anno: {
|
||||||
@@ -20,6 +20,7 @@ const TGUtils = {
|
|||||||
},
|
},
|
||||||
Tools: {
|
Tools: {
|
||||||
cookieToString,
|
cookieToString,
|
||||||
|
getServerByUid,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -5,8 +5,7 @@
|
|||||||
* @since Alpha v0.2.0
|
* @since Alpha v0.2.0
|
||||||
*/
|
*/
|
||||||
|
|
||||||
// Tauri.Genshin
|
import { MD5, random, qs } from "./tools";
|
||||||
import { MD5 } from "./tools";
|
|
||||||
import TGConstant from "../constant/TGConstant";
|
import TGConstant from "../constant/TGConstant";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -18,14 +17,16 @@ import TGConstant from "../constant/TGConstant";
|
|||||||
* @returns {string} ds
|
* @returns {string} ds
|
||||||
*/
|
*/
|
||||||
export function getDS (query: string, body: string = ""): string {
|
export function getDS (query: string, body: string = ""): string {
|
||||||
|
console.log("ds.query", query);
|
||||||
|
console.log("ds.body", body);
|
||||||
const params = {
|
const params = {
|
||||||
salt: TGConstant.SALT.Other.X4,
|
salt: TGConstant.SALT.Other.X4,
|
||||||
t: Math.floor(Date.now() / 1000).toString(),
|
t: Math.floor(Date.now() / 1000).toString(),
|
||||||
r: Math.floor(Math.random() * 100000 + 100000).toString(),
|
r: random(100000, 200000).toString(),
|
||||||
b: body,
|
b: body,
|
||||||
q: query,
|
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 md5Str = MD5(paramStr);
|
||||||
const ds = `${params.t},${params.r},${md5Str}`;
|
const ds = `${params.t},${params.r},${md5Str}`;
|
||||||
return ds;
|
return ds;
|
||||||
|
|||||||
@@ -12,20 +12,19 @@ import { getDS } from "./getDS";
|
|||||||
* @description 获取请求头
|
* @description 获取请求头
|
||||||
* @since Alpha v0.2.0
|
* @since Alpha v0.2.0
|
||||||
* @param {string} cookie cookie
|
* @param {string} cookie cookie
|
||||||
* @param {string} q query
|
* @param {string} query query
|
||||||
* @param {string} b body
|
* @param {string} body body
|
||||||
* @returns {Record<string, string>} 请求头
|
* @returns {Record<string, string>} 请求头
|
||||||
*/
|
*/
|
||||||
export function getRequestHeader (cookie: string, q: string, b: string = ""): Record<string, string> {
|
export function getRequestHeader (cookie: string, query: string, body: string = ""): Record<string, string> {
|
||||||
const header = {
|
const header = {
|
||||||
"User-Agent": TGConstant.BBS.USER_AGENT,
|
"User-Agent": TGConstant.BBS.USER_AGENT,
|
||||||
// "x-requested-with": "com.mihoyo.hyperion",
|
// "x-requested-with": "com.mihoyo.hyperion",
|
||||||
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
"x-rpc-app_version": TGConstant.BBS.VERSION,
|
||||||
"x-rpc-client_type": "5",
|
"x-rpc-client_type": "5",
|
||||||
Origin: "https://webstatic.mihoyo.com/",
|
|
||||||
Referer: "https://webstatic.mihoyo.com/",
|
Referer: "https://webstatic.mihoyo.com/",
|
||||||
DS: getDS(q, b),
|
DS: getDS(query, body),
|
||||||
Cookie: cookie,
|
cookie,
|
||||||
};
|
};
|
||||||
return header;
|
return header;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import md5 from "js-md5";
|
import md5 from "js-md5";
|
||||||
import qs from "qs";
|
import { stringify } from "qs";
|
||||||
|
import TGConstant from "../constant/TGConstant";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @description 转义正则表达式
|
* @description 转义正则表达式
|
||||||
@@ -52,6 +53,31 @@ export function MD5 (data: string): string {
|
|||||||
return md5.update(data).hex();
|
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<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 将 ck JSON 对象转换为字符串
|
* @description 将 ck JSON 对象转换为字符串
|
||||||
* @since Alpha v0.2.0
|
* @since Alpha v0.2.0
|
||||||
@@ -59,7 +85,32 @@ export function MD5 (data: string): string {
|
|||||||
* @returns {string} ck 字符串
|
* @returns {string} ck 字符串
|
||||||
*/
|
*/
|
||||||
export function cookieToString (ck: object): string {
|
export function cookieToString (ck: object): string {
|
||||||
let res = qs.stringify(ck);
|
let res = stringify(ck);
|
||||||
res = res.replace(/&/g, ";");
|
res = res.replace(/&/g, ";");
|
||||||
return res;
|
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;
|
||||||
|
}
|
||||||
|
|||||||
@@ -19,6 +19,12 @@
|
|||||||
<v-btn @click="getBindRole">
|
<v-btn @click="getBindRole">
|
||||||
获取绑定角色
|
获取绑定角色
|
||||||
</v-btn>
|
</v-btn>
|
||||||
|
<v-btn @click="getBindRoleV2">
|
||||||
|
获取绑定角色 v2
|
||||||
|
</v-btn>
|
||||||
|
<v-btn @click="getCookieToken">
|
||||||
|
获取 cookieToken
|
||||||
|
</v-btn>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
@@ -29,6 +35,7 @@ import { dialog } from "@tauri-apps/api";
|
|||||||
// utils
|
// utils
|
||||||
import TGRequest from "../core/request/TGRequest";
|
import TGRequest from "../core/request/TGRequest";
|
||||||
import TGSqlite from "../utils/TGSqlite";
|
import TGSqlite from "../utils/TGSqlite";
|
||||||
|
import TGUtils from "../core/utils/TGUtils";
|
||||||
|
|
||||||
const cookie = ref({} as BTMuli.User.Base.Cookie);
|
const cookie = ref({} as BTMuli.User.Base.Cookie);
|
||||||
const tokens = ref([] as BTMuli.User.Base.TokenItem[]);
|
const tokens = ref([] as BTMuli.User.Base.TokenItem[]);
|
||||||
@@ -87,16 +94,32 @@ async function getLToken () {
|
|||||||
console.log(tokenRes);
|
console.log(tokenRes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 获取 cookieToken, done, 但是登录失效
|
||||||
|
async function getCookieToken () {
|
||||||
|
const stoken = await TGSqlite.getAppDataItem("stoken");
|
||||||
|
console.log("stoken", stoken);
|
||||||
|
const cookieRes = await TGRequest.User.byStoken.getCookieToken(cookie.value, stoken);
|
||||||
|
console.log(cookieRes);
|
||||||
|
}
|
||||||
|
|
||||||
// 获取游戏数据
|
// 获取游戏数据
|
||||||
async function getUserGameCard () {
|
async function getUserGameCard () {
|
||||||
const gameCard = await TGRequest.User.getGameCard(cookie.value);
|
const gameCard = await TGRequest.User.getGameCard(cookie.value);
|
||||||
console.log(gameCard);
|
console.log(gameCard);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取绑定角色
|
// 获取绑定角色 done,但是登录失效
|
||||||
async function getBindRole () {
|
async function getBindRole () {
|
||||||
|
const ck = TGUtils.Tools.cookieToString(cookie.value);
|
||||||
const stoken = await TGSqlite.getAppDataItem("stoken");
|
const stoken = await TGSqlite.getAppDataItem("stoken");
|
||||||
const bindRole = await TGRequest.User.getGameRoles(cookie.value, stoken);
|
const bindRole = await TGRequest.User.byStoken.getAccounts(ck, stoken);
|
||||||
|
console.log(bindRole);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取绑定角色 v2, done,但是登录失效
|
||||||
|
async function getBindRoleV2 () {
|
||||||
|
const ck = TGUtils.Tools.cookieToString(cookie.value);
|
||||||
|
const bindRole = await TGRequest.User.byCookie.getAccounts(ck);
|
||||||
console.log(bindRole);
|
console.log(bindRole);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +127,9 @@ async function getBindRole () {
|
|||||||
<style scoped>
|
<style scoped>
|
||||||
.testDiv {
|
.testDiv {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: row;
|
flex-wrap: wrap;
|
||||||
justify-content: space-around;
|
justify-content: space-between;
|
||||||
|
width: 100%;
|
||||||
|
margin-top: 20px;
|
||||||
}
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
33
src/types/Game.d.ts
vendored
Normal file
33
src/types/Game.d.ts
vendored
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/**
|
||||||
|
* @file types Game.d.ts
|
||||||
|
* @description 游戏数据相关接口
|
||||||
|
* @author BTMuli<bt-muli@outlook.com>
|
||||||
|
* @since Alpha v0.2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
declare namespace BTMuli.User.Game {
|
||||||
|
/**
|
||||||
|
* @description 游戏账号
|
||||||
|
* @see TGRequest.User.byCookie.getGameAccounts
|
||||||
|
* @since Alpha v0.2.0
|
||||||
|
* @property {string} game_biz 游戏 biz,例如 hk4e_cn
|
||||||
|
* @property {string} game_uid 游戏 uid
|
||||||
|
* @property {boolean} is_chosen 是否为当前选中账号
|
||||||
|
* @property {string} is_official 是否为官服账号
|
||||||
|
* @property {string} level 游戏等级
|
||||||
|
* @property {string} nickname 游戏昵称
|
||||||
|
* @property {string} region 游戏区域
|
||||||
|
* @property {string} region_name 游戏区域名称
|
||||||
|
* @returns Account
|
||||||
|
*/
|
||||||
|
export interface Account {
|
||||||
|
game_biz: string
|
||||||
|
game_uid: string
|
||||||
|
is_chosen: boolean
|
||||||
|
is_official: boolean
|
||||||
|
level: string
|
||||||
|
nickname: string
|
||||||
|
region: string
|
||||||
|
region_name: string
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/types/UserRequest.d.ts
vendored
13
src/types/UserRequest.d.ts
vendored
@@ -63,4 +63,17 @@ declare namespace BTMuli.User.Response {
|
|||||||
list: TokenItem[]
|
list: TokenItem[]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* @description 获取游戏账号的响应
|
||||||
|
* @since Alpha v0.2.0
|
||||||
|
* @interface GameAccounts
|
||||||
|
* @extends {BTMuli.Genshin.Base.Response}
|
||||||
|
* @property {BTMuli.User.Game.Account[]} data.list 游戏账号
|
||||||
|
* @returns {GameAccounts}
|
||||||
|
*/
|
||||||
|
export interface GameAccounts extends BTMuli.Genshin.Base.Response {
|
||||||
|
data: {
|
||||||
|
list: BTMuli.User.Game.Account[]
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user