Rosetta Stone B1级别Node.js脚本请求捕获与报错修复求助
解决Rosetta Stone B1课程刷课脚本的请求捕获与错误修复问题
一、捕获B1课程所需的请求
- 切换抓包过滤规则
打开浏览器DevTools的Network面板,勾选Preserve Log,将过滤器切换为Fetch/XHR,同时搜索关键词graphql——B1课程大概率改用GraphQL接口替代了A1-A2时期的graphic/trackingREST请求。 - 定位核心请求
手动完成一个B1课程的小练习,观察Network面板中触发的POST请求:- 寻找包含
mutation关键字的请求(这类是提交进度的核心接口) - 记录请求的URL、请求头(尤其是
Authorization、Cookie)、请求体中的GraphQL查询语句和变量结构
- 寻找包含
- 提取关键参数
重点关注请求体里的clientInfo字段(这是后续修复脚本的关键),以及lessonId、activityId、score等与课程进度相关的参数。
二、修复"Client info is not defined"脚本错误
- 补充缺失的
clientInfo参数
从抓包得到的请求体中复制完整的clientInfo结构,通常格式如下:
将该参数添加到脚本的GraphQL变量中,确保与官方请求的结构完全一致。"clientInfo": { "clientVersion": "3.14.0", "platform": "web", "deviceId": "xxxx-xxxx-xxxx-xxxx" } - 完善脚本的请求格式
将原脚本适配为GraphQL请求模式,示例代码如下:const fetch = require('node-fetch'); const submitB1Progress = async () => { // 从抓包获取的GraphQL mutation语句 const query = ` mutation SubmitActivityProgress($input: SubmitActivityProgressInput!) { submitActivityProgress(input: $input) { success progress } } `; // 从抓包提取的变量,包含必填的clientInfo const variables = { input: { lessonId: "b1_lesson_001", activityId: "b1_activity_001", score: 100, clientInfo: { clientVersion: "3.14.0", platform: "web", deviceId: "xxxx-xxxx-xxxx-xxxx" } } }; try { const res = await fetch('https://api.rosettastone.com/graphql', { method: 'POST', headers: { 'Authorization': 'Bearer YOUR_ACCESS_TOKEN', // 从请求头复制 'Content-Type': 'application/json', 'Cookie': 'YOUR_COOKIE_FROM_BROWSER' // 可选,部分认证依赖Cookie }, body: JSON.stringify({ query, variables }) }); const data = await res.json(); if (data.errors) throw new Error(JSON.stringify(data.errors)); console.log("进度提交成功:", data.data.submitActivityProgress); } catch (err) { console.error("请求失败:", err.message); } }; submitB1Progress(); - 处理空指针异常
在脚本中添加try/catch块,捕获API返回的错误信息,避免因接口报错导致的空指针崩溃。同时检查脚本中是否有未初始化的变量,确保所有依赖参数(如token、clientInfo)都已正确赋值。 - 验证认证信息有效性
确认脚本中的Authorization头(Bearer token)与浏览器抓包的一致,部分token会有有效期,若出现认证失败,重新从浏览器请求中提取最新的token。
内容的提问来源于stack exchange,提问作者Af Fe
相关产品推荐
相关产品推荐

