// 客服在线状态验证工具 const WebSocket = require('ws'); const http = require('http'); // 服务器地址 const SERVER_URL = 'ws://localhost:3003'; const API_URL = 'http://localhost:3003/api/managers'; // 用户提供的客服信息 const customerServicePhone = '17780155537'; // 从用户截图获取的手机号 const customerServiceId = '22'; // 刘杨的ID console.log('===================================='); console.log(' 客服在线状态验证工具'); console.log('===================================='); console.log(`测试客服: 手机号 ${customerServicePhone}, ID ${customerServiceId}`); console.log('这将模拟客服登录后的WebSocket连接和认证过程'); // 检查API中的客服状态 function checkManagerOnlineStatus() { return new Promise((resolve, reject) => { http.get(API_URL, (res) => { let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { try { const result = JSON.parse(data); const targetManager = result.data.find(m => m.managerId === customerServiceId || m.phoneNumber === customerServicePhone); if (targetManager) { console.log(`\n📊 客服信息:`); console.log(` 姓名: ${targetManager.name}`); console.log(` 在线状态: ${targetManager.online ? '✅ 在线' : '❌ 离线'}`); console.log(` 部门: ${targetManager.organization}`); console.log(` 职位: ${targetManager.projectName}`); } else { console.log('❌ 未找到目标客服信息'); } resolve(targetManager ? targetManager.online : false); } catch (e) { console.error('❌ 解析API响应失败:', e); reject(e); } }); }).on('error', (error) => { console.error('❌ API请求失败:', error); reject(error); }); }); } // 模拟客服WebSocket连接和认证 function simulateCustomerServiceLogin() { return new Promise((resolve, reject) => { console.log('\n🔄 模拟客服登录后WebSocket连接...'); const ws = new WebSocket(SERVER_URL); ws.on('open', () => { console.log('✅ WebSocket连接已建立'); // 使用与前端一致的认证消息格式 // 注意:JavaScript对象不能有重复键名,需要使用不同的字段来表示认证类型和用户类型 const authMessage = { type: 'auth', // 认证类型必须是'auth' managerId: customerServiceId, userType: 'manager' // 用户类型使用不同的字段名 }; console.log('📱 发送客服认证消息:', JSON.stringify(authMessage)); ws.send(JSON.stringify(authMessage)); }); ws.on('message', (data) => { try { const message = JSON.parse(data.toString()); console.log('📨 收到服务器响应:', message); if (message.type === 'auth_success' && message.payload && message.payload.type === 'manager') { console.log('✅ 客服认证成功!'); resolve(ws); } else { console.error('❌ 认证失败或不是客服类型'); ws.close(); reject(new Error('认证失败')); } } catch (e) { console.error('❌ 解析消息失败:', e); ws.close(); reject(e); } }); ws.on('error', (error) => { console.error('❌ WebSocket错误:', error); reject(error); }); // 超时处理 setTimeout(() => { console.error('❌ 认证超时'); ws.close(); reject(new Error('认证超时')); }, 5000); }); } // 主验证函数 async function runVerification() { try { // 1. 检查初始状态 console.log('\n=== 步骤1: 检查初始在线状态 ==='); const initialStatus = await checkManagerOnlineStatus(); // 2. 模拟客服登录和认证 console.log('\n=== 步骤2: 模拟客服登录和WebSocket认证 ==='); const ws = await simulateCustomerServiceLogin(); // 3. 等待3秒后再次检查在线状态 console.log('\n=== 步骤3: 等待并检查连接后的在线状态 ==='); console.log('等待3秒后检查状态...'); setTimeout(async () => { try { const updatedStatus = await checkManagerOnlineStatus(); console.log('\n===================================='); console.log('验证结果总结:'); console.log('===================================='); if (updatedStatus) { console.log('🎉 成功!客服在线状态现在显示为在线'); console.log('✅ 这意味着WebSocket认证和状态同步正常工作'); console.log('✅ 前端修改后的认证消息格式与后端兼容'); } else { console.log('❌ 失败!客服仍然显示离线'); console.log('请检查以下可能的问题:'); console.log('1. 确认managerId是否正确'); console.log('2. 检查认证消息格式是否正确'); console.log('3. 查看服务器日志是否有错误信息'); } // 保持连接30秒,让用户有时间在前端查看状态 console.log('\n🔄 保持WebSocket连接30秒,请在前端查看客服在线状态...'); setTimeout(() => { console.log('\n✅ 验证完成!'); ws.close(); }, 30000); } catch (error) { console.error('\n❌ 检查在线状态失败:', error); ws.close(); } }, 3000); } catch (error) { console.error('\n❌ 验证过程中出现错误:', error); } } // 运行验证 runVerification();