如何优化Node.js版Kahoot机器人的缓慢加入问题?
兼顾Kahoot机器人加入成功率与速度的解决方案
你的问题核心是串行执行异步请求导致速度过慢,而完全并行又触发了Kahoot服务器的并发限制,导致部分机器人连接失败。以下是具体的优化方案:
问题根源
- 串行执行(保留async/await):每个机器人的连接请求必须等待上一个完成才会发起,总耗时为「机器人数量 × 1.5秒」,所有机器人都能成功加入,但整体速度极慢。
- 完全并行(移除async/await):所有请求瞬间并发发起,服务器会拦截大量高频请求,脚本虽显示4秒内全部“已加入”,但实际仅6个机器人成功连接。
优化思路:并发控制(分批并行)
通过限制同时发起的连接请求数量,既规避服务器的限流机制,又能大幅提升整体速度:
- 将机器人分成若干批次,每批次同时发起固定数量的连接请求
- 等待当前批次所有请求完成后,再发起下一批次
修改后的代码
bots = []; var joined = 0; const BATCH_SIZE = 5; // 可根据测试调整,建议从5-10开始尝试 // 初始化所有机器人实例 for (let i = 0; i < process.argv[3]; i++) { bots[i] = new Kahoot; } async function runbots() { // 按批次处理机器人连接 for (let batchStart = 0; batchStart < bots.length; batchStart += BATCH_SIZE) { // 截取当前批次的机器人 const currentBatch = bots.slice(batchStart, batchStart + BATCH_SIZE); // 并行发起当前批次的所有连接请求 await Promise.all(currentBatch.map(async (bot, idx) => { const botId = batchStart + idx; const startTime = Date.now(); try { await bot.join(process.argv[2], `${randomname(15)}${botId}`); joined++; const endTime = Date.now(); log(colors.cyan(`Bots Joined: ${joined}/${process.argv[3]} | ${((joined/process.argv[3])*100).toFixed(1)}% | Last Join Time: ${(endTime - startTime)/1000}s`)); } catch (err) { console.log(`Bot ${botId} join failed:`, err); } })); } console.log("All Bots Joined!".green); }; runbots();
关键调整说明
BATCH_SIZE:控制每批同时连接的机器人数量,可根据实际测试结果调整(若仍有失败则减小数值,若速度还能提升则适当增大)Promise.all:实现同一批次内的并行请求,同时等待整批完成后再处理下一批,平衡速度与成功率- 简化计数逻辑:移除了错误时的
joined--,避免计数混乱(失败的机器人不会增加joined) - 改用
try/catch替代then/catch嵌套,代码结构更清晰
额外优化建议
- 给每个连接请求添加随机延迟(如
await new Promise(resolve => setTimeout(resolve, Math.random() * 500))),进一步降低被服务器识别为自动化请求的概率 - 检查
randomname生成的名称是否符合Kahoot的命名规则(如长度、字符限制),避免因名称不合法导致的连接失败
内容的提问来源于stack exchange,提问作者Coll y
相关产品推荐
相关产品推荐

