mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2025-12-14 09:38:13 +08:00
@@ -209,8 +209,6 @@ async function getTokenWeb(cookie: string): Promise<void> {
|
||||
});
|
||||
}
|
||||
signListener();
|
||||
emits("loadOuter", { show: false });
|
||||
// 检测cookie是否每项都有
|
||||
if (Object.values(cookieUser).some((i) => i === "")) {
|
||||
showSnackbar({
|
||||
text: "获取 cookie 失败!部分项为空!",
|
||||
@@ -220,10 +218,21 @@ async function getTokenWeb(cookie: string): Promise<void> {
|
||||
return;
|
||||
}
|
||||
await TGSqlite.saveAppData("cookie", JSON.stringify(cookieUser));
|
||||
showSnackbar({
|
||||
text: "登录成功!",
|
||||
color: "success",
|
||||
});
|
||||
const failCount = await refreshUserInfo();
|
||||
if (failCount > 0) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "获取用户信息失败!",
|
||||
});
|
||||
} else {
|
||||
showSnackbar({
|
||||
text: "登录成功!",
|
||||
color: "success",
|
||||
});
|
||||
appStore.isLogin = true;
|
||||
}
|
||||
loading.value = false;
|
||||
emits("loadOuter", { show: false });
|
||||
}
|
||||
|
||||
async function refreshUser() {
|
||||
@@ -298,42 +307,7 @@ async function refreshUser() {
|
||||
}
|
||||
userStore.cookie.value = ck;
|
||||
await TGSqlite.saveAppData("cookie", JSON.stringify(ck));
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息" });
|
||||
const infoRes = await TGRequest.User.byCookie.getUserInfo(ck.cookie_token, ck.account_id);
|
||||
if ("retcode" in infoRes) {
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息", text: "获取用户信息失败!" });
|
||||
await TGLogger.Error("[tc-userBadge][refreshUser] 获取用户信息失败");
|
||||
await TGLogger.Error(`[tc-userBadge][refreshUser] ${infoRes.retcode}: ${infoRes.message}`);
|
||||
failCount++;
|
||||
} else {
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息", text: "获取用户信息成功!" });
|
||||
const briefInfo: TGApp.App.Account.BriefInfo = {
|
||||
nickname: infoRes.nickname,
|
||||
uid: infoRes.uid,
|
||||
avatar: infoRes.avatar_url,
|
||||
desc: infoRes.introduce,
|
||||
};
|
||||
userStore.briefInfo.value = briefInfo;
|
||||
await TGSqlite.saveAppData("userInfo", JSON.stringify(briefInfo));
|
||||
await TGLogger.Info("[tc-userBadge][refreshUser] 获取用户信息成功");
|
||||
}
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息" });
|
||||
const accountRes = await TGRequest.User.byCookie.getAccounts(ck.cookie_token, ck.account_id);
|
||||
if (Array.isArray(accountRes)) {
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息", text: "获取账号信息成功!" });
|
||||
await TGLogger.Info("[tc-userBadge][refreshUser] 获取账号信息成功");
|
||||
await TGSqlite.saveAccount(accountRes);
|
||||
const curAccount = await TGSqlite.getCurAccount();
|
||||
if (curAccount) userStore.account.value = curAccount;
|
||||
} else {
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息", text: "获取账号信息失败!" });
|
||||
await TGLogger.Error("[tc-userBadge][refreshUser] 获取账号信息失败");
|
||||
await TGLogger.Error(
|
||||
`[tc-userBadge][refreshUser] ${accountRes.retcode}: ${accountRes.message}`,
|
||||
);
|
||||
failCount++;
|
||||
}
|
||||
loading.value = false;
|
||||
failCount = await refreshUserInfo();
|
||||
if (failCount > 0) {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
@@ -347,6 +321,55 @@ async function refreshUser() {
|
||||
emits("loadOuter", { show: false });
|
||||
}
|
||||
|
||||
async function refreshUserInfo(cnt: number = 0): Promise<number> {
|
||||
let failCount = cnt;
|
||||
const ck = userStore.cookie.value;
|
||||
if (ck === undefined) {
|
||||
showSnackbar({
|
||||
text: "未获取到用户 ck!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][refreshUserInfo] 未获取到用户 ck");
|
||||
return 0;
|
||||
}
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息" });
|
||||
const infoRes = await TGRequest.User.byCookie.getUserInfo(ck.cookie_token, ck.account_id);
|
||||
if ("retcode" in infoRes) {
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息", text: "获取用户信息失败!" });
|
||||
await TGLogger.Error("[tc-userBadge][refreshUserInfo] 获取用户信息失败");
|
||||
await TGLogger.Error(`[tc-userBadge][refreshUserInfo] ${infoRes.retcode}: ${infoRes.message}`);
|
||||
failCount++;
|
||||
} else {
|
||||
emits("loadOuter", { show: true, title: "正在获取用户信息", text: "获取用户信息成功!" });
|
||||
const briefInfo: TGApp.App.Account.BriefInfo = {
|
||||
nickname: infoRes.nickname,
|
||||
uid: infoRes.uid,
|
||||
avatar: infoRes.avatar_url,
|
||||
desc: infoRes.introduce,
|
||||
};
|
||||
userStore.briefInfo.value = briefInfo;
|
||||
await TGSqlite.saveAppData("userInfo", JSON.stringify(briefInfo));
|
||||
await TGLogger.Info("[tc-userBadge][refreshUserInfo] 获取用户信息成功");
|
||||
}
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息" });
|
||||
const accountRes = await TGRequest.User.byCookie.getAccounts(ck.cookie_token, ck.account_id);
|
||||
if (Array.isArray(accountRes)) {
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息", text: "获取账号信息成功!" });
|
||||
await TGLogger.Info("[tc-userBadge][refreshUserInfo] 获取账号信息成功");
|
||||
await TGSqlite.saveAccount(accountRes);
|
||||
const curAccount = await TGSqlite.getCurAccount();
|
||||
if (curAccount) userStore.account.value = curAccount;
|
||||
} else {
|
||||
emits("loadOuter", { show: true, title: "正在获取账号信息", text: "获取账号信息失败!" });
|
||||
await TGLogger.Error("[tc-userBadge][refreshUserInfo] 获取账号信息失败");
|
||||
await TGLogger.Error(
|
||||
`[tc-userBadge][refreshUserInfo] ${accountRes.retcode}: ${accountRes.message}`,
|
||||
);
|
||||
failCount++;
|
||||
}
|
||||
return failCount;
|
||||
}
|
||||
|
||||
async function confirmRefreshUser(): Promise<void> {
|
||||
const res = await showConfirm({
|
||||
title: "确认刷新用户信息吗?",
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
<TOverlay v-model="visible" hide blur-val="20px" :to-click="onCancel">
|
||||
<div class="tog-box">
|
||||
<div class="tog-top">
|
||||
<div class="tog-title">请使用原神进行扫码操作</div>
|
||||
<div class="tog-subtitle">仅支持官服,渠道服请使用网页登录</div>
|
||||
<div class="tog-title">请使用米游社或原神进行操作</div>
|
||||
<div class="tog-subtitle">所需米游社版本 >= 2.57.1</div>
|
||||
</div>
|
||||
<div class="tog-mid">
|
||||
<qrcode-vue
|
||||
@@ -127,20 +127,28 @@ async function cycleGetData() {
|
||||
if (res.stat === "Confirmed") {
|
||||
clearInterval(cycleTimer);
|
||||
cycleTimer = null;
|
||||
if (res.payload.proto !== "OpenToken") {
|
||||
await TGLogger.Warn(`[to-gameLogin] 检测到非Combo协议:${res.payload.proto}`);
|
||||
if (res.payload.proto !== "OpenToken" && res.payload.proto !== "Account") {
|
||||
await TGLogger.Warn(`[to-gameLogin] 检测到意外协议:${res.payload.proto}`);
|
||||
showSnackbar({
|
||||
text: "请使用原神进行扫码操作",
|
||||
text: "请使用米游社或原神进行扫码操作",
|
||||
color: "error",
|
||||
});
|
||||
visible.value = false;
|
||||
return;
|
||||
}
|
||||
const data: TGApp.Plugins.Mys.GameLogin.StatusPayloadRaw = JSON.parse(res.payload.raw);
|
||||
cookie.account_id = data.open_id;
|
||||
cookie.ltuid = data.open_id;
|
||||
cookie.stuid = data.open_id;
|
||||
await getTokens(data.open_token);
|
||||
if (res.payload.proto === "OpenToken") {
|
||||
const data: TGApp.Plugins.Mys.GameLogin.StatusPayloadRawOpen = JSON.parse(res.payload.raw);
|
||||
cookie.account_id = data.open_id;
|
||||
cookie.ltuid = data.open_id;
|
||||
cookie.stuid = data.open_id;
|
||||
await getTokens(data.open_token);
|
||||
} else {
|
||||
const data: TGApp.Plugins.Mys.GameLogin.StatusPayloadRawAccount = JSON.parse(res.payload.raw);
|
||||
cookie.account_id = data.uid;
|
||||
cookie.ltuid = data.uid;
|
||||
cookie.stuid = data.uid;
|
||||
await getTokens(data.token, true);
|
||||
}
|
||||
showSnackbar({
|
||||
text: "登录成功",
|
||||
color: "success",
|
||||
@@ -152,8 +160,8 @@ async function cycleGetData() {
|
||||
}
|
||||
}
|
||||
|
||||
async function getTokens(game_token: string): Promise<void> {
|
||||
const stokenRes = await TGRequest.User.bgGameToken.getStoken(cookie.account_id, game_token);
|
||||
async function getTokens(game_token: string, isGT: boolean = false): Promise<void> {
|
||||
const stokenRes = await TGRequest.User.bgGameToken.getStoken(cookie.account_id, game_token, isGT);
|
||||
if (!("retcode" in stokenRes)) {
|
||||
cookie.stoken = stokenRes.token.token;
|
||||
cookie.mid = stokenRes.user_info.mid;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file plugins/Mys/utils/doGameLogin
|
||||
* @description 获取 gameToken,曲线获取 stoken
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
*/
|
||||
|
||||
import { http } from "@tauri-apps/api";
|
||||
@@ -9,9 +9,11 @@ import { http } from "@tauri-apps/api";
|
||||
import { getDeviceInfo } from "../../../utils/toolFunc";
|
||||
import { getRequestHeader } from "../../../web/utils/getRequestHeader";
|
||||
|
||||
const APP_ID = 8;
|
||||
|
||||
/**
|
||||
* @description 获取登录二维码
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
* @returns {Promise<TGApp.Plugins.Mys.GameLogin.GetLoginQrData|TGApp.BBS.Response.Base>}
|
||||
*/
|
||||
export async function getLoginQr(): Promise<
|
||||
@@ -20,7 +22,7 @@ export async function getLoginQr(): Promise<
|
||||
const url = "https://hk4e-sdk.mihoyo.com/hk4e_cn/combo/panda/qrcode/fetch";
|
||||
const device = getDeviceInfo("device_id");
|
||||
const data = {
|
||||
app_id: "4",
|
||||
app_id: APP_ID,
|
||||
device,
|
||||
};
|
||||
const header = getRequestHeader({}, "POST", data, "common");
|
||||
@@ -38,7 +40,7 @@ export async function getLoginQr(): Promise<
|
||||
|
||||
/**
|
||||
* @description 获取登录状态
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
* @param {string} ticket 二维码 ticket
|
||||
* @returns {Promise<TGApp.Plugins.Mys.GameLogin.GetLoginStatusData | TGApp.BBS.Response.Base>}
|
||||
*/
|
||||
@@ -47,7 +49,7 @@ export async function getLoginStatus(
|
||||
): Promise<TGApp.Plugins.Mys.GameLogin.GetLoginStatusData | TGApp.BBS.Response.Base> {
|
||||
const url = "https://hk4e-sdk.mihoyo.com/hk4e_cn/combo/panda/qrcode/query";
|
||||
const device = getDeviceInfo("device_id");
|
||||
const data = { app_id: "4", device, ticket };
|
||||
const data = { app_id: APP_ID, device, ticket };
|
||||
const header = getRequestHeader({}, "POST", data, "common");
|
||||
return await http
|
||||
.fetch<TGApp.Plugins.Mys.GameLogin.GetLoginStatusResponse | TGApp.BBS.Response.Base>(url, {
|
||||
|
||||
25
src/plugins/Mys/types/GameLogin.d.ts
vendored
25
src/plugins/Mys/types/GameLogin.d.ts
vendored
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* @file plugins/Mys/types/GameLogin.d.ts
|
||||
* @description Mys 插件 Game 登录类型定义文件
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
*/
|
||||
|
||||
/**
|
||||
* @description Mys 插件 Game 登录类型
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
* @namespace TGApp.Plugins.Mys.GameLogin
|
||||
* @memberof TGApp.Plugins.Mys
|
||||
*/
|
||||
@@ -76,14 +76,27 @@ declare namespace TGApp.Plugins.Mys.GameLogin {
|
||||
|
||||
/**
|
||||
* @description 反序列化后的登录状态数据
|
||||
* @since Beta v0.4.3
|
||||
* @interface StatusPayloadRaw
|
||||
* @since Beta v0.4.4
|
||||
* @interface StatusPayloadRawOpen
|
||||
* @property {string} uid 用户 UID
|
||||
* @property {string} token 用户 token
|
||||
* @return StatusPayloadRaw
|
||||
* @return StatusPayloadRawOpen
|
||||
*/
|
||||
interface StatusPayloadRaw {
|
||||
interface StatusPayloadRawOpen {
|
||||
open_id: string;
|
||||
open_token: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 反序列化后的登录状态数据
|
||||
* @since Beta v0.4.4
|
||||
* @interface StatusPayloadRawAccount
|
||||
* @property {string} uid 用户 UID
|
||||
* @property {string} token 用户 token
|
||||
* @return StatusPayloadRawOpen
|
||||
*/
|
||||
interface StatusPayloadRawAccount {
|
||||
uid: string;
|
||||
token: string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -458,6 +458,9 @@ class TGClient {
|
||||
}
|
||||
await window.__TAURI__.event.emit('post_mhy_client',JSON.stringify(arg));
|
||||
isLogin = true;
|
||||
} else {
|
||||
// 等待 500 ms
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
}
|
||||
}
|
||||
})();`;
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file web/request/getStoken.ts
|
||||
* @description 获取 stoken
|
||||
* @since Beta v0.4.3
|
||||
* @since Beta v0.4.4
|
||||
*/
|
||||
|
||||
import { http } from "@tauri-apps/api";
|
||||
@@ -11,17 +11,22 @@ import { getRequestHeader } from "../utils/getRequestHeader";
|
||||
|
||||
/**
|
||||
* @description 获取 stoken
|
||||
* @since Beta v0.3.0
|
||||
* @since Beta v0.4.4
|
||||
* @param {string} accountId 账户 ID
|
||||
* @param {string} gameToken 游戏 Token
|
||||
* @param {string} token 游戏 Token
|
||||
* @param {string} isGameToken 是否为游戏 Token
|
||||
* @returns {Promise<TGApp.BBS.Response.getStokenByGameTokenData | TGApp.BBS.Response.Base>}
|
||||
*/
|
||||
export async function getStokenByGameToken(
|
||||
accountId: string,
|
||||
gameToken: string,
|
||||
token: string,
|
||||
isGameToken: boolean,
|
||||
): Promise<TGApp.BBS.Response.getStokenByGameTokenData | TGApp.BBS.Response.Base> {
|
||||
const url = "https://api-takumi.mihoyo.com/account/ma-cn-session/app/getSTokenByGameToken";
|
||||
const data = { account_id: Number(accountId), game_token: gameToken };
|
||||
let url = "https://api-takumi.mihoyo.com/account/ma-cn-session/app/getSTokenByGameToken";
|
||||
if (isGameToken) {
|
||||
url = "https://api-takumi.mihoyo.com/account/ma-cn-session/app/getTokenByGameToken";
|
||||
}
|
||||
const data = { account_id: Number(accountId), game_token: token };
|
||||
const header = {
|
||||
"x-rpc-app_id": TGConstant.BBS.APP_ID,
|
||||
};
|
||||
@@ -32,8 +37,7 @@ export async function getStokenByGameToken(
|
||||
body: http.Body.json(data),
|
||||
})
|
||||
.then((res) => {
|
||||
console.log(res.data);
|
||||
if (res.data.retcode !== 0) return res.data;
|
||||
if (res.data.retcode !== 0) return <TGApp.BBS.Response.Base>res.data;
|
||||
return res.data.data;
|
||||
});
|
||||
}
|
||||
@@ -64,7 +68,7 @@ export async function getTokenBySToken(
|
||||
headers: header,
|
||||
})
|
||||
.then((res) => {
|
||||
if (res.data.retcode !== 0) return res.data;
|
||||
if (res.data.retcode !== 0) return <TGApp.BBS.Response.Base>res.data;
|
||||
return res.data.data;
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user