import { QuarkConfig } from './quark-api'; import { getHeaders, getMparam, apiFetch, makeQuery } from './quark-api'; /** * 认证模块 — Cookie 验证、账号信息获取、QR 登录状态检查。 * 所有方法以 cookie 字符串为参数,不持有驱动状态。 */ // ==================== Validate ==================== /** * Validate the cookie by fetching user info. */ export async function validate(cookie: string): Promise { const MAX_RETRIES = 2; for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) { try { // Use account/info API (same as quark-auto-save project) // Only needs __uid cookie, no mparam (kps/sign/vcode) required const url = 'https://pan.quark.cn/account/info?fr=pc&platform=pc'; const response = await fetch(url, { headers: { ...getHeaders(cookie), 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/3.14.2 Chrome/112.0.5615.165 Electron/24.1.3.8 Safari/537.36 Channel/pckk_other_ch', }, signal: AbortSignal.timeout(15000), }); if (!response.ok) return false; const data = await response.json() as any; if (data?.data?.nickname) return true; } catch (err: any) { if (attempt < MAX_RETRIES) { console.log(`[Quark] validate attempt ${attempt + 1} failed: ${err.message}, retrying...`); await new Promise(r => setTimeout(r, 2000)); continue; } console.log(`[Quark] validate all ${MAX_RETRIES + 1} attempts failed: ${err.message}`); } } return false; } /** Fetch nickname from Quark account info (same API used by quark-auto-save) */ export async function fetchNickname(cookie: string): Promise { try { const url = 'https://pan.quark.cn/account/info?fr=pc&platform=pc'; const response = await fetch(url, { headers: { ...getHeaders(cookie), 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) quark-cloud-drive/3.14.2 Chrome/112.0.5615.165 Electron/24.1.3.8 Safari/537.36 Channel/pckk_other_ch', }, signal: AbortSignal.timeout(15000), }); if (!response.ok) return null; const data = await response.json() as any; return data?.data?.nickname || null; } catch { return null; } }