♻️ 迁移passportReq

This commit is contained in:
BTMuli
2026-04-15 02:27:56 +08:00
parent 0ed52ff963
commit 96d63e8e8c
7 changed files with 666 additions and 364 deletions

View File

@@ -414,58 +414,92 @@ async function openClient(func: string): Promise<void> {
}
async function tryGetTokens(ck: TGApp.App.Account.Cookie): Promise<void> {
let briefInfoGet: TGApp.App.Account.BriefInfo | undefined;
await showLoading.update("正在获取 LToken");
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes !== "string") {
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
isTryLogin.value = false;
return;
}
showSnackbar.success("获取LToken成功");
ck.ltoken = ltokenRes.data.ltoken;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
showSnackbar.error(`获取LToken失败${errMsg}`);
await TGLogger.Error(`获取LToken异常${errMsg}`);
isTryLogin.value = false;
return;
}
showSnackbar.success("获取LToken成功");
ck.ltoken = ltokenRes;
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes !== "string") {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
isTryLogin.value = false;
return;
}
showSnackbar.success("获取CookieToken成功");
ck.cookie_token = cookieTokenRes.data.cookie_token;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
showSnackbar.error(`获取CookieToken失败:${errMsg}`);
await TGLogger.Error(`获取CookieToken异常${errMsg}`);
isTryLogin.value = false;
return;
}
showSnackbar.success("获取CookieToken成功");
ck.cookie_token = cookieTokenRes;
await showLoading.update("正在获取用户信息");
const briefRes = await bbsReq.userInfo(ck);
console.debug(briefRes);
if ("retcode" in briefRes) {
try {
const briefRes = await bbsReq.userInfo(ck);
console.debug(briefRes);
if ("retcode" in briefRes) {
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Warn(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
isTryLogin.value = false;
return;
}
showSnackbar.success("获取用户信息成功");
briefInfoGet = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
await showLoading.update("正在保存用户数据");
await TSUserAccount.account.saveAccount({
uid: briefInfoGet.uid,
cookie: ck,
brief: briefInfoGet,
updated: "",
});
uid.value = briefInfoGet.uid;
briefInfo.value = briefInfoGet;
cookie.value = ck;
isLogin.value = true;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Error(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`获取用户信息异常:${errMsg}`);
isTryLogin.value = false;
return;
}
if (!briefInfoGet) {
await showLoading.end();
showSnackbar.error("获取用户信息失败");
isTryLogin.value = false;
return;
}
showSnackbar.success("获取用户信息成功");
const briefInfoGet: TGApp.App.Account.BriefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
await showLoading.update("正在保存用户数据");
await TSUserAccount.account.saveAccount({
uid: briefInfoGet.uid,
cookie: ck,
brief: briefInfoGet,
updated: "",
});
uid.value = briefInfoGet.uid;
briefInfo.value = briefInfoGet;
cookie.value = ck;
isLogin.value = true;
await showLoading.update("正在获取游戏账号");
let gameRes: TGApp.BBS.Game.AccountResp | undefined;
try {
@@ -570,21 +604,32 @@ async function tryCodeLogin(): Promise<void> {
* @returns {Promise<string | null>} 返回 action_type 或 null
*/
async function tryGetCaptcha(phone: string, aigis?: string): Promise<string | false> {
const captchaResp = await passportReq.captcha.create(phone, aigis);
if ("retcode" in captchaResp) {
if (!captchaResp.data || captchaResp.data === "") {
showSnackbar.error(`[${captchaResp.retcode}] ${captchaResp.message}`);
await TGLogger.Error(
`[tc-userBadge][tryGetCaptcha] ${captchaResp.retcode} ${captchaResp.message}`,
);
return false;
try {
const resp = await passportReq.captcha.create(phone, aigis);
if (resp.data.retcode !== 0) {
// 检查是否需要极验验证
const aigisData = resp.headers.get("x-rpc-aigis");
if (!aigisData) {
showSnackbar.error(`[${resp.data.retcode}] ${resp.data.message}`);
await TGLogger.Warn(`[t-sidebar][tryGetCaptcha] ${resp.data.retcode} ${resp.data.message}`);
return false;
}
const aigisResp = <TGApp.BBS.CaptchaLogin.CaptchaAigis>JSON.parse(aigisData);
const gtRes = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
if (!gtRes) {
showSnackbar.error("极验验证失败");
return false;
}
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(gtRes))}`;
return await tryGetCaptcha(phone, aigisStr);
}
const aigisResp: TGApp.BBS.CaptchaLogin.CaptchaAigis = JSON.parse(captchaResp.data);
const resp = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(resp))}`;
return await tryGetCaptcha(phone, aigisStr);
return resp.data.data.action_type;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取验证码失败:${errMsg}`);
await TGLogger.Error(`[t-sidebar][tryGetCaptcha] 获取验证码异常:${errMsg}`);
return false;
}
return captchaResp.action_type;
}
/**
@@ -602,22 +647,35 @@ async function tryLoginByCaptcha(
actionType: string,
aigis?: string,
): Promise<TGApp.BBS.CaptchaLogin.LoginRes | false> {
const loginResp = await passportReq.captcha.login(phone, captcha, actionType, aigis);
if ("retcode" in loginResp) {
if (!loginResp.data || loginResp.data === "") {
showSnackbar.error(`[${loginResp.retcode}] ${loginResp.message}`);
await TGLogger.Error(
`[tc-userBadge][tryLoginByCaptcha] ${loginResp.retcode} ${loginResp.message}`,
);
await new Promise<void>((resolve) => setTimeout(resolve, 3000));
return false;
try {
const resp = await passportReq.captcha.login(phone, captcha, actionType, aigis);
if (resp.data.retcode !== 0) {
// 检查是否需要极验验证
const aigisData = resp.headers.get("x-rpc-aigis");
if (!aigisData) {
showSnackbar.error(`[${resp.data.retcode}] ${resp.data.message}`);
await TGLogger.Warn(
`[t-sidebar][tryLoginByCaptcha] ${resp.data.retcode} ${resp.data.message}`,
);
await new Promise<void>((resolve) => setTimeout(resolve, 3000));
return false;
}
const aigisResp = <TGApp.BBS.CaptchaLogin.CaptchaAigis>JSON.parse(aigisData);
const gtRes = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
if (!gtRes) {
showSnackbar.error("极验验证失败");
return false;
}
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(gtRes))}`;
return await tryLoginByCaptcha(phone, captcha, actionType, aigisStr);
}
const aigisResp: TGApp.BBS.CaptchaLogin.CaptchaAigis = JSON.parse(loginResp.data);
const resp = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(resp))}`;
return await tryLoginByCaptcha(phone, captcha, actionType, aigisStr);
return resp.data.data;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`验证码登录失败:${errMsg}`);
await TGLogger.Error(`[t-sidebar][tryLoginByCaptcha] 验证码登录异常:${errMsg}`);
return false;
}
return loginResp;
}
/**
@@ -663,43 +721,77 @@ async function addByCookie(): Promise<void> {
ltoken: "",
};
await showLoading.update("正在获取 LToken");
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes !== "string") {
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
isTryLogin.value = false;
return;
}
ck.ltoken = ltokenRes.data.ltoken;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
showSnackbar.error(`获取LToken失败${errMsg}`);
await TGLogger.Error(`获取LToken异常${errMsg}`);
isTryLogin.value = false;
return;
}
ck.ltoken = ltokenRes;
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes !== "string") {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
isTryLogin.value = false;
return;
}
ck.cookie_token = cookieTokenRes.data.cookie_token;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
showSnackbar.error(`获取CookieToken失败:${errMsg}`);
await TGLogger.Error(`获取CookieToken异常${errMsg}`);
isTryLogin.value = false;
return;
}
ck.cookie_token = cookieTokenRes;
await showLoading.update("正在获取用户信息");
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
let briefInfoGet: TGApp.App.Account.BriefInfo | undefined;
try {
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Warn(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
isTryLogin.value = false;
return;
}
briefInfoGet = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Error(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`获取用户信息异常:${errMsg}`);
isTryLogin.value = false;
return;
}
const briefInfoGet: TGApp.App.Account.BriefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
uid.value = briefRes.uid;
if (!briefInfoGet) {
await showLoading.end();
showSnackbar.error("获取用户信息失败");
isTryLogin.value = false;
return;
}
uid.value = briefInfoGet.uid;
briefInfo.value = briefInfoGet;
cookie.value = ck;
isLogin.value = true;
@@ -764,27 +856,33 @@ async function tryLaunchGame(): Promise<void> {
return;
}
const gamePath = `${gameDir.value}${path.sep()}${find.name}`;
const resp = await passportReq.authTicket(account.value, cookie.value);
if (typeof resp !== "object") {
showSnackbar.error(resp);
await TGLogger.Error(`[sidebar][tryLaunchGame] resp: ${resp}`);
return;
}
if ("retcode" in resp) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
let ticket: string;
try {
const resp = await passportReq.authTicket(account.value, cookie.value);
if (resp.retcode !== 0) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(
`[sidebar][tryLaunchGame] 尝试获取authTicket失败当前用户${account.value.uid}-${account.value.gameUid}`,
);
await TGLogger.Warn(`[sidebar][tryLaunchGame] ${resp.retcode}: ${resp.message}`);
return;
}
ticket = resp.data.ticket;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取authTicket失败${errMsg}`);
await TGLogger.Error(
`[sidebar][tryLaunchGame] 尝试获取authTicket失败,当前用户:${account.value.uid}-${account.value.gameUid}`,
`[sidebar][tryLaunchGame] 获取authTicket异常,当前用户:${account.value.uid}-${account.value.gameUid}`,
);
await TGLogger.Error(`[sidebar][tryLaunchGame] resp: ${JSON.stringify(resp)}`);
await TGLogger.Error(`[sidebar][tryLaunchGame] ${errMsg}`);
return;
}
showSnackbar.success(`成功获取ticket正在启动应用...`);
try {
await invoke("launch_game", { path: gamePath, ticket: resp.ticket });
await invoke("launch_game", { path: gamePath, ticket });
} catch (error) {
showSnackbar.error(`${error}`);
}
return;
}
</script>
<style lang="scss" scoped>

View File

@@ -23,6 +23,7 @@ import useUserStore from "@store/user.js";
import { path } from "@tauri-apps/api";
import { invoke } from "@tauri-apps/api/core";
import { readDir } from "@tauri-apps/plugin-fs";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { storeToRefs } from "pinia";
@@ -49,23 +50,30 @@ async function tryPlayGame(): Promise<void> {
return;
}
const gamePath = `${gameDir.value}${path.sep()}${find.name}`;
const resp = await passportReq.authTicket(account.value, cookie.value);
if (typeof resp !== "object") {
showSnackbar.error(resp);
await TGLogger.Error(`[sidebar][tryLaunchGame] resp: ${resp}`);
return;
}
if ("retcode" in resp) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
let ticket: string;
try {
const resp = await passportReq.authTicket(account.value, cookie.value);
if (resp.retcode !== 0) {
showSnackbar.error(`[${resp.retcode}] ${resp.message}`);
await TGLogger.Warn(
`[config][gameBadge] 尝试获取authTicket失败当前用户${account.value.uid}-${account.value.gameUid}`,
);
await TGLogger.Warn(`[config][gameBadge] ${resp.retcode}: ${resp.message}`);
return;
}
ticket = resp.data.ticket;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取authTicket失败${errMsg}`);
await TGLogger.Error(
`[config][gameBadge] 尝试获取authTicket失败,当前用户:${account.value.uid}-${account.value.gameUid}`,
`[config][gameBadge] 获取authTicket异常,当前用户:${account.value.uid}-${account.value.gameUid}`,
);
await TGLogger.Error(`[config][gameBadge] resp: ${JSON.stringify(resp)}`);
await TGLogger.Error(`[config][gameBadge] ${errMsg}`);
return;
}
showSnackbar.success(`成功获取ticket正在启动应用...`);
try {
await invoke("launch_game", { path: gamePath, ticket: resp.ticket });
await invoke("launch_game", { path: gamePath, ticket });
} catch (error) {
showSnackbar.error(`${error}`);
}

View File

@@ -151,54 +151,84 @@ const userInfo = computed<TGApp.App.Account.BriefInfo>(() => {
});
async function tryGetTokens(ck: TGApp.App.Account.Cookie): Promise<void> {
let briefInfoGet: TGApp.App.Account.BriefInfo | undefined;
await showLoading.update("正在获取 LToken");
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes !== "string") {
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
return;
}
showSnackbar.success("获取LToken成功");
ck.ltoken = ltokenRes.data.ltoken;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
showSnackbar.error(`获取LToken失败${errMsg}`);
await TGLogger.Error(`获取LToken异常${errMsg}`);
return;
}
showSnackbar.success("获取LToken成功");
ck.ltoken = ltokenRes;
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes !== "string") {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
return;
}
showSnackbar.success("获取CookieToken成功");
ck.cookie_token = cookieTokenRes.data.cookie_token;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
showSnackbar.error(`获取CookieToken失败:${errMsg}`);
await TGLogger.Error(`获取CookieToken异常${errMsg}`);
return;
}
showSnackbar.success("获取CookieToken成功");
ck.cookie_token = cookieTokenRes;
await showLoading.update("正在获取用户信息");
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
try {
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Warn(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
return;
}
showSnackbar.success("获取用户信息成功");
briefInfoGet = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
await showLoading.update("正在保存用户数据");
await TSUserAccount.account.saveAccount({
uid: briefInfoGet.uid,
cookie: ck,
brief: briefInfoGet,
updated: "",
});
uid.value = briefInfoGet.uid;
briefInfo.value = briefInfoGet;
cookie.value = ck;
isLogin.value = true;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Error(`获取用户数据失败${briefRes.retcode}-${briefRes.message}`);
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`获取用户信息异常${errMsg}`);
return;
}
if (!briefInfoGet) {
await showLoading.end();
showSnackbar.error("获取用户信息失败");
return;
}
showSnackbar.success("获取用户信息成功");
const briefInfoGet: TGApp.App.Account.BriefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
await showLoading.update("正在保存用户数据");
await TSUserAccount.account.saveAccount({
uid: briefInfoGet.uid,
cookie: ck,
brief: briefInfoGet,
updated: "",
});
uid.value = briefInfoGet.uid;
briefInfo.value = briefInfoGet;
cookie.value = ck;
isLogin.value = true;
await showLoading.update("正在获取游戏账号");
let gameRes: TGApp.BBS.Game.AccountResp | undefined;
try {
@@ -276,63 +306,91 @@ async function refreshUser(uid: string, full: boolean) {
}
let ck = account.cookie;
await showLoading.start("正在刷新用户信息", "正在验证 LToken");
const verifyLTokenRes = await passportReq.lToken.verify(ck);
if (typeof verifyLTokenRes === "string") {
await showLoading.update("验证 LToken 成功");
showSnackbar.success("验证 LToken 成功");
await TGLogger.Info("[tc-userBadge][refreshUser] 验证 LToken 成功");
} else {
await showLoading.update("验证 LToken 失败,将尝试重新获取 LToken");
showSnackbar.error(`[${verifyLTokenRes.retcode}]${verifyLTokenRes.message}`);
await TGLogger.Warn("[tc-userBadge][refreshUser] 验证 LToken 失败");
await TGLogger.Warn(
`[tc-userBadge][refreshUser] ${verifyLTokenRes.retcode}: ${verifyLTokenRes.message}`,
);
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes === "string") {
await showLoading.update("获取 LToken 成功");
ck.ltoken = ltokenRes;
await TGLogger.Info("[tc-userBadge][refreshUser] 获取 LToken 成功");
try {
const verifyLTokenRes = await passportReq.lToken.verify(ck);
if (verifyLTokenRes.retcode === 0) {
await showLoading.update("验证 LToken 成功");
showSnackbar.success("验证 LToken 成功");
await TGLogger.Info("[tc-userBadge][refreshUser] 验证 LToken 成功");
} else {
await showLoading.update("获取 LToken 失败");
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error("[tc-userBadge][refreshUser] 获取 LToken 失败");
await TGLogger.Error(
`[tc-userBadge][refreshUser] ${ltokenRes.retcode}: ${ltokenRes.message}`,
await showLoading.update("验证 LToken 失败,将尝试重新获取 LToken");
showSnackbar.error(`[${verifyLTokenRes.retcode}]${verifyLTokenRes.message}`);
await TGLogger.Warn("[tc-userBadge][refreshUser] 验证 LToken 失败");
await TGLogger.Warn(
`[tc-userBadge][refreshUser] ${verifyLTokenRes.retcode}: ${verifyLTokenRes.message}`,
);
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode === 0) {
await showLoading.update("获取 LToken 成功");
ck.ltoken = ltokenRes.data.ltoken;
await TGLogger.Info("[tc-userBadge][refreshUser] 获取 LToken 成功");
} else {
await showLoading.update("获取 LToken 失败");
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn("[tc-userBadge][refreshUser] 获取 LToken 失败");
await TGLogger.Warn(
`[tc-userBadge][refreshUser] ${ltokenRes.retcode}: ${ltokenRes.message}`,
);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("获取 LToken 失败");
showSnackbar.error(`获取 LToken 失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][refreshUser] 获取 LToken 异常:${errMsg}`);
}
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("验证 LToken 失败");
showSnackbar.error(`验证 LToken 失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][refreshUser] 验证 LToken 异常:${errMsg}`);
}
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes === "string") {
await showLoading.update("获取 CookieToken 成功");
ck.cookie_token = cookieTokenRes;
await TGLogger.Info("[tc-userBadge][refreshUser] 获取 CookieToken 成功");
} else {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode === 0) {
await showLoading.update("获取 CookieToken 成功");
ck.cookie_token = cookieTokenRes.data.cookie_token;
await TGLogger.Info("[tc-userBadge][refreshUser] 获取 CookieToken 成功");
} else {
await showLoading.update("获取 CookieToken 失败");
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn("[tc-userBadge][refreshUser] 获取 CookieToken 失败");
await TGLogger.Warn(
`[tc-userBadge][refreshUser] ${cookieTokenRes.retcode}: ${cookieTokenRes.message}`,
);
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("获取 CookieToken 失败");
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error("[tc-userBadge][refreshUser] 获取 CookieToken 失败");
await TGLogger.Error(
`[tc-userBadge][refreshUser] ${cookieTokenRes.retcode}: ${cookieTokenRes.message}`,
);
showSnackbar.error(`获取 CookieToken 失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][refreshUser] 获取 CookieToken 异常:${errMsg}`);
}
account.cookie = ck;
await showLoading.update("正在获取用户信息");
const infoRes = await bbsReq.userInfo(ck);
if ("retcode" in infoRes) {
try {
const infoRes = await bbsReq.userInfo(ck);
if ("retcode" in infoRes) {
await showLoading.update("获取用户信息失败");
showSnackbar.error(`[${infoRes.retcode}]${infoRes.message}`);
await TGLogger.Warn("[tc-userBadge][refreshUserInfo] 获取用户信息失败");
await TGLogger.Warn(`[tc-userBadge][refreshUserInfo] ${infoRes.retcode}: ${infoRes.message}`);
} else {
await showLoading.update("获取用户信息成功");
account.brief = {
nickname: infoRes.nickname,
uid: infoRes.uid,
avatar: infoRes.avatar_url,
desc: infoRes.introduce,
};
await TGLogger.Info("[tc-userBadge][refreshUserInfo] 获取用户信息成功");
}
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("获取用户信息失败");
showSnackbar.error(`[${infoRes.retcode}]${infoRes.message}`);
await TGLogger.Error("[tc-userBadge][refreshUserInfo] 获取用户信息失败");
await TGLogger.Error(`[tc-userBadge][refreshUserInfo] ${infoRes.retcode}: ${infoRes.message}`);
} else {
await showLoading.update("获取用户信息成功");
account.brief = {
nickname: infoRes.nickname,
uid: infoRes.uid,
avatar: infoRes.avatar_url,
desc: infoRes.introduce,
};
await TGLogger.Info("[tc-userBadge][refreshUserInfo] 获取用户信息成功");
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][refreshUserInfo] 获取用户信息异常:${errMsg}`);
}
if (!full) {
await showLoading.end();
@@ -359,8 +417,7 @@ async function refreshUser(uid: string, full: boolean) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.update("获取游戏账号信息失败");
showSnackbar.error(`获取游戏账号信息失败:${errMsg}`);
await TGLogger.Error("[tc-userBadge][refreshUserInfo] 获取账号信息异常");
await TGLogger.Error(`[tc-userBadge][refreshUserInfo] ${e}`);
await TGLogger.Error(`[tc-userBadge][refreshUserInfo] 获取账号信息异常${errMsg}`);
}
await showLoading.end();
}
@@ -418,21 +475,34 @@ async function confirmCopyCookie(): Promise<void> {
}
async function tryGetCaptcha(phone: string, aigis?: string): Promise<string | false> {
const captchaResp = await passportReq.captcha.create(phone, aigis);
if ("retcode" in captchaResp) {
if (!captchaResp.data || captchaResp.data === "") {
showSnackbar.error(`[${captchaResp.retcode}] ${captchaResp.message}`);
await TGLogger.Error(
`[tc-userBadge][tryGetCaptcha] ${captchaResp.retcode} ${captchaResp.message}`,
);
return false;
try {
const resp = await passportReq.captcha.create(phone, aigis);
if (resp.data.retcode !== 0) {
// 检查是否需要极验验证
const aigisData = resp.headers.get("x-rpc-aigis");
if (!aigisData) {
showSnackbar.error(`[${resp.data.retcode}] ${resp.data.message}`);
await TGLogger.Warn(
`[tc-userBadge][tryGetCaptcha] ${resp.data.retcode} ${resp.data.message}`,
);
return false;
}
const aigisResp = <TGApp.BBS.CaptchaLogin.CaptchaAigis>JSON.parse(aigisData);
const gtRes = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
if (!gtRes) {
showSnackbar.error("极验验证失败");
return false;
}
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(gtRes))}`;
return await tryGetCaptcha(phone, aigisStr);
}
const aigisResp: TGApp.BBS.CaptchaLogin.CaptchaAigis = JSON.parse(captchaResp.data);
const resp = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(resp))}`;
return await tryGetCaptcha(phone, aigisStr);
return resp.data.data.action_type;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`获取验证码失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][tryGetCaptcha] 获取验证码异常:${errMsg}`);
return false;
}
return captchaResp.action_type;
}
async function tryLoginByCaptcha(
@@ -441,21 +511,34 @@ async function tryLoginByCaptcha(
actionType: string,
aigis?: string,
): Promise<TGApp.BBS.CaptchaLogin.LoginRes | false> {
const loginResp = await passportReq.captcha.login(phone, captcha, actionType, aigis);
if ("retcode" in loginResp) {
if (!loginResp.data || loginResp.data === "") {
showSnackbar.error(`[${loginResp.retcode}] ${loginResp.message}`);
await TGLogger.Error(
`[tc-userBadge][tryLoginByCaptcha] ${loginResp.retcode} ${loginResp.message}`,
);
return false;
try {
const resp = await passportReq.captcha.login(phone, captcha, actionType, aigis);
if (resp.data.retcode !== 0) {
// 检查是否需要极验验证
const aigisData = resp.headers.get("x-rpc-aigis");
if (!aigisData) {
showSnackbar.error(`[${resp.data.retcode}] ${resp.data.message}`);
await TGLogger.Warn(
`[tc-userBadge][tryLoginByCaptcha] ${resp.data.retcode} ${resp.data.message}`,
);
return false;
}
const aigisResp = <TGApp.BBS.CaptchaLogin.CaptchaAigis>JSON.parse(aigisData);
const gtRes = await showGeetest(JSON.parse(aigisResp.data), aigisResp);
if (!gtRes) {
showSnackbar.error("极验验证失败");
return false;
}
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(gtRes))}`;
return await tryLoginByCaptcha(phone, captcha, actionType, aigisStr);
}
const aigisResp: TGApp.BBS.CaptchaLogin.CaptchaAigis = JSON.parse(loginResp.data);
const resp = await showGeetest(JSON.parse(aigisResp.data));
const aigisStr = `${aigisResp.session_id};${btoa(JSON.stringify(resp))}`;
return await tryLoginByCaptcha(phone, captcha, actionType, aigisStr);
return resp.data.data;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
showSnackbar.error(`验证码登录失败:${errMsg}`);
await TGLogger.Error(`[tc-userBadge][tryLoginByCaptcha] 验证码登录异常:${errMsg}`);
return false;
}
return loginResp;
}
async function showMenu(): Promise<void> {
@@ -508,40 +591,70 @@ async function addByCookie(): Promise<void> {
ltoken: "",
};
await showLoading.update("正在获取 LToken");
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes !== "string") {
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
return;
}
ck.ltoken = ltokenRes.data.ltoken;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
showSnackbar.error(`获取LToken失败${errMsg}`);
await TGLogger.Error(`获取LToken异常${errMsg}`);
return;
}
ck.ltoken = ltokenRes;
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes !== "string") {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
return;
}
ck.cookie_token = cookieTokenRes.data.cookie_token;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
showSnackbar.error(`获取CookieToken失败:${errMsg}`);
await TGLogger.Error(`获取CookieToken异常${errMsg}`);
return;
}
ck.cookie_token = cookieTokenRes;
await showLoading.update("正在获取用户信息");
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
let briefGet: TGApp.App.Account.BriefInfo | undefined;
try {
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Warn(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
return;
}
briefGet = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Error(`获取用户数据失败${briefRes.retcode}-${briefRes.message}`);
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`获取用户信息异常${errMsg}`);
return;
}
const briefGet: TGApp.App.Account.BriefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
uid.value = briefRes.uid;
if (!briefGet) {
await showLoading.end();
showSnackbar.error("获取用户信息失败");
return;
}
uid.value = briefGet.uid;
briefInfo.value = briefGet;
cookie.value = ck;
isLogin.value = true;

View File

@@ -9,6 +9,7 @@ import bbsReq from "@req/bbsReq.js";
import passportReq from "@req/passportReq.js";
import { path } from "@tauri-apps/api";
import { exists, mkdir, readTextFile, writeTextFile } from "@tauri-apps/plugin-fs";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { timestampToDate } from "@utils/toolFunc.js";
@@ -137,39 +138,69 @@ async function updateAllAccountCk(): Promise<void> {
async function updateAccountCk(data: TGApp.App.Account.User): Promise<boolean> {
const ck = data.cookie;
await showLoading.update("正在获取 LToken");
const ltokenRes = await passportReq.lToken.get(ck);
if (typeof ltokenRes !== "string") {
try {
const ltokenRes = await passportReq.lToken.get(ck);
if (ltokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Warn(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
return false;
}
ck.ltoken = ltokenRes.data.ltoken;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${ltokenRes.retcode}]${ltokenRes.message}`);
await TGLogger.Error(`获取LToken失败${ltokenRes.retcode}-${ltokenRes.message}`);
showSnackbar.error(`获取LToken失败${errMsg}`);
await TGLogger.Error(`获取LToken异常${errMsg}`);
return false;
}
ck.ltoken = ltokenRes;
await showLoading.update("正在获取 CookieToken");
const cookieTokenRes = await passportReq.cookieToken(ck);
if (typeof cookieTokenRes !== "string") {
try {
const cookieTokenRes = await passportReq.cookieToken(ck);
if (cookieTokenRes.retcode !== 0) {
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Warn(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
return false;
}
ck.cookie_token = cookieTokenRes.data.cookie_token;
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${cookieTokenRes.retcode}]${cookieTokenRes.message}`);
await TGLogger.Error(
`获取CookieToken失败${cookieTokenRes.retcode}-${cookieTokenRes.message}`,
);
showSnackbar.error(`获取CookieToken失败:${errMsg}`);
await TGLogger.Error(`获取CookieToken异常${errMsg}`);
return false;
}
ck.cookie_token = cookieTokenRes;
await showLoading.update("正在获取用户信息");
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
let briefInfo: TGApp.App.Account.BriefInfo | undefined;
try {
const briefRes = await bbsReq.userInfo(ck);
if ("retcode" in briefRes) {
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Warn(`获取用户数据失败:${briefRes.retcode}-${briefRes.message}`);
return false;
}
briefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await showLoading.end();
showSnackbar.error(`[${briefRes.retcode}]${briefRes.message}`);
await TGLogger.Error(`获取用户数据失败${briefRes.retcode}-${briefRes.message}`);
showSnackbar.error(`获取用户信息失败:${errMsg}`);
await TGLogger.Error(`获取用户信息异常${errMsg}`);
return false;
}
if (!briefInfo) {
await showLoading.end();
showSnackbar.error("获取用户信息失败");
return false;
}
const briefInfo: TGApp.App.Account.BriefInfo = {
nickname: briefRes.nickname,
uid: briefRes.uid,
avatar: briefRes.avatar_url,
desc: briefRes.introduce,
};
const updated = timestampToDate(new Date().getTime());
await showLoading.update("正在写入数据库");
const db = await TGSqlite.getDB();

View File

@@ -1,10 +1,10 @@
/**
* Passport 相关请求
* @since Beta v0.9.9
* @since Beta v0.10.1
*/
import { getRequestHeader } from "@utils/getRequestHeader.js";
import TGBbs from "@utils/TGBbs.js";
import TGHttp from "@utils/TGHttp.js";
import TGHttps from "@utils/TGHttps.js";
import { getDeviceInfo } from "@utils/toolFunc.js";
import { JSEncrypt } from "jsencrypt";
@@ -36,16 +36,16 @@ function rsaEncrypt(data: string): string {
}
/**
* 获取登录ticket
* @since Beta v0.9.9
* 获取登录 ticket
* @since Beta v0.10.1
* @param account - 账户
* @param cookie - cookie
* @returns ticket
* @returns ticket 响应数据
*/
async function createAuthTicketByGameBiz(
account: TGApp.Sqlite.Account.Game,
cookie: TGApp.App.Account.Cookie,
): Promise<TGApp.BBS.Response.Base | TGApp.Game.Login.GameAuthTicketRes> {
): Promise<TGApp.Game.Login.GameAuthTicketResp> {
const params: Record<string, string> = {
game_biz: account.gameBiz,
stoken: cookie.stoken,
@@ -56,25 +56,24 @@ async function createAuthTicketByGameBiz(
"x-rpc-client_type": "3",
"x-rpc-app_id": "ddxf5dufpuyo",
};
const resp = await TGHttp<TGApp.Game.Login.GameAuthTicketResp>(
const resp = await TGHttps.post<TGApp.Game.Login.GameAuthTicketResp>(
`${pAbu}account/ma-cn-verifier/app/createAuthTicketByGameBiz`,
{ method: "POST", headers: headers, query: params },
{ headers: headers, query: params },
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data;
}
/**
* 获取短信验证码
* @since Beta v0.7.2
* @since Beta v0.10.1
* @param phone - 手机号
* @param aigis - 验证数据
* @returns 验证码返回
* @returns 验证码响应
*/
async function createLoginCaptcha(
phone: string,
aigis?: string,
): Promise<TGApp.BBS.CaptchaLogin.CaptchaRes | TGApp.BBS.Response.BaseWithData<string>> {
): Promise<TGApp.App.Response.Resp<TGApp.BBS.CaptchaLogin.CaptchaResp>> {
const body = { area_code: rsaEncrypt("+86"), mobile: rsaEncrypt(phone) };
const header: Record<string, string> = {
"x-rpc-aigis": aigis || "",
@@ -90,35 +89,22 @@ async function createLoginCaptcha(
referer: "https://user.miyoushe.com/",
"x-rpc-game_biz": "hk4e_cn",
};
const resp = await TGHttp<TGApp.BBS.CaptchaLogin.CaptchaResp>(
return await TGHttps.post<TGApp.BBS.CaptchaLogin.CaptchaResp>(
`${pAbu}account/ma-cn-verifier/verifier/createLoginCaptcha`,
{ method: "POST", headers: header, body: JSON.stringify(body) },
true,
{ headers: header, body: body },
);
const data = await resp.data;
if (data.retcode !== 0) {
return <TGApp.BBS.Response.BaseWithData<string>>{
retcode: data.retcode,
message: data.message,
data: resp.resp.headers.get("x-rpc-aigis"),
};
}
return <TGApp.BBS.CaptchaLogin.CaptchaRes>data.data;
}
/**
* 创建登录二维码
* @since Beta v0.6.8
* @since Beta v0.10.1
* @deprecated 返回数据不符合要求
* @returns 二维码URL
* @returns 二维码响应数据
*/
async function createQrLogin(): Promise<
TGApp.BBS.Response.Base | TGApp.BBS.GameLogin.GetLoginQrData
> {
const resp = await TGHttp<TGApp.BBS.GameLogin.GetLoginQrResponse>(
async function createQrLogin(): Promise<TGApp.BBS.GameLogin.GetLoginQrResponse> {
const resp = await TGHttps.post<TGApp.BBS.GameLogin.GetLoginQrResponse>(
`${pAbu}account/ma-cn-passport/app/createQRLogin`,
{
method: "POST",
headers: {
"x-rpc-device_id": getDeviceInfo("device_id"),
"user-agent": `HYPContainer/${hlv}`,
@@ -127,65 +113,60 @@ async function createQrLogin(): Promise<
},
},
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data;
}
/**
* 根据 stoken 获取 cookie_token
* @since Beta v0.6.3
* @since Beta v0.10.1
* @param cookie - Cookie
* @returns cookie_token
* @returns cookie_token 响应数据
*/
async function getCookieAccountInfoBySToken(
cookie: TGApp.App.Account.Cookie,
): Promise<string | TGApp.BBS.Response.Base> {
): Promise<TGApp.BBS.Passport.CookieTokenResp> {
const ck = { stoken: cookie.stoken, mid: cookie.mid };
const params = { stoken: cookie.stoken };
type ResType = { uid: string; cookie_token: string };
const resp = await TGHttp<TGApp.BBS.Response.BaseWithData<ResType>>(
const resp = await TGHttps.get<TGApp.BBS.Passport.CookieTokenResp>(
`${pAbu}account/auth/api/getCookieAccountInfoBySToken`,
{ method: "GET", headers: getRequestHeader(ck, "GET", params), query: params },
{ headers: getRequestHeader(ck, "GET", params), query: params },
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data.cookie_token;
return resp.data;
}
/**
* 根据 stoken_v2 获取 ltoken
* @since Beta v0.5.0
* @since Beta v0.10.1
* @param cookie - Cookie
* @returns ltoken
* @returns ltoken 响应数据
*/
async function getLTokenBySToken(
cookie: TGApp.App.Account.Cookie,
): Promise<string | TGApp.BBS.Response.Base> {
): Promise<TGApp.BBS.Passport.LTokenResp> {
const ck = { mid: cookie.mid, stoken: cookie.stoken };
const params = { stoken: cookie.stoken };
type ResType = { ltoken: string };
const resp = await TGHttp<TGApp.BBS.Response.BaseWithData<ResType>>(
const resp = await TGHttps.get<TGApp.BBS.Passport.LTokenResp>(
`${pAbu}account/auth/api/getLTokenBySToken`,
{ method: "GET", headers: getRequestHeader(ck, "GET", params), query: params },
{ headers: getRequestHeader(ck, "GET", params), query: params },
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data.ltoken;
return resp.data;
}
/**
* 通过短信验证码登录
* @since Beta v0.5.1
* @since Beta v0.10.1
* @param phone - 手机号
* @param captcha - 验证码
* @param action_type - 操作类型
* @param aigis - 验证数据
* @returns 登录返回
* @returns 登录响应
*/
async function loginByMobileCaptcha(
phone: string,
captcha: string,
action_type: string,
aigis?: string,
): Promise<TGApp.BBS.CaptchaLogin.LoginRes | TGApp.BBS.Response.Base> {
): Promise<TGApp.App.Response.Resp<TGApp.BBS.CaptchaLogin.LoginResp>> {
const body = {
area_code: rsaEncrypt("+86"),
mobile: rsaEncrypt(phone),
@@ -203,81 +184,53 @@ async function loginByMobileCaptcha(
"x-rpc-device_model": getDeviceInfo("product"),
"user-agent": TGBbs.ua,
};
const resp = await TGHttp<TGApp.BBS.CaptchaLogin.LoginResp>(
return await TGHttps.post<TGApp.BBS.CaptchaLogin.LoginResp>(
`${pAbu}account/ma-cn-passport/app/loginByMobileCaptcha`,
{ method: "POST", headers: header, body: JSON.stringify(body) },
{ headers: header, body: body },
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data;
}
/**
* 获取登录状态
* @since Beta v0.6.8
* @since Beta v0.10.1
* @deprecated 返回数据不符合要求
* @param ticket - 二维码 ticket
* @returns 登录状态
* @returns 登录状态响应数据
*/
async function queryLoginStatus(
ticket: string,
): Promise<TGApp.BBS.Response.Base | TGApp.BBS.GameLogin.GetLoginStatusData> {
const resp = await TGHttp<TGApp.BBS.GameLogin.GetLoginStatusResponse>(
): Promise<TGApp.BBS.GameLogin.GetLoginStatusResponse> {
const resp = await TGHttps.post<TGApp.BBS.GameLogin.GetLoginStatusResponse>(
`${pAbu}account/ma-cn-passport/app/queryQRLoginStatus`,
{
method: "POST",
headers: {
"x-rpc-device_id": getDeviceInfo("device_id"),
"user-agent": `HYPContainer/${hlv}`,
"x-rpc-app_id": "ddxf5dufpuyo",
"x-rpc-client_type": "3",
},
body: JSON.stringify({ ticket }),
body: { ticket },
},
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data;
}
/**
* 验证 ltoken 有效性,返回 mid
* @since Beta v0.6.5
* @since Beta v0.10.1
* @param cookie - 账户 cookie
* @returns mid
* @returns 验证响应数据
*/
async function verifyLToken(
cookie: TGApp.App.Account.Cookie,
): Promise<string | TGApp.BBS.Response.Base> {
): Promise<TGApp.BBS.Passport.VerifyLTokenResp> {
const ck = { ltoken: cookie.ltoken, ltuid: cookie.ltuid };
const data = { ltoken: cookie.ltoken };
type ResType = {
realname_info: unknown;
need_realperson: boolean;
user_info: {
aid: string;
mid: string;
account_name: string;
email: string;
is_email_verify: number;
area_code: string;
safe_mobile: string;
realname: string;
identity_code: string;
rebind_area_code: string;
rebind_mobile: string;
rebind_mobile_time: string;
links: Array<unknown>;
};
};
const resp = await TGHttp<TGApp.BBS.Response.BaseWithData<ResType>>(
const resp = await TGHttps.post<TGApp.BBS.Passport.VerifyLTokenResp>(
`${p4Abu}account/ma-cn-session/web/verifyLtoken`,
{
method: "POST",
headers: getRequestHeader(ck, "POST", data),
body: JSON.stringify(data),
},
{ headers: getRequestHeader(ck, "POST", data), body: data },
);
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
return resp.data.user_info.mid;
return resp.data;
}
const passportReq = {

90
src/types/BBS/Passport.d.ts vendored Normal file
View File

@@ -0,0 +1,90 @@
/**
* Passport 相关类型定义
* @since Beta v0.10.1
*/
declare namespace TGApp.BBS.Passport {
/**
* 获取 CookieToken 返回响应
* @since Beta v0.10.1
*/
type CookieTokenResp = TGApp.BBS.Response.BaseWithData<CookieTokenRes>;
/**
* 获取 CookieToken 返回数据
* @since Beta v0.10.1
*/
type CookieTokenRes = {
/** 用户 UID */
uid: string;
/** CookieToken */
cookie_token: string;
};
/**
* 获取 LToken 返回响应
* @since Beta v0.10.1
*/
type LTokenResp = TGApp.BBS.Response.BaseWithData<LTokenRes>;
/**
* 获取 LToken 返回数据
* @since Beta v0.10.1
*/
type LTokenRes = {
/** LToken */
ltoken: string;
};
/**
* 验证 LToken 返回响应
* @since Beta v0.10.1
*/
type VerifyLTokenResp = TGApp.BBS.Response.BaseWithData<VerifyLTokenRes>;
/**
* 验证 LToken 返回数据
* @since Beta v0.10.1
*/
type VerifyLTokenRes = {
/** 实名信息 */
realname_info: unknown;
/** 是否需要真人验证 */
need_realperson: boolean;
/** 用户信息 */
user_info: VerifyLTokenUserInfo;
};
/**
* 验证 LToken 用户信息
* @since Beta v0.10.1
*/
type VerifyLTokenUserInfo = {
/** 账号 ID */
aid: string;
/** mid */
mid: string;
/** 账号名称 */
account_name: string;
/** 邮箱 */
email: string;
/** 是否验证邮箱 */
is_email_verify: number;
/** 区域代码 */
area_code: string;
/** 安全手机号 */
safe_mobile: string;
/** 真实姓名 */
realname: string;
/** 身份证号 */
identity_code: string;
/** 重新绑定区域代码 */
rebind_area_code: string;
/** 重新绑定手机号 */
rebind_mobile: string;
/** 重新绑定时间 */
rebind_mobile_time: string;
/** 链接信息 */
links: Array<unknown>;
};
}

View File

@@ -15,11 +15,11 @@ import { core, event, webviewWindow } from "@tauri-apps/api";
import type { Event, UnlistenFn } from "@tauri-apps/api/event";
import { openUrl } from "@tauri-apps/plugin-opener";
import { getDS4JS } from "@utils/getRequestHeader.js";
import TGHttps from "@utils/TGHttps.js";
import TGLogger from "@utils/TGLogger.js";
import { parseLink } from "./linkParser.js";
import TGBbs from "./TGBbs.js";
import TGLogger from "./TGLogger.js";
import TGHttps from "./TGHttps.js";
import { createPost } from "./TGWindow.js";
import { getDeviceInfo } from "./toolFunc.js";
@@ -583,10 +583,19 @@ class Client {
const user = useUserStore();
if (!user.cookie) return;
if (typeof arg.payload === "object" && arg.payload.forceRefresh) {
const res = await passportReq.cookieToken(user.cookie);
if (typeof res !== "string") return;
user.cookie.cookie_token = res;
await TGSqlite.saveAppData("cookie", JSON.stringify(user.cookie));
try {
const res = await passportReq.cookieToken(user.cookie);
if (res.retcode !== 0) {
await TGLogger.Warn(`[TGClient][getCookieToken] ${res.retcode}: ${res.message}`);
return;
}
user.cookie.cookie_token = res.data.cookie_token;
await TGSqlite.saveAppData("cookie", JSON.stringify(user.cookie));
} catch (e) {
const errMsg = TGHttps.getErrMsg(e);
await TGLogger.Error(`[TGClient][getCookieToken] 获取cookie_token异常${errMsg}`);
return;
}
}
const executeJS = `javascript:(function(){
let domainCur = window.location.hostname;