get-nls-token.mjs 2.1 KB

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