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