️ 调整扫码登录逻辑

close #99
This commit is contained in:
目棃
2024-03-12 22:02:04 +08:00
parent cb8d12cc84
commit 16e550ee40
6 changed files with 127 additions and 74 deletions

View File

@@ -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: "确认刷新用户信息吗?",

View File

@@ -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;

View File

@@ -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, {

View File

@@ -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;
}
}

View File

@@ -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));
}
}
})();`;

View File

@@ -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;
});
}