Node.js跨设备复用funcaptcha的challenge调用getImage()报错解决
问题:保存funcaptcha Challenge到文件后无法调用
getImage()函数 问题原因
- 第一台电脑中,
challenge是funcaptcha.SessionChallenge类的实例对象,自带getImage()方法。 - 直接使用
fs.writeFile(filePath, challenge)保存时,Node.js会把实例对象隐式转换为字符串(或不完整的JSON),丢失了类实例的方法和原型链。 - 第二台电脑读取后得到的只是普通的字符串/JSON对象,不是
SessionChallenge类的实例,因此没有getImage()方法,触发TypeError。
修复方案
步骤1:修正第一台电脑的保存代码
需要将SessionChallenge实例序列化为完整的JSON字符串保存,确保所有必要数据都被存储:
const fun = require("funcaptcha"); const fs = require('fs'); async function saveChallenge() { // 获取token并创建session const token = await fun.getToken({ pkey: "476068BF-9607-4799-B53D-966BE98E2B81", site: "https://roblox-api.arkoselabs.com", }); const session = new fun.Session(token); const challenge = await session.getChallenge(); // 测试方法可用性 await challenge.getImage(); console.log("本地测试图片获取成功"); // 将实例序列化为JSON字符串保存 const filePath = "./challenge.json"; // 替换为你的文件路径 fs.writeFileSync(filePath, JSON.stringify(challenge)); console.log("Challenge已成功保存到文件"); } saveChallenge();
步骤2:修正第二台电脑的读取代码
读取JSON文件后,需要重新构建SessionChallenge类的实例,恢复其方法:
const fun = require("funcaptcha"); const fs = require('fs'); async function loadChallengeAndGetImage() { const filePath = "./challenge.json"; // 替换为你的文件路径 // 读取并解析JSON数据 const challengeData = JSON.parse(fs.readFileSync(filePath, 'utf8')); // 重新创建Session和SessionChallenge实例 const session = new fun.Session(challengeData.session.token); const challenge = new fun.SessionChallenge(session, challengeData); // 调用getImage()方法 const image = await challenge.getImage(); console.log("跨设备图片获取成功"); // 这里可以对image进行后续处理 } loadChallengeAndGetImage();
额外注意点
- 避免使用异步
fs.readFile的回调写法,容易出现变量作用域和异步顺序问题,优先使用同步fs.readFileSync或await fs.promises.readFile。 - 确保两台电脑都安装了相同版本的
funcaptcha库,避免因版本差异导致的实例构造差异。
内容的提问来源于stack exchange,提问作者Quaw
相关产品推荐
相关产品推荐

