Files
BYW-VoiceHub/server/api/native-api/qq/check-login.post.ts
T

78 lines
2.1 KiB
TypeScript

import {
checkQqLogin,
getQqCookieDiagnostic,
getQqUserAvatar,
normalizeQqCookie
} from '~~/server/utils/qq_music_sdk'
const getSessionCookie = (session: any) => {
if (typeof session?.cookie === 'string') return session.cookie
if (Array.isArray(session?.cookieList)) return session.cookieList.join('; ')
return ''
}
const normalizeLoginStatus = (data: any) => {
if (data?.isOk) return 'success'
if (data?.refresh) return 'expired'
return 'waiting'
}
export default defineEventHandler(async (event) => {
const body = await readBody(event)
const ptqrtoken = body?.ptqrtoken
const qrsig = String(body?.qrsig || '').trim()
if (!ptqrtoken || !qrsig) {
throw createError({ statusCode: 400, message: '缺少 ptqrtoken 或 qrsig 参数' })
}
try {
const data: any = await checkQqLogin(ptqrtoken, qrsig)
const session = data?.session || null
const cookie = normalizeQqCookie(getSessionCookie(session))
const cookieObject = session?.cookieObject || {}
const uin = cookieObject.qqmusic_uin || session?.uin || session?.loginUin || cookieObject.uin || ''
let avatarUrl = ''
if (data?.isOk && uin) {
try {
const avatar = await getQqUserAvatar({ uin, size: 140 })
avatarUrl = avatar?.avatarUrl || ''
} catch (avatarError) {
console.warn('[qq/check-login] 获取 QQ 头像失败:', avatarError)
}
}
return {
success: true,
data: {
...data,
status: normalizeLoginStatus(data),
cookie: cookie || undefined,
authDiagnostic: getQqCookieDiagnostic(cookie),
user: data?.isOk
? {
userId: uin,
id: uin,
nickname: uin ? `QQ ${uin}` : 'QQ音乐账号',
userName: uin ? `QQ ${uin}` : 'QQ音乐账号',
avatarUrl,
raw: session
}
: undefined,
session: session
? {
...session,
cookie
}
: session
}
}
} catch (error: any) {
throw createError({
statusCode: 502,
message: error?.message || '检查 QQ 登录状态失败'
})
}
})