/** * Zulip用户注册真实环境测试脚本 * * 功能描述: * - 测试Zulip用户注册功能在真实环境下的表现 * - 验证API调用是否正常工作 * - 检查配置是否正确 * * 使用方法: * node test_zulip_registration.js * * @author angjustinl * @version 1.0.0 * @since 2025-01-06 */ const https = require('https'); const { URLSearchParams } = require('url'); // 配置信息 const config = { zulipServerUrl: 'https://zulip.xinghangee.icu', zulipBotEmail: 'angjustinl@mail.angforever.top', zulipBotApiKey: 'lCPWCPfGh7WUHxwN56GF8oYXOpqNfGF8', }; /** * 检查用户是否存在 */ async function checkUserExists(email) { console.log(`🔍 检查用户是否存在: ${email}`); try { const url = `${config.zulipServerUrl}/api/v1/users`; const auth = Buffer.from(`${config.zulipBotEmail}:${config.zulipBotApiKey}`).toString('base64'); const response = await fetch(url, { method: 'GET', headers: { 'Authorization': `Basic ${auth}`, 'Content-Type': 'application/json', }, }); if (!response.ok) { console.log(`❌ 获取用户列表失败: ${response.status} ${response.statusText}`); return false; } const data = await response.json(); console.log(`📊 获取到 ${data.members?.length || 0} 个用户`); if (data.members && Array.isArray(data.members)) { const userExists = data.members.some(user => user.email && user.email.toLowerCase() === email.toLowerCase() ); console.log(`✅ 用户存在性检查完成: ${userExists ? '存在' : '不存在'}`); return userExists; } return false; } catch (error) { console.error(`❌ 检查用户存在性失败:`, error.message); return false; } } /** * 创建测试用户 */ async function createTestUser(email, fullName, password) { console.log(`🚀 开始创建用户: ${email}`); try { const url = `${config.zulipServerUrl}/api/v1/users`; const auth = Buffer.from(`${config.zulipBotEmail}:${config.zulipBotApiKey}`).toString('base64'); const requestBody = new URLSearchParams(); requestBody.append('email', email); requestBody.append('full_name', fullName); if (password) { requestBody.append('password', password); } const response = await fetch(url, { method: 'POST', headers: { 'Authorization': `Basic ${auth}`, 'Content-Type': 'application/x-www-form-urlencoded', }, body: requestBody.toString(), }); const data = await response.json(); if (!response.ok) { console.log(`❌ 用户创建失败: ${response.status} ${response.statusText}`); console.log(`📝 错误信息: ${data.msg || data.message || '未知错误'}`); return { success: false, error: data.msg || data.message }; } console.log(`✅ 用户创建成功! 用户ID: ${data.user_id}`); return { success: true, userId: data.user_id }; } catch (error) { console.error(`❌ 创建用户异常:`, error.message); return { success: false, error: error.message }; } } /** * 测试连接 */ async function testConnection() { console.log('🔗 测试Zulip服务器连接...'); try { const url = `${config.zulipServerUrl}/api/v1/server_settings`; const response = await fetch(url); if (response.ok) { const data = await response.json(); console.log(`✅ 连接成功! 服务器版本: ${data.zulip_version || '未知'}`); return true; } else { console.log(`❌ 连接失败: ${response.status} ${response.statusText}`); return false; } } catch (error) { console.error(`❌ 连接异常:`, error.message); return false; } } /** * 主测试函数 */ async function main() { console.log('🎯 开始Zulip用户注册测试'); console.log('=' * 50); // 1. 测试连接 const connected = await testConnection(); if (!connected) { console.log('❌ 无法连接到Zulip服务器,测试终止'); return; } console.log(''); // 2. 生成测试用户信息 const timestamp = Date.now(); const testEmail = `test_user_${timestamp}@example.com`; const testFullName = `Test User ${timestamp}`; const testPassword = 'test123456'; console.log(`📋 测试用户信息:`); console.log(` 邮箱: ${testEmail}`); console.log(` 姓名: ${testFullName}`); console.log(` 密码: ${testPassword}`); console.log(''); // 3. 检查用户是否已存在 const userExists = await checkUserExists(testEmail); if (userExists) { console.log('⚠️ 用户已存在,跳过创建测试'); return; } console.log(''); // 4. 创建用户 const createResult = await createTestUser(testEmail, testFullName, testPassword); console.log(''); console.log('📊 测试结果:'); if (createResult.success) { console.log('✅ 用户注册功能正常工作'); console.log(` 新用户ID: ${createResult.userId}`); } else { console.log('❌ 用户注册功能存在问题'); console.log(` 错误信息: ${createResult.error}`); } console.log(''); console.log('🎉 测试完成'); } // 运行测试 main().catch(error => { console.error('💥 测试过程中发生未处理的错误:', error); process.exit(1); });