#!/usr/bin/env node /** * 测试培训包完整用户流程: * 1. 凭据检测(从包目录 .env.local 或页面填写) * 2. 订阅状态检查 * 3. 扫码登录流程 * 4. 工作台与监听启动 */ const http = require('http'); const { spawn } = require('child_process'); const path = require('path'); const TRAINING_DIR = 'D:/qiwei-training'; const DASHBOARD_PORT = 4320; const FLOW_PORT = 4310; function request(port, path, method = 'GET', body = null) { return new Promise((resolve, reject) => { const options = { hostname: '127.0.0.1', port, path, method, headers: body ? { 'Content-Type': 'application/json' } : {} }; const req = http.request(options, res => { let data = ''; res.on('data', chunk => data += chunk); res.on('end', () => { try { resolve({ status: res.statusCode, data: JSON.parse(data) }); } catch { resolve({ status: res.statusCode, data: data }); } }); }); req.on('error', reject); if (body) req.write(JSON.stringify(body)); req.end(); }); } async function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } async function main() { console.log('=== 企微培训包用户流程测试 ===\n'); // 步骤 1:启动工作台 console.log('步骤 1:启动培训包工作台...'); const workbench = spawn( path.join(TRAINING_DIR, 'qiwei-workbench.exe'), ['--no-open'], { cwd: TRAINING_DIR, stdio: 'pipe', detached: false } ); workbench.stdout.on('data', data => { process.stdout.write(`[工作台] ${data}`); }); workbench.stderr.on('data', data => { process.stderr.write(`[工作台错误] ${data}`); }); await sleep(5000); // 步骤 2:检查状态接口 console.log('\n步骤 2:检查整体状态...'); try { const status = await request(DASHBOARD_PORT, '/api/status'); console.log('✓ 状态接口响应:', { authConfigured: status.data.summary?.authConfigured, subscribed: status.data.summary?.subscribed, online: status.data.summary?.online }); // 步骤 3:Token 检测 if (!status.data.summary?.authConfigured) { console.log('\n✗ Token 未检测到,需要用户填写'); console.log(' 提示:在页面上粘贴 Fmode r: 会话凭据或 sk- 密钥,或写入 .env.local'); } else { console.log('\n✓ 凭据已检测到'); } // 步骤 4:订阅状态 if (!status.data.summary?.subscribed) { console.log('\n✗ 没有可用席位,需要开通服务'); console.log(' 提示:新账号会先检查 7 天试用;没有试用时访问 http://127.0.0.1:4310 开通席位'); } else { const sub = status.data.data?.subscription?.data; console.log(`\n✓ ${sub?.trialActive ? '7 天试用有效' : '服务有效'}:`, { seats: sub?.seats, usedSeats: sub?.usedSeats, expireAt: sub?.expireAt?.slice(0, 10) }); } // 步骤 5:登录状态 if (!status.data.summary?.online) { console.log('\n需要企微扫码登录'); console.log(' 访问工作台会自动引导到登录流程'); } else { console.log('\n✓ 企微账号已在线'); } } catch (error) { console.error('✗ 状态接口失败:', error.message); } // 步骤 6:测试登录流程页(如果已开通订阅) console.log('\n步骤 6:测试登录流程页...'); try { const flowPage = await request(FLOW_PORT, '/'); if (flowPage.status === 200) { console.log('✓ 登录流程页可访问 (http://127.0.0.1:4310)'); } else { console.log(' 登录流程页状态:', flowPage.status); } } catch (error) { console.log(' 登录流程页未启动(订阅未开通时会自动启动)'); } // 步骤 7:检查监听 Runtime console.log('\n步骤 7:检查监听 Runtime...'); const statePath = path.join(TRAINING_DIR, 'outputs', 'runtime', 'qiwei-runtime.json'); try { const fs = require('fs'); const runtimeState = JSON.parse(fs.readFileSync(statePath, 'utf8')); console.log('✓ 监听 Runtime 运行中:', { pid: runtimeState.pid, status: runtimeState.status, mode: runtimeState.mode }); } catch { console.log(' 监听 Runtime 状态文件未找到'); } console.log('\n=== 测试完成 ==='); console.log('\n现场用户操作顺序:'); console.log(' 1. 双击 qiwei-workbench.exe'); console.log(' 2. 浏览器自动打开工作台页面'); console.log(' 3. 如凭据未检测到,粘贴 Fmode r: 会话凭据或 sk- 密钥'); console.log(' 4. 新账号先使用 7 天试用;试用不可用时再开通席位(跳转付费页)'); console.log(' 5. 扫描企微二维码登录'); console.log(' 6. 添加测试白名单,开启监听'); console.log('\n按 Ctrl+C 停止工作台...'); process.on('SIGINT', () => { console.log('\n停止工作台...'); workbench.kill(); process.exit(0); }); } main().catch(error => { console.error('测试失败:', error); process.exit(1); });