使用Roblox Groups API批量降职遇401未授权问题(Node.js)
问题分析与修复方案
核心错误原因
导致401未授权的关键问题是授权方式完全错误,同时存在异步逻辑和请求格式的问题:
- Roblox Groups API要求通过请求头的
Cookie字段传递.ROBLOSECURITY凭证,你却把它塞进了请求体里,API根本识别不到授权信息。 - Axios的
patch方法参数使用错误,请求头和请求体的位置搞混了。 - 循环里的
wait(1)不是Node.js原生方法,会导致异步逻辑混乱,甚至瞬间发起大量请求触发Roblox限流。
修复后的Axios版本代码
const token = "YOUR .ROBLOSECURITY TOKEN"; const axios = require('axios'); const rolesetID = 36926359; const groupId = 5598688; const targetRoleId = 36926437; const url = `https://groups.roblox.com/v1/groups/${groupId}/roles/${rolesetID}/users?limit=100`; // 封装带授权的axios实例,避免重复写请求头 const authorizedAxios = axios.create({ headers: { Cookie: `.ROBLOSECURITY=${token}` } }); // 用异步函数处理分页与批量操作 async function demoteUsers() { let hasMore = true; let nextPageCursor = null; while (hasMore) { try { // 拼接分页请求地址 const requestUrl = nextPageCursor ? `${url}&cursor=${nextPageCursor}` : url; const response = await authorizedAxios.get(requestUrl); const users = response.data.data; if (users.length === 0) { hasMore = false; break; } // 逐个处理用户,避免并发请求过载 for (const user of users) { if (user.username === 'lickty123') continue; try { const demoteUrl = `https://groups.roblox.com/v1/groups/${groupId}/users/${user.userId}`; await authorizedAxios.patch(demoteUrl, { roleId: targetRoleId }); console.log(`${user.userId} 已被降职`); // 每次请求后加1秒延迟,避免触发Roblox限流 await new Promise(resolve => setTimeout(resolve, 1000)); } catch (err) { console.error(`降职用户 ${user.userId} 失败:`, err.response?.data || err.message); } } // 更新分页游标,处理下一页数据 nextPageCursor = response.data.nextPageCursor; hasMore = !!nextPageCursor; } catch (err) { console.error(`获取用户列表失败:`, err.response?.data || err.message); break; } } } demoteUsers();
更简洁的noblox.js版本(推荐)
既然已经引入了noblox.js,直接用它封装好的方法更省心,无需手动处理API细节:
const noblox = require('noblox.js'); const groupId = 5598688; const sourceRoleId = 36926359; const targetRoleId = 36926437; async function demoteUsers() { // 登录Roblox账号 await noblox.setCookie(".ROBLOSECURITY=YOUR_TOKEN_HERE"); let cursor = null; do { // 获取指定角色的用户列表,自动处理分页 const { data: users, nextPageCursor } = await noblox.getUsersInRole(groupId, sourceRoleId, { limit: 100, cursor }); if (users.length === 0) break; for (const user of users) { if (user.username === 'lickty123') continue; try { await noblox.setRank(groupId, user.userId, targetRoleId); console.log(`${user.userId} 已被降职`); await new Promise(resolve => setTimeout(resolve, 1000)); } catch (err) { console.error(`降职用户 ${user.userId} 失败:`, err.message); } } cursor = nextPageCursor; } while (cursor); } demoteUsers();
额外注意事项
- 确认
.ROBLOSECURITY令牌未过期,且对应账号确实拥有群组管理权限(可手动降职测试验证)。 - Roblox API有严格限流,批量操作必须添加延迟,否则会被临时封禁请求。
- 必须通过
nextPageCursor处理分页,不要用固定循环次数,避免重复处理或遗漏用户。
内容的提问来源于stack exchange,提问作者yeeterboii14 roblox
相关产品推荐
相关产品推荐

