/** * 换一个阿里云 NLS(智能语音交互)的 token —— 命令行版。 * * 签名与缓存逻辑在 `nls-token.mjs`(dev server 的 `/nls-token/` 端点用同一份)。 * * 怎么跑(凭据只从环境变量读,脚本里不存任何值): * ALIYUN_NLS_AK=xxx ALIYUN_NLS_SK=yyy node harness/tools/get-nls-token.mjs * # 只想拿 token 本身(给别的命令用):... | tail -1 * * 也可以只跑 `--check` 看当前配置状态(不请求阿里云、不打凭据值)。 * * ⚠️ 凭据值**不要写进任何仓库文件**(用户 2026-09-23 明确要求)。 */ import { NLS_LOCAL_ENV_FILE, createNlsToken, maskCredential, readDotEnvFile, readNlsCredentials, } from './nls-token.mjs'; // 环境变量优先;没有就退回本机凭据文件(vite 的 loadEnv 读的是同一个文件) const credentials = readNlsCredentials({ ...readDotEnvFile(NLS_LOCAL_ENV_FILE), ...process.env }); if (process.argv.includes('--check')) { console.log(`[nls] AK=${credentials.ak ? maskCredential(credentials.ak) : '(未配置)'}`); console.log(`[nls] SK=${credentials.sk ? '(已配置,不显示)' : '(未配置)'}`); console.log(`[nls] AppKey=${credentials.appkey ? maskCredential(credentials.appkey) : '(未配置)'}`); process.exit(credentials.ak && credentials.sk ? 0 : 2); } if (!credentials.ak || !credentials.sk) { console.error('缺凭据。用法:ALIYUN_NLS_AK=xxx ALIYUN_NLS_SK=yyy node harness/tools/get-nls-token.mjs'); process.exit(2); } console.log(`[nls] 请求 CreateToken AK=${maskCredential(credentials.ak)}`); try { const { token, expireAt, requestId } = await createNlsToken(credentials); const expireDate = new Date(expireAt); console.log(`[nls] token 有效期至 ${expireDate.toISOString()}(本地 ${expireDate.toLocaleString('zh-CN')})`); if (requestId) console.log(`[nls] RequestId=${requestId}`); // 最后一行只打 token,方便 `| tail -1` 取用 console.log(token); } catch (error) { console.error('[nls] 换 token 失败:', error instanceof Error ? error.message : error); process.exit(1); }