Files
BYW-VoiceHub/server/api/admin/kugou/status.get.ts
T
Henry_Du 9d3edc2c5e feat(kugou): 凭证支持环境变量兜底(配一次永久用);补 deploy.yml 变量映射
站长问「能不能跳转到酷狗 App 登录」—— 平台不允许(小程序无法启动任意原生 App),
而且即使跳过去,App 内的登录态也只在那台手机上,不会回传给服务端。
所以真正的便利做法是「凭证配一次、长期复用」:

- kugouService.kuGouFetch:cookie/token 增加 KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN
  兜底读环境变量;优先级 显式传入 > 库里绑定 > 环境变量
  (库里绑定的优先,所以之后想临时换一份 Cookie 仍可在后台粘一次覆盖)
- status.get.ts:bound 增加 source: 'db' | 'env' | 'none',界面能说清凭证从哪来
- deploy.yml:KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN 三处齐全
  (step env: 映射 + ENV_PAYLOAD export + upsert_env_key),并用 ${VAR:-} 兜底 ——
  少任何一处都会像上次那样 unbound variable 直接把部署打挂

已用脚本校验:payload 占位符/参数 23/23 对应、远端脚本 30 个变量都有来源、
两个新变量三处齐全。
2026-09-30 19:16:55 +08:00

57 lines
2.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { db } from '~/drizzle/db'
import { systemSettings } from '~/drizzle/schema'
import { kuGouFetch } from '~~/server/services/kugouService'
export default defineEventHandler(async (event) => {
const user = event.context.user
if (!user) throw createError({ statusCode: 401, message: '未登录' })
if (!['ADMIN', 'SUPER_ADMIN'].includes(user.role))
throw createError({ statusCode: 403, message: '仅管理员可访问' })
const query = getQuery(event)
const base = String(query.baseUrl || '').trim()
if (base && !/^https?:\/\//i.test(base)) {
throw createError({ statusCode: 400, message: 'baseUrl 需要是合法的 http(s) URL' })
}
const rows = await db.select().from(systemSettings).limit(1)
const settings = rows[0] as any
const usedBase = base || settings?.kugouApiBaseUrl || process.env.KUGOU_API_BASE || ''
let serviceOk: boolean
let serviceMessage: string
let loginStatus: any = null
const envCookie = !!(process.env.KUGOU_ADMIN_COOKIE || '').trim()
const envToken = !!(process.env.KUGOU_ADMIN_TOKEN || '').trim()
try {
const r = await kuGouFetch('/login/status', { timestamp: Date.now() })
loginStatus = r
serviceOk = Number((r as any)?.status ?? 0) === 1 || !!((r as any)?.data?.profile || (r as any)?.data?.account)
serviceMessage = serviceOk ? '服务在线,且账号已绑定登录' : 'sidecar 在线,但酷狗账号未登录'
} catch (e: any) {
serviceOk = false
serviceMessage =
'无法连接 sidecar (' + usedBase + '):' + (e?.message || String(e))
}
return {
ok: true,
service: {
baseUrl: usedBase,
serviceOk,
serviceMessage,
loginStatus,
},
// 环境变量兜底(KUGOU_ADMIN_COOKIE / KUGOU_ADMIN_TOKEN):配一次永久用;库里绑定的优先
bound: {
hasToken: !!settings?.kugouAdminToken || envToken,
hasCookie: !!settings?.kugouAdminCookie || envCookie,
// 让界面能说清"这份凭证从哪来",排错时很关键
source: settings?.kugouAdminCookie || settings?.kugouAdminToken ? 'db' : envCookie || envToken ? 'env' : 'none',
boundAt: settings?.kugouAdminBoundAt || null,
user: settings?.kugouAdminUser || null,
},
}
})