JavaScript签证预约检查Bot报错:JSON输入意外结束,求解决
问题分析与修复方案
SyntaxError: Unexpected end of JSON input 本质是你调用的预约日期接口返回的内容不是有效JSON格式,可能是空字符串、登录失效后的HTML页面、或者格式损坏的文本。以下是具体排查和修复步骤:
1. 先捕获错误,查看原始响应内容
在你的await response.json()代码块外层加try-catch,先获取原始响应文本,搞清楚服务器到底返回了什么:
// 替换你原来的response.json()代码段 try { const appointmentData = await response.json(); // 正常处理数据逻辑 } catch (error) { // 打印原始响应内容、状态码、响应头 const rawResponse = await response.text(); console.log('[原始响应内容]', rawResponse); console.log('[响应状态码]', response.status()); console.log('[响应头]', response.headers()); }
通过这些信息你就能判断:
- 如果返回HTML,大概率是登录会话失效,需要重新验证登录状态
- 如果是空字符串,可能是服务器无数据返回或请求参数错误
- 如果是格式混乱的文本,可能需要先清理再解析
2. 验证登录状态是否真实有效
很多时候看起来登录成功,但实际上会话cookie没正确保留,或者页面有反爬机制(比如隐形验证码)导致登录不彻底。你可以在登录后加一段校验逻辑:
// 登录操作完成后,检查页面是否有登录成功的标识元素(替换成实际页面的选择器) const hasLoggedIn = await page.$eval('.user-avatar', el => !!el).catch(() => false); if (!hasLoggedIn) { console.log('登录未成功,请检查账号密码或登录流程是否遗漏步骤'); return; } // 也可以直接打印当前页面的cookie,确认会话存在 const cookies = await page.cookies(); console.log('当前会话cookie:', cookies);
3. 模拟真实用户的请求上下文
美领馆的接口通常会校验请求头和会话信息,确保你的请求和浏览器一致:
// 在页面初始化或登录后设置请求头 await page.setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36', 'Referer': 'https://具体的预约页面URL' // 必须是接口所在的页面URL });
另外,避免直接用page.goto或fetch跳接口,尽量模拟用户点击操作触发接口请求,减少被反爬拦截的概率。
4. 兼容非JSON响应的情况
如果确认接口偶尔会返回非JSON内容,可以做兼容处理:
const rawResponse = await response.text(); if (!rawResponse) { console.log('接口返回空内容,跳过'); return; } try { const appointmentData = JSON.parse(rawResponse.trim()); // 处理数据 } catch (error) { console.log('非JSON响应,内容:', rawResponse); // 这里可以添加重试逻辑或重新登录逻辑 }
内容的提问来源于stack exchange,提问作者Guilherme Doherty Marques
相关产品推荐
相关产品推荐

