mirror of
https://github.com/BTMuli/TeyvatGuide.git
synced 2026-03-15 03:53:16 +08:00
♻️ 感觉差不多了,剩下的就靠测试了 #92
This commit is contained in:
37
src-tauri/capabilities/DevJson.json
Normal file
37
src-tauri/capabilities/DevJson.json
Normal file
@@ -0,0 +1,37 @@
|
||||
{
|
||||
"$schema": "./schemas/desktop-schema.json",
|
||||
"identifier": "DevJson",
|
||||
"description": "Capability for the dev json window",
|
||||
"windows": ["Dev_JSON"],
|
||||
"permissions": [
|
||||
"app:allow-version",
|
||||
"app:default",
|
||||
"event:allow-listen",
|
||||
"event:default",
|
||||
"http:allow-fetch",
|
||||
"log:allow-log",
|
||||
"log:default",
|
||||
"path:allow-resolve-directory",
|
||||
"path:default",
|
||||
"sql:allow-load",
|
||||
"sql:allow-execute",
|
||||
"sql:default",
|
||||
"window:allow-close",
|
||||
"window:allow-destroy",
|
||||
"window:allow-set-title",
|
||||
"window:allow-set-fullscreen",
|
||||
"window:allow-show",
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [
|
||||
{
|
||||
"url": "https://*.miyoushe.com/*"
|
||||
},
|
||||
{
|
||||
"url": "https://*.mihoyo.com/*"
|
||||
}
|
||||
]
|
||||
}
|
||||
],
|
||||
"platforms": ["windows", "macOS"]
|
||||
}
|
||||
@@ -3,7 +3,41 @@
|
||||
"identifier": "Mys",
|
||||
"description": "Capability for the mys client window",
|
||||
"windows": ["mhy_client"],
|
||||
"permissions": ["event:allow-emit"],
|
||||
"permissions": [
|
||||
"dialog:allow-message",
|
||||
"dialog:default",
|
||||
"event:allow-emit",
|
||||
"path:allow-resolve-directory",
|
||||
"path:default",
|
||||
{
|
||||
"identifier": "fs:allow-exists",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-mkdir",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-read-dir",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-read-text-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-remove",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-write-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-write-text-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
}
|
||||
],
|
||||
"remote": {
|
||||
"urls": ["https://*.mihoyo.com/*", "https://*.miyoushe.com/*"]
|
||||
},
|
||||
|
||||
@@ -8,10 +8,7 @@
|
||||
"app:default",
|
||||
"event:allow-listen",
|
||||
"event:default",
|
||||
"fs:allow-remove",
|
||||
"fs:default",
|
||||
"fs:scope-cache-recursive",
|
||||
"fs:scope-document-recursive",
|
||||
"http:allow-fetch",
|
||||
"log:allow-log",
|
||||
"log:default",
|
||||
@@ -26,10 +23,43 @@
|
||||
"sql:allow-load",
|
||||
"sql:allow-execute",
|
||||
"sql:default",
|
||||
"webview:allow-create-webview-window",
|
||||
"webview:default",
|
||||
"window:allow-close",
|
||||
"window:allow-destroy",
|
||||
"window:default",
|
||||
"window:allow-is-minimized",
|
||||
"window:allow-set-title",
|
||||
"window:allow-set-focus",
|
||||
"window:allow-show",
|
||||
{
|
||||
"identifier": "fs:allow-exists",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-mkdir",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-read-dir",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-read-text-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-remove",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-write-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "fs:allow-write-text-file",
|
||||
"allow": [{ "path": "**" }]
|
||||
},
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [
|
||||
|
||||
@@ -1,11 +1,54 @@
|
||||
{
|
||||
"DevJson": {
|
||||
"identifier": "DevJson",
|
||||
"description": "Capability for the dev json window",
|
||||
"local": true,
|
||||
"windows": ["Dev_JSON"],
|
||||
"permissions": [
|
||||
"app:allow-version",
|
||||
"app:default",
|
||||
"event:allow-listen",
|
||||
"event:default",
|
||||
"http:allow-fetch",
|
||||
"log:allow-log",
|
||||
"log:default",
|
||||
"path:allow-resolve-directory",
|
||||
"path:default",
|
||||
"sql:allow-load",
|
||||
"sql:allow-execute",
|
||||
"sql:default",
|
||||
"window:allow-close",
|
||||
"window:allow-destroy",
|
||||
"window:allow-set-title",
|
||||
"window:allow-set-fullscreen",
|
||||
"window:allow-show",
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [{ "url": "https://*.miyoushe.com/*" }, { "url": "https://*.mihoyo.com/*" }]
|
||||
}
|
||||
],
|
||||
"platforms": ["windows", "macOS"]
|
||||
},
|
||||
"Mys": {
|
||||
"identifier": "Mys",
|
||||
"description": "Capability for the mys client window",
|
||||
"remote": { "urls": ["https://*.mihoyo.com/*", "https://*.miyoushe.com/*"] },
|
||||
"local": true,
|
||||
"windows": ["mhy_client"],
|
||||
"permissions": ["event:allow-emit"],
|
||||
"permissions": [
|
||||
"dialog:allow-message",
|
||||
"dialog:default",
|
||||
"event:allow-emit",
|
||||
"path:allow-resolve-directory",
|
||||
"path:default",
|
||||
{ "identifier": "fs:allow-exists", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-mkdir", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-read-dir", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-read-text-file", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-remove", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-write-file", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-write-text-file", "allow": [{ "path": "**" }] }
|
||||
],
|
||||
"platforms": ["windows", "macOS"]
|
||||
},
|
||||
"SubWindow": {
|
||||
@@ -48,10 +91,7 @@
|
||||
"app:default",
|
||||
"event:allow-listen",
|
||||
"event:default",
|
||||
"fs:allow-remove",
|
||||
"fs:default",
|
||||
"fs:scope-cache-recursive",
|
||||
"fs:scope-document-recursive",
|
||||
"http:allow-fetch",
|
||||
"log:allow-log",
|
||||
"log:default",
|
||||
@@ -66,10 +106,22 @@
|
||||
"sql:allow-load",
|
||||
"sql:allow-execute",
|
||||
"sql:default",
|
||||
"webview:allow-create-webview-window",
|
||||
"webview:default",
|
||||
"window:allow-close",
|
||||
"window:allow-destroy",
|
||||
"window:default",
|
||||
"window:allow-is-minimized",
|
||||
"window:allow-set-title",
|
||||
"window:allow-set-focus",
|
||||
"window:allow-show",
|
||||
{ "identifier": "fs:allow-exists", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-mkdir", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-read-dir", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-read-text-file", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-remove", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-write-file", "allow": [{ "path": "**" }] },
|
||||
{ "identifier": "fs:allow-write-text-file", "allow": [{ "path": "**" }] },
|
||||
{
|
||||
"identifier": "http:default",
|
||||
"allow": [
|
||||
|
||||
@@ -43,16 +43,11 @@ fn create_utils_menu(app: AppHandle) -> Submenu<Wry> {
|
||||
}
|
||||
|
||||
// 创建米游社客户端菜单
|
||||
pub fn create_mhy_menu(func: String, app: AppHandle) -> Menu<Wry> {
|
||||
pub fn create_mhy_menu(app: AppHandle) -> Menu<Wry> {
|
||||
let top_menu = MenuItemBuilder::with_id("top", "置顶").build(&app).unwrap();
|
||||
let cancel_top_menu = MenuItemBuilder::with_id("cancel_top", "取消置顶").build(&app).unwrap();
|
||||
let sign_in_menu = MenuItemBuilder::with_id("sign_in", "用户登录").build(&app).unwrap();
|
||||
let open_post_menu = MenuItemBuilder::with_id("open_post", "打开帖子").build(&app).unwrap();
|
||||
let utils_menu = create_utils_menu(app.clone());
|
||||
// 如果是登录
|
||||
if func == "config_sign_in" {
|
||||
return MenuBuilder::new(&app).item(&sign_in_menu).build().expect("failed to create mhy_menu");
|
||||
}
|
||||
return MenuBuilder::new(&app)
|
||||
.item(&top_menu)
|
||||
.item(&cancel_top_menu)
|
||||
@@ -67,7 +62,6 @@ pub fn handle_menu_event(window: &Window, event: MenuEvent) {
|
||||
match event.id.as_ref() {
|
||||
"top" => handle_menu_top(window),
|
||||
"cancel_top" => handle_menu_cancel_top(window),
|
||||
"sign_in" => handle_menu_sign_in(window),
|
||||
"open_post" => handle_menu_open_post(window),
|
||||
"retry" => handle_menu_retry(window),
|
||||
"mock_touch" => handle_menu_mock_touch(window),
|
||||
@@ -93,29 +87,6 @@ fn handle_menu_cancel_top(app_handle: &Window) {
|
||||
}
|
||||
}
|
||||
|
||||
// 处理用户登录菜单
|
||||
fn handle_menu_sign_in(app_handle: &Window) {
|
||||
let window = app_handle.get_webview_window("mhy_client");
|
||||
let execute_js = r#"
|
||||
javascript:(async function(){
|
||||
// 首先检测是不是 user.mihoyo.com
|
||||
const url = new URL(window.location.href);
|
||||
if(url.hostname !== "user.mihoyo.com"){
|
||||
alert("当前页面不是米游社登录页面");
|
||||
return;
|
||||
}
|
||||
const ck = document.cookie;
|
||||
const arg = {
|
||||
method: 'teyvat_sign_in',
|
||||
payload: ck,
|
||||
}
|
||||
await window.__TAURI__.event.emit('post_mhy_client',JSON.stringify(arg));
|
||||
})()"#;
|
||||
if window.is_some() {
|
||||
window.unwrap().eval(&execute_js).ok().unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
// 处理打开帖子菜单
|
||||
fn handle_menu_open_post(app_handle: &Window) {
|
||||
let window = app_handle.get_webview_window("mhy_client");
|
||||
|
||||
@@ -3,42 +3,37 @@
|
||||
//! @since Beta v0.5.0
|
||||
|
||||
mod menu;
|
||||
use tauri::async_runtime::block_on;
|
||||
use tauri::{AppHandle, Manager, WebviewWindowBuilder, WindowEvent};
|
||||
use tauri::{AppHandle, Manager, WebviewWindowBuilder};
|
||||
use tauri_utils::config::WebviewUrl;
|
||||
|
||||
#[tauri::command]
|
||||
pub async fn create_mhy_client(handle: AppHandle, func: String, url: String) {
|
||||
let mut mhy_window_config = handle.config().app.windows.get(1).unwrap().clone();
|
||||
mhy_window_config.visible = true;
|
||||
let mut option = handle.config().app.windows.get(1).unwrap().clone();
|
||||
let url_parse;
|
||||
if url != "" {
|
||||
mhy_window_config.url = WebviewUrl::External(url.parse().unwrap());
|
||||
url_parse = WebviewUrl::External(url.parse().unwrap());
|
||||
} else {
|
||||
mhy_window_config.url = menu::get_mhy_client_url(func.clone());
|
||||
url_parse = menu::get_mhy_client_url(func.clone());
|
||||
}
|
||||
if func == "birthday"
|
||||
|| func == "web_act"
|
||||
|| url.starts_with("https://webstatic.mihoyo.com/ys/event/e20220303-birthday/index.html")
|
||||
{
|
||||
mhy_window_config.width = 1280.0;
|
||||
mhy_window_config.height = 720.0;
|
||||
option.width = 1280.0;
|
||||
option.height = 720.0;
|
||||
}
|
||||
let window_get = handle.get_webview_window("mhy_client");
|
||||
if window_get.is_some() {
|
||||
let mhy_client = window_get.unwrap();
|
||||
mhy_client.on_window_event(move |e| {
|
||||
if let WindowEvent::Destroyed = e {
|
||||
let future = create_mhy_client(handle.clone(), func.clone(), url.clone());
|
||||
block_on(future);
|
||||
}
|
||||
});
|
||||
mhy_client.close().unwrap();
|
||||
let window_find = handle.get_webview_window("mhy_client");
|
||||
if window_find.is_some() {
|
||||
window_find.unwrap().destroy().unwrap();
|
||||
return;
|
||||
}
|
||||
WebviewWindowBuilder::from_config(&handle, &mhy_window_config)
|
||||
.expect("failed to create mhy_client")
|
||||
.menu(menu::create_mhy_menu(func.clone(), handle.clone()))
|
||||
WebviewWindowBuilder::new(&handle, "mhy_client", url_parse)
|
||||
.inner_size(option.width, option.height)
|
||||
.title(option.title)
|
||||
.center()
|
||||
.user_agent(option.user_agent.unwrap().as_str())
|
||||
.menu(menu::create_mhy_menu(handle.clone()))
|
||||
.on_menu_event(move |app, event| menu::handle_menu_event(app, event))
|
||||
.build()
|
||||
.expect("failed to add menu")
|
||||
.on_menu_event(move |app, event| menu::handle_menu_event(app, event));
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
@@ -38,8 +38,7 @@ pub async fn create_window(
|
||||
) {
|
||||
let window_find = app_handle.get_webview_window(&label);
|
||||
if window_find.is_some() {
|
||||
let window = window_find.unwrap();
|
||||
window.destroy().unwrap();
|
||||
window_find.unwrap().destroy().unwrap();
|
||||
return;
|
||||
}
|
||||
let url_parse = WebviewUrl::App(url.parse().unwrap());
|
||||
@@ -55,10 +54,10 @@ pub async fn create_window(
|
||||
|
||||
// 执行 js
|
||||
#[tauri::command]
|
||||
pub async fn execute_js(app_handle: tauri::AppHandle, label: String, js: String) {
|
||||
pub async fn execute_js(app_handle: AppHandle, label: String, js: String) {
|
||||
let window = app_handle.get_webview_window(&label);
|
||||
if window.is_some() {
|
||||
window.unwrap().eval(&js).ok().unwrap();
|
||||
window.unwrap().eval(&js).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
{
|
||||
"productName": "TeyvatGuide",
|
||||
"identifier": "TeyvatGuide",
|
||||
"version": "0.4.9",
|
||||
"build": {
|
||||
"beforeDevCommand": "pnpm vite:dev",
|
||||
@@ -62,13 +63,13 @@
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"capabilities": ["TeyvatGuide", "Mys", "SubWindow"]
|
||||
"capabilities": ["TeyvatGuide", "Mys", "SubWindow", "DevJson"]
|
||||
}
|
||||
},
|
||||
"plugins": {
|
||||
"deep-link": {
|
||||
"desktop": {
|
||||
"schemes": ["teyvatguide", "test"]
|
||||
"schemes": ["teyvatguide"]
|
||||
},
|
||||
"mobile": []
|
||||
}
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { app, event, core, window as TauriWindow } from "@tauri-apps/api";
|
||||
import { app, event, core, webviewWindow } from "@tauri-apps/api";
|
||||
import { UnlistenFn, Event } from "@tauri-apps/api/event";
|
||||
import { mkdir } from "@tauri-apps/plugin-fs";
|
||||
import { storeToRefs } from "pinia";
|
||||
@@ -42,7 +42,7 @@ let themeListener: UnlistenFn;
|
||||
let urlListener: UnlistenFn;
|
||||
|
||||
onBeforeMount(async () => {
|
||||
const win = TauriWindow.getCurrent();
|
||||
const win = webviewWindow.getCurrent();
|
||||
isMain.value = win.label === "TeyvatGuide";
|
||||
if (isMain.value) {
|
||||
const title = "Teyvat Guide v" + (await app.getVersion()) + " Beta";
|
||||
@@ -171,7 +171,7 @@ async function checkUserLoad(): Promise<void> {
|
||||
|
||||
async function getDeepLink(): Promise<UnlistenFn> {
|
||||
return await event.listen("active_deep_link", async (e: Event<unknown>) => {
|
||||
const windowGet = new TauriWindow.WebviewWindow("TeyvatGuide");
|
||||
const windowGet = new webviewWindow.WebviewWindow("TeyvatGuide");
|
||||
if (await windowGet.isMinimized()) {
|
||||
await windowGet.unminimize();
|
||||
}
|
||||
|
||||
@@ -6,8 +6,7 @@
|
||||
</transition>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
// vue
|
||||
import { ref, onMounted } from "vue";
|
||||
import { ref, onMounted, onUnmounted } from "vue";
|
||||
|
||||
const scrollTop = ref(0); // 滚动条距离顶部的距离
|
||||
const canTop = ref(false); // 默认不显示
|
||||
@@ -45,6 +44,11 @@ function handleScrollTop(): void {
|
||||
onMounted(() => {
|
||||
window.addEventListener("scroll", handleScroll);
|
||||
});
|
||||
|
||||
// 销毁监听
|
||||
onUnmounted(() => {
|
||||
window.removeEventListener("scroll", handleScroll);
|
||||
});
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { event, window as TauriWindow } from "@tauri-apps/api";
|
||||
import { event, webviewWindow } from "@tauri-apps/api";
|
||||
import { UnlistenFn, Event } from "@tauri-apps/api/event";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { computed, onMounted, onUnmounted, ref, watch } from "vue";
|
||||
@@ -302,7 +302,7 @@ onMounted(async () => {
|
||||
const theme = e.payload;
|
||||
themeGet.value = theme === "default" ? "default" : "dark";
|
||||
});
|
||||
if (TauriWindow.getCurrent().label === "TeyvatGuide") {
|
||||
if (webviewWindow.getCurrent().label === "TeyvatGuide") {
|
||||
await mhyClient.run();
|
||||
}
|
||||
if (userStore.briefInfo.value && userStore.briefInfo.value.nickname) {
|
||||
|
||||
@@ -10,21 +10,18 @@
|
||||
<template #actions>
|
||||
<v-spacer />
|
||||
<v-btn variant="outlined" @click="scan = true" icon="mdi-qrcode-scan" />
|
||||
<v-btn v-if="false" variant="outlined" @click="toWebLogin" icon="mdi-web" />
|
||||
<v-btn variant="outlined" @click="confirmRefreshUser" icon="mdi-refresh" :loading="loading" />
|
||||
</template>
|
||||
</v-card>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { event, window as windowTauri } from "@tauri-apps/api";
|
||||
import type { UnlistenFn, Event } from "@tauri-apps/api/helpers/event";
|
||||
import type { UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { onMounted, onUnmounted, ref, watch } from "vue";
|
||||
|
||||
import TGSqlite from "../../plugins/Sqlite/index.js";
|
||||
import { useAppStore } from "../../store/modules/app.js";
|
||||
import { useUserStore } from "../../store/modules/user.js";
|
||||
import TGClient from "../../utils/TGClient.js";
|
||||
import TGLogger from "../../utils/TGLogger.js";
|
||||
import { getDeviceFp } from "../../web/request/getDeviceFp.js";
|
||||
import TGRequest from "../../web/request/TGRequest.js";
|
||||
@@ -64,177 +61,6 @@ watch(userStore.briefInfo, (v) => {
|
||||
}
|
||||
});
|
||||
|
||||
async function toWebLogin(): Promise<void> {
|
||||
const confirm = await showConfirm({
|
||||
title: "请在子窗口中完成登录操作",
|
||||
text: "请操作完成后点击子窗口的“用户登录”菜单",
|
||||
});
|
||||
if (!confirm) {
|
||||
showSnackbar({
|
||||
color: "cancel",
|
||||
text: "已取消登录",
|
||||
});
|
||||
return;
|
||||
}
|
||||
await TGClient.open("config_sign_in", "https://user.mihoyo.com");
|
||||
signListener = event.listen("config_user_sign", async (e: Event<unknown>) => {
|
||||
if (typeof e.payload !== "string") {
|
||||
showSnackbar({
|
||||
color: "error",
|
||||
text: "登录失败!",
|
||||
});
|
||||
return;
|
||||
}
|
||||
await getTokenWeb(e.payload);
|
||||
});
|
||||
}
|
||||
|
||||
async function getTokenWeb(cookie: string): Promise<void> {
|
||||
await windowTauri.appWindow.setFocus();
|
||||
emits("loadOuter", { show: true, title: "正在解析 cookie" });
|
||||
const ck = cookie.split(";").reduce(
|
||||
(prev, curr) => {
|
||||
const [key, value] = curr.split("=");
|
||||
prev[key.trim()] = value.trim();
|
||||
return prev;
|
||||
},
|
||||
<Record<string, string>>{},
|
||||
);
|
||||
if (!("login_ticket" in ck) || !("login_uid" in ck)) {
|
||||
emits("loadOuter", { show: false });
|
||||
showSnackbar({
|
||||
text: "未检测到 login_ticket, 请确认是否登录成功!",
|
||||
color: "error",
|
||||
});
|
||||
try {
|
||||
setTimeout(() => {
|
||||
windowTauri.WebviewWindow.getByLabel("mhy_client")?.setFocus();
|
||||
}, 2000);
|
||||
} catch (e) {
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] 无法获取子窗口");
|
||||
await TGClient.open("config_sign_in", "https://user.mihoyo.com/");
|
||||
}
|
||||
return;
|
||||
}
|
||||
emits("loadOuter", { show: true, title: "正在获取 token" });
|
||||
let cookieUser: TGApp.User.Account.Cookie = {
|
||||
account_id: "",
|
||||
ltuid: "",
|
||||
stuid: "",
|
||||
mid: "",
|
||||
cookie_token: "",
|
||||
stoken: "",
|
||||
ltoken: "",
|
||||
};
|
||||
cookieUser.account_id = ck["login_uid"];
|
||||
cookieUser.ltuid = ck["login_uid"];
|
||||
cookieUser.stuid = ck["login_uid"];
|
||||
const tokenRes = await TGRequest.User.byLoginTicket.getTokens(
|
||||
ck["login_ticket"],
|
||||
ck["login_uid"],
|
||||
);
|
||||
if ("retcode" in tokenRes) {
|
||||
emits("loadOuter", { show: false });
|
||||
showSnackbar({
|
||||
text: "获取 token 失败!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] 获取 token 失败");
|
||||
await TGLogger.Error(`[tc-userBadge][getTokenWeb] ${tokenRes.retcode}: ${tokenRes.message}`);
|
||||
return;
|
||||
}
|
||||
tokenRes.map((i) => {
|
||||
if (i.name === "ltoken") return (cookieUser.ltoken = i.token);
|
||||
if (i.name === "stoken") return (cookieUser.stoken = i.token);
|
||||
});
|
||||
if (cookieUser.ltoken === "" || cookieUser.stoken === "") {
|
||||
emits("loadOuter", { show: false });
|
||||
showSnackbar({
|
||||
text: "获取 ltoken 或者 stoken 失败!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] 获取 ltoken 或者 stoken 失败");
|
||||
return;
|
||||
}
|
||||
const ltokenRes = await TGRequest.User.byLToken.verify(cookieUser.ltoken, cookieUser.ltuid);
|
||||
if (typeof ltokenRes !== "string") {
|
||||
showSnackbar({
|
||||
text: "ltoken 验证失败!",
|
||||
color: "error",
|
||||
});
|
||||
} else {
|
||||
cookieUser.mid = ltokenRes;
|
||||
}
|
||||
if (!cookieUser.stoken.startsWith("v2")) {
|
||||
const stokenRes = await TGRequest.User.bySToken.update(cookieUser.stoken, cookieUser.stuid);
|
||||
if ("retcode" in stokenRes) {
|
||||
showSnackbar({
|
||||
text: "stoken 更新失败!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] stoken 更新失败");
|
||||
await TGLogger.Error(
|
||||
`[tc-userBadge][getTokenWeb] ${stokenRes.retcode}: ${stokenRes.message}`,
|
||||
);
|
||||
} else {
|
||||
cookieUser.stoken = stokenRes.token.token;
|
||||
if (cookieUser.mid === "" && stokenRes.user_info.mid !== "")
|
||||
cookieUser.mid = stokenRes.user_info.mid;
|
||||
}
|
||||
}
|
||||
const cookieTokenRes = await TGRequest.User.bySToken.getCookieToken(
|
||||
cookieUser.mid,
|
||||
cookieUser.stoken,
|
||||
);
|
||||
if (typeof cookieTokenRes !== "string") {
|
||||
showSnackbar({
|
||||
text: "cookie_token 获取失败!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] cookie_token 获取失败");
|
||||
await TGLogger.Error(
|
||||
`[tc-userBadge][getTokenWeb] ${cookieTokenRes.retcode}: ${cookieTokenRes.message}`,
|
||||
);
|
||||
} else {
|
||||
cookieUser.cookie_token = cookieTokenRes;
|
||||
}
|
||||
userStore.cookie.value = cookieUser;
|
||||
try {
|
||||
await windowTauri.WebviewWindow.getByLabel("mhy_client")?.close();
|
||||
} catch (e) {
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] 无法获取子窗口");
|
||||
showSnackbar({
|
||||
text: "请手动关闭子窗口!",
|
||||
color: "error",
|
||||
});
|
||||
}
|
||||
signListener();
|
||||
if (Object.values(cookieUser).some((i) => i === "")) {
|
||||
showSnackbar({
|
||||
text: "获取 cookie 失败!部分项为空!",
|
||||
color: "error",
|
||||
});
|
||||
await TGLogger.Error("[tc-userBadge][getTokenWeb] 获取 cookie 失败");
|
||||
return;
|
||||
}
|
||||
await TGSqlite.saveAppData("cookie", JSON.stringify(cookieUser));
|
||||
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() {
|
||||
const ck = userStore.cookie.value;
|
||||
if (ck === undefined || JSON.stringify(ck) === "{}") {
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
<v-chart :option="getPoolData()" autoresize />
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
// todo 解决引用问题
|
||||
import type { EChartsOption } from "echarts";
|
||||
import { PieChart } from "echarts/charts";
|
||||
import {
|
||||
|
||||
@@ -40,7 +40,7 @@
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { event } from "@tauri-apps/api";
|
||||
import { UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { Event, UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { onMounted, onUnmounted, ref } from "vue";
|
||||
|
||||
import { saveImgLocal } from "../../utils/TGShare.js";
|
||||
@@ -59,8 +59,8 @@ const iconDark = ref<string>();
|
||||
const offer = ref<string>();
|
||||
|
||||
onMounted(async () => {
|
||||
themeListener = event.listen("readTheme", (e) => {
|
||||
const theme = <string>e.payload;
|
||||
themeListener = event.listen("readTheme", (e: Event<string>) => {
|
||||
const theme = e.payload;
|
||||
if (theme === "dark") {
|
||||
icon.value = iconLight.value;
|
||||
} else {
|
||||
|
||||
@@ -119,7 +119,7 @@ async function toWiki(): Promise<void> {
|
||||
return;
|
||||
}
|
||||
const url = Mys.Api.Obc.replace("{contentId}", props.item.contentId.toString());
|
||||
createTGWindow(
|
||||
await createTGWindow(
|
||||
url,
|
||||
"Sub_window",
|
||||
`Content_${props.item.contentId} ${props.item.name}`,
|
||||
|
||||
@@ -372,7 +372,7 @@ async function handleExportBtn(): Promise<void> {
|
||||
extensions: ["json"],
|
||||
},
|
||||
],
|
||||
defaultPath: `${await path.downloadDir()}${path.sep}UIGF${uidCur.value}.json`,
|
||||
defaultPath: `${await path.downloadDir()}${path.sep()}UIGF${uidCur.value}.json`,
|
||||
});
|
||||
if (!file) {
|
||||
showSnackbar({
|
||||
|
||||
@@ -404,7 +404,7 @@ async function exportJson(): Promise<void> {
|
||||
extensions: ["json"],
|
||||
},
|
||||
],
|
||||
defaultPath: `${await path.downloadDir()}${path.sep}${fileName}.json`,
|
||||
defaultPath: `${await path.downloadDir()}${path.sep()}${fileName}.json`,
|
||||
});
|
||||
if (isSave === null) {
|
||||
showSnackbar({
|
||||
|
||||
@@ -32,7 +32,7 @@ async function getVideoUrl(cid: number, bvid: string): Promise<TGApp.Plugins.Bil
|
||||
const resp = await TGHttp<TGApp.Plugins.Bili.Video.UrlResponse>(url, {
|
||||
method: "GET",
|
||||
query: params,
|
||||
referrer: "https://www.bilibili.com/",
|
||||
headers: { referer: "https://www.bilibili.com/" },
|
||||
});
|
||||
return resp.data;
|
||||
}
|
||||
|
||||
@@ -20,6 +20,7 @@ async function uploadData(
|
||||
return await TGHttp<TGApp.Plugins.Hutao.Abyss.UploadResponse>(url, {
|
||||
method: "POST",
|
||||
body: JSON.stringify(data),
|
||||
headers: { "Content-Type": "application/json" },
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
27
src/types/BBS/Response.d.ts
vendored
27
src/types/BBS/Response.d.ts
vendored
@@ -41,33 +41,6 @@ declare namespace TGApp.BBS.Response {
|
||||
data: any;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取 ltoken 跟 stoken 的响应数据返回
|
||||
* @interface getTokensRes
|
||||
* @since Alpha v0.1.5
|
||||
* @property {string} name - token 名称
|
||||
* @property {string} token - token 值
|
||||
* @return getTokensRes
|
||||
*/
|
||||
interface getTokensRes {
|
||||
name: string;
|
||||
token: string;
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 获取 ltoken 跟 stoken 的响应数据
|
||||
* @interface getTokens
|
||||
* @since Alpha v0.1.5
|
||||
* @extends BaseWithData
|
||||
* @property {getTokensRes[]} data.list - token 列表
|
||||
* @return getTokens
|
||||
*/
|
||||
interface getTokens extends BaseWithData {
|
||||
data: {
|
||||
list: getTokensRes[];
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* @description 根据 stoken 获取 ltoken 的响应数据
|
||||
* @interface getLTokenBySToken
|
||||
|
||||
@@ -4,10 +4,9 @@
|
||||
* @since Beta v0.5.0
|
||||
*/
|
||||
|
||||
import { event, core } from "@tauri-apps/api";
|
||||
import { event, core, webviewWindow } from "@tauri-apps/api";
|
||||
import type { Event } from "@tauri-apps/api/event";
|
||||
import type { UnlistenFn } from "@tauri-apps/api/event";
|
||||
import { Window } from "@tauri-apps/api/window";
|
||||
|
||||
import showSnackbar from "../components/func/snackbar.js";
|
||||
import TGSqlite from "../plugins/Sqlite/index.js";
|
||||
@@ -42,14 +41,6 @@ class TGClient {
|
||||
*/
|
||||
private listener: UnlistenFn | undefined;
|
||||
|
||||
/**
|
||||
* @private 窗口实例
|
||||
* @since Beta v0.5.0
|
||||
* @type {Window}
|
||||
* @memberof TGClient
|
||||
*/
|
||||
private window: Window | null;
|
||||
|
||||
/**
|
||||
* @private 模拟路由
|
||||
* @since Beta v0.3.4
|
||||
@@ -65,11 +56,6 @@ class TGClient {
|
||||
* @memberof TGClient
|
||||
*/
|
||||
constructor() {
|
||||
try {
|
||||
this.window = Window.getByLabel("mhy_client");
|
||||
} catch (error) {
|
||||
this.window = null;
|
||||
}
|
||||
this.route = [];
|
||||
this.listener = undefined;
|
||||
}
|
||||
@@ -285,7 +271,7 @@ class TGClient {
|
||||
await TGLogger.Info(`[TGClient][handleCustomCallback] ${JSON.stringify(arg)}`);
|
||||
switch (arg.method) {
|
||||
case "teyvat_open":
|
||||
createPost(<string>arg.payload);
|
||||
await createPost(<string>arg.payload);
|
||||
break;
|
||||
case "teyvat_remove":
|
||||
await this.hideOverlay();
|
||||
@@ -441,33 +427,6 @@ class TGClient {
|
||||
await core.invoke("execute_js", { label: "mhy_client", js: executeJS });
|
||||
}
|
||||
|
||||
/**
|
||||
* @func loadSignIn
|
||||
* @since Beta v0.5.0
|
||||
* @desc 自动检测登录ck
|
||||
* @returns {Promise<void>}
|
||||
*/
|
||||
async loadSignIn(): Promise<void> {
|
||||
const executeJS = `javascript:(async function() {
|
||||
let isLogin = false;
|
||||
while(!isLogin) {
|
||||
var ck = document.cookie;
|
||||
if(ck.includes("login_ticket")) {
|
||||
const arg = {
|
||||
method: 'teyvat_sign_in',
|
||||
payload: ck,
|
||||
}
|
||||
await window.__TAURI__.event.emit('post_mhy_client',JSON.stringify(arg));
|
||||
isLogin = true;
|
||||
} else {
|
||||
// 等待 500 ms
|
||||
await new Promise((resolve) => setTimeout(resolve, 500));
|
||||
}
|
||||
}
|
||||
})();`;
|
||||
await core.invoke("execute_js", { label: "mhy_client", js: executeJS });
|
||||
}
|
||||
|
||||
/**
|
||||
* @func nullCallback
|
||||
* @since Beta v0.3.9
|
||||
@@ -491,14 +450,12 @@ class TGClient {
|
||||
if (url === undefined) url = this.getUrl(func);
|
||||
this.route = [url];
|
||||
await TGLogger.Info(`[TGClient][open][${func}] ${url}`);
|
||||
await core.invoke<InvokeArg>("create_mhy_client", { func, url });
|
||||
this.window = Window.getByLabel("mhy_client");
|
||||
await this.window?.show();
|
||||
await this.window?.setFocus();
|
||||
await this.loadJSBridge();
|
||||
if (func === "config_sign_in") {
|
||||
await this.loadSignIn();
|
||||
const windowFind = webviewWindow.WebviewWindow.getByLabel("mhy_client");
|
||||
if (windowFind !== null) {
|
||||
await windowFind.destroy();
|
||||
}
|
||||
await core.invoke<InvokeArg>("create_mhy_client", { func, url });
|
||||
await this.loadJSBridge();
|
||||
}
|
||||
|
||||
/* JSBridge 回调处理 */
|
||||
@@ -512,7 +469,7 @@ class TGClient {
|
||||
async closePage(arg: TGApp.Plugins.JSBridge.NullArg): Promise<void> {
|
||||
this.route.pop();
|
||||
if (this.route.length === 0) {
|
||||
await this.window?.close();
|
||||
await webviewWindow.WebviewWindow.getByLabel("mhy_client")?.destroy();
|
||||
return;
|
||||
}
|
||||
const url = this.route[this.route.length - 1];
|
||||
@@ -769,7 +726,7 @@ class TGClient {
|
||||
arg: TGApp.Plugins.JSBridge.Arg<TGApp.Plugins.JSBridge.OpenApplicationPayload>,
|
||||
): Promise<void> {
|
||||
console.log(`[openApplication] ${JSON.stringify(arg.payload)}`);
|
||||
const appWindow = Window.getByLabel("TeyvatGuide");
|
||||
const appWindow = webviewWindow.WebviewWindow.getByLabel("TeyvatGuide");
|
||||
await appWindow?.setFocus();
|
||||
showSnackbar({
|
||||
text: `不支持的操作:OpenApplication(${JSON.stringify(arg.payload)})`,
|
||||
@@ -780,7 +737,10 @@ class TGClient {
|
||||
resolve();
|
||||
}, 1500);
|
||||
});
|
||||
await this.window?.setFocus();
|
||||
const windowFind = webviewWindow.WebviewWindow.getByLabel("mhy_client");
|
||||
if (windowFind !== null) {
|
||||
await windowFind.setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -795,7 +755,7 @@ class TGClient {
|
||||
): Promise<void> {
|
||||
const res = await parseLink(arg.payload.page, true);
|
||||
if (!res) {
|
||||
const appWindow = Window.getByLabel("TeyvatGuide");
|
||||
const appWindow = webviewWindow.WebviewWindow.getByLabel("TeyvatGuide");
|
||||
await appWindow?.setFocus();
|
||||
showSnackbar({
|
||||
text: `未知链接:${arg.payload.page}`,
|
||||
@@ -807,7 +767,10 @@ class TGClient {
|
||||
resolve();
|
||||
}, 3000);
|
||||
});
|
||||
await this.window?.setFocus();
|
||||
const windowFind = webviewWindow.WebviewWindow.getByLabel("mhy_client");
|
||||
if (windowFind !== null) {
|
||||
await windowFind.setFocus();
|
||||
}
|
||||
return;
|
||||
}
|
||||
if (typeof res !== "string") return;
|
||||
@@ -820,7 +783,11 @@ class TGClient {
|
||||
await this.loadJSBridge();
|
||||
await this.hideSideBar();
|
||||
await this.hideOverlay();
|
||||
await this.window?.setFocus();
|
||||
const windowFind = webviewWindow.WebviewWindow.getByLabel("mhy_client");
|
||||
if (windowFind !== null) {
|
||||
await windowFind.show();
|
||||
await windowFind.setFocus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -910,18 +877,15 @@ class TGClient {
|
||||
var buffer = new Uint8Array(atob(img.split(",")[1]).split("").map(function(item) {
|
||||
return item.charCodeAt(0);
|
||||
}));
|
||||
var _t = window.__TAURI__;
|
||||
var savePath = await _t.path.downloadDir() + Date.now() + ".png";
|
||||
var save = await _t.dialog.save({
|
||||
var _path = window.__TAURI__.path;
|
||||
var saveDefault = await _path.downloadDir() + _path.sep() + Date.now() + ".png";
|
||||
var savePath = await window.__TAURI_PLUGIN_DIALOG__.save({
|
||||
title: "保存图片",
|
||||
filters: [{ name: "图片", extensions: ["png"] }],
|
||||
defaultPath: savePath
|
||||
defaultPath: saveDefault,
|
||||
});
|
||||
if (save) {
|
||||
await _t.fs.writeBinaryFile({
|
||||
contents: buffer,
|
||||
path: save
|
||||
});
|
||||
if (savePath !== null) {
|
||||
await window.__TAURI_PLUGIN_FS__.writeFile(savePath, buffer);
|
||||
alert("保存成功");
|
||||
}
|
||||
mhyWebBridge("${arg.callback}", {});
|
||||
|
||||
@@ -149,5 +149,5 @@ export async function backupUigfData(
|
||||
gachaList: TGApp.Sqlite.GachaRecords.SingleTable[],
|
||||
): Promise<void> {
|
||||
if (!(await exists(dirPath))) await mkdir(dirPath, { recursive: true });
|
||||
await exportUigfData(uid, gachaList, `${dirPath}${path.sep}UIGF_${uid}.json`);
|
||||
await exportUigfData(uid, gachaList, `${dirPath}${path.sep()}UIGF_${uid}.json`);
|
||||
}
|
||||
|
||||
@@ -27,18 +27,18 @@ export async function backUpUserData(dir: string): Promise<void> {
|
||||
await mkdir(dir, { recursive: true });
|
||||
}
|
||||
const dataAchi = await TSUserAchi.getUIAF();
|
||||
await writeTextFile(`${dir}${path.sep}UIAF.json`, JSON.stringify(dataAchi));
|
||||
await writeTextFile(`${dir}${path.sep()}UIAF.json`, JSON.stringify(dataAchi));
|
||||
// 备份 ck
|
||||
const dataCK = await TGSqlite.getCookie();
|
||||
await writeTextFile(`${dir}${path.sep}cookie.json`, JSON.stringify(dataCK));
|
||||
await writeTextFile(`${dir}${path.sep()}cookie.json`, JSON.stringify(dataCK));
|
||||
// 备份深渊数据
|
||||
const dataAbyss = await TGSqlite.getAbyss();
|
||||
await writeTextFile(`${dir}${path.sep}abyss.json`, JSON.stringify(dataAbyss));
|
||||
await writeTextFile(`${dir}${path.sep()}abyss.json`, JSON.stringify(dataAbyss));
|
||||
// 备份祈愿数据
|
||||
const uidList = await TSUserGacha.getUidList();
|
||||
for (const uid of uidList) {
|
||||
const dataGacha = await TSUserGacha.getGachaRecords(uid);
|
||||
const savePath = `${dir}${path.sep}UIGF_${uid}.json`;
|
||||
const savePath = `${dir}${path.sep()}UIGF_${uid}.json`;
|
||||
await exportUigfData(uid, dataGacha, savePath);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { appWindow } from "@tauri-apps/api/window";
|
||||
import { webviewWindow } from "@tauri-apps/api";
|
||||
import { ref, onMounted, reactive } from "vue";
|
||||
import JsonViewer from "vue-json-viewer";
|
||||
import { useRoute } from "vue-router";
|
||||
@@ -33,7 +33,7 @@ let jsonList = reactive({});
|
||||
let jsonContent = reactive({});
|
||||
|
||||
onMounted(async () => {
|
||||
await appWindow.show();
|
||||
await webviewWindow.getCurrent().show();
|
||||
// 检查数据
|
||||
if (!annoId) {
|
||||
loadingEmpty.value = true;
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
</div>
|
||||
</template>
|
||||
<script lang="ts" setup>
|
||||
import { appWindow } from "@tauri-apps/api/window";
|
||||
import { webviewWindow } from "@tauri-apps/api";
|
||||
import { onMounted, reactive, ref } from "vue";
|
||||
import JsonViewer from "vue-json-viewer";
|
||||
import { useRoute } from "vue-router";
|
||||
@@ -30,7 +30,7 @@ let parseData = reactive<TGApp.Plugins.Mys.SctPost.Base[]>([]);
|
||||
const isEmpty = ref<boolean>(false);
|
||||
|
||||
onMounted(async () => {
|
||||
await appWindow.show();
|
||||
await webviewWindow.getCurrent().show();
|
||||
if (!postId) {
|
||||
loadingEmpty.value = true;
|
||||
loadingTitle.value = "错误的 POST ID!";
|
||||
|
||||
@@ -160,7 +160,7 @@ onMounted(async () => {
|
||||
const isDev = useAppStore().devMode ?? false;
|
||||
if (isDev) {
|
||||
await TGLogger.Info(`[t-post][${postId}][onMounted] 打开 JSON 窗口`);
|
||||
createPostJson(postId);
|
||||
await createPostJson(postId);
|
||||
}
|
||||
await nextTick(() => {
|
||||
shareTimeTimer.value = setInterval(() => {
|
||||
@@ -253,10 +253,10 @@ function parseContent(content: string): string {
|
||||
return JSON.stringify(result);
|
||||
}
|
||||
|
||||
function createPostJson(postId: number): void {
|
||||
async function createPostJson(postId: number): Promise<void> {
|
||||
const jsonPath = `/post_detail_json/${postId}`;
|
||||
const jsonTitle = `Post_${postId}_JSON`;
|
||||
createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false);
|
||||
await createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false);
|
||||
}
|
||||
|
||||
async function toPost(): Promise<void> {
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* @file web/request/TGRequest.ts
|
||||
* @description 应用用到的请求函数
|
||||
* @since Beta v0.4.5
|
||||
* @since Beta v0.5.0
|
||||
*/
|
||||
|
||||
import { genAuthkey, genAuthkey2 } from "./genAuthkey.js";
|
||||
@@ -19,7 +19,6 @@ import { getGameRoleListByLToken } from "./getRoleList.js";
|
||||
import { getStokenByGameToken, getTokenBySToken } from "./getStoken.js";
|
||||
import getSyncAvatarDetail from "./getSyncAvatarDetail.js";
|
||||
import getSyncAvatarListAll from "./getSyncAvatarListAll.js";
|
||||
import { getTokensByLoginTicket } from "./getTokens.js";
|
||||
import { getUserCollect } from "./getUserCollect.js";
|
||||
import { getUserInfoByCookie } from "./getUserInfo.js";
|
||||
import { verifyLToken } from "./verifyLToken.js";
|
||||
@@ -38,9 +37,6 @@ const TGRequest = {
|
||||
getCollect: getUserCollect,
|
||||
getGachaLog,
|
||||
getRecord: getGameRecord,
|
||||
byLoginTicket: {
|
||||
getTokens: getTokensByLoginTicket,
|
||||
},
|
||||
byCookie: {
|
||||
getAbyss,
|
||||
getAccounts: getGameAccountsByCookie,
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
/**
|
||||
* @file web/request/getTokens.ts
|
||||
* @description 获取游戏 Token
|
||||
* @since Beta v0.5.0
|
||||
*/
|
||||
|
||||
import TGHttp from "../../utils/TGHttp.js";
|
||||
import TGApi from "../api/TGApi.js";
|
||||
import TGUtils from "../utils/TGUtils.js";
|
||||
|
||||
/**
|
||||
* @description 根据 login_ticket 获取游戏 Token,包括 sToken 和 lToken
|
||||
* @since Beta v0.5.0
|
||||
* @param {string} ticket 登录票证
|
||||
* @param {string} uid 登录用户 uid
|
||||
* @returns {Promise<TGApp.BBS.Response.getTokensRes[] | TGApp.BBS.Response.Base>}
|
||||
*/
|
||||
export async function getTokensByLoginTicket(
|
||||
ticket: string,
|
||||
uid: string,
|
||||
): Promise<TGApp.BBS.Response.getTokensRes[] | TGApp.BBS.Response.Base> {
|
||||
const cookie = { login_ticket: ticket, login_uid: uid };
|
||||
const url = TGApi.GameTokens.getTokens;
|
||||
const params = { login_ticket: ticket, token_types: "3", uid };
|
||||
const header = TGUtils.User.getHeader(cookie, "GET", params, "common");
|
||||
const resp = await TGHttp<TGApp.BBS.Response.getTokens | TGApp.BBS.Response.Base>(url, {
|
||||
method: "GET",
|
||||
headers: header,
|
||||
query: params,
|
||||
});
|
||||
console.log(resp);
|
||||
if (resp.retcode !== 0) return <TGApp.BBS.Response.Base>resp;
|
||||
return resp.data.list;
|
||||
}
|
||||
Reference in New Issue
Block a user