使用Google Apps Script登录带CORS(AWS)的日本站点爬取数据遇阻求助
解决Google Apps Script登录AWS API驱动站点的爬取问题
我明白你现在在尝试用Google Apps Script爬取https://calllog-dev.123robo.com的表格数据,但卡在登录这一步了——尤其是面对CORS和AWS API认证的情况,而且你还在边学边做,确实会有点棘手。咱们一步步来拆解你的问题,给出可行的在线解决方案:
一、先解决请求头与502/403错误的问题
你遇到的403和502错误,主要是因为请求配置有问题:
- 直接访问
https://calllog-dev.123robo.com/#/login得到403,是因为这个带#的路径是前端路由,后端服务器不直接处理这个地址,你应该直接调用登录API接口(也就是你找到的https://dbp3xa4g5g.execute-api.us-west-2.amazonaws.com/dev/users/authenticate)。 - 502错误很大概率是因为你加了非标准的HTTP请求头(比如
authority、path、scheme),这些字段是浏览器请求的元信息,不是HTTP协议规定的请求头,AWS API Gateway会把它们当成非法自定义头,导致网关报错。
你只需要保留后端要求的必要请求头即可,比如Origin、Referer、User-Agent、Accept这些。
二、关于CORS和Cookie的误区
- CORS是浏览器的安全限制,但Google Apps Script的
UrlFetchApp不受浏览器CORS规则约束,所以不用管前端的CORS提示,只需要确保请求符合后端API的要求就行。 - 这个站点采用Token认证而非Cookie会话,你看到的“登录前无Cookie”是正常的——登录成功后不需要依赖Cookie,而是用返回的Token来做后续请求的身份验证。
三、Token的正确使用方式
从你给出的登录响应示例来看,登录接口会返回一个token字段:
{"username":"user@gmail.com","token":"this-is-the-token-value","enableDigits":true}
你需要把这个token放到后续请求表格数据的请求头里,具体的头名称需要看浏览器的实际请求:打开F12开发者工具→Network标签,登录后找到获取表格数据的GET请求,看它的请求头里是怎么带Token的(比如是x-logview-token: <token>,还是Authorization: Bearer <token>)。
四、修正后的Google Apps Script代码
我帮你修正了原代码的语法错误,添加了必要的请求体,并且整合了登录+获取数据的流程:
function loginAndFetchCallLogs() { const userID = 'user@gmail.com'; const userPW = 'password'; // 登录API地址 const loginUrl = 'https://dbp3xa4g5g.execute-api.us-west-2.amazonaws.com/dev/users/authenticate'; // 登录请求配置:移除非标准头,添加用户名密码的JSON请求体 const loginOptions = { method: 'POST', contentType: 'application/json', headers: { 'Origin': 'https://calllog-dev.123robo.com', 'Referer': 'https://calllog-dev.123robo.com/', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36', 'Accept': '*/*' }, payload: JSON.stringify({ username: userID, password: userPW }), muteHttpExceptions: true // 开启后可以查看错误响应,方便调试 }; try { const loginResponse = UrlFetchApp.fetch(loginUrl, loginOptions); const responseCode = loginResponse.getResponseCode(); Logger.log(`登录请求响应码: ${responseCode}`); if (responseCode === 200) { const loginData = JSON.parse(loginResponse.getContentText()); const authToken = loginData.token; Logger.log(`成功获取认证Token: ${authToken}`); // 替换成你在浏览器中找到的表格数据API地址 const dataUrl = 'https://dbp3xa4g5g.execute-api.us-west-2.amazonaws.com/dev/your-table-data-endpoint'; // 表格请求配置:带上认证Token const dataOptions = { method: 'GET', headers: { 'x-logview-token': authToken, // 这里根据浏览器实际请求头调整 // 如果是Bearer认证,改成 'Authorization': `Bearer ${authToken}` 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36' }, muteHttpExceptions: true }; const dataResponse = UrlFetchApp.fetch(dataUrl, dataOptions); Logger.log(`表格数据响应码: ${dataResponse.getResponseCode()}`); Logger.log(`表格数据内容: ${dataResponse.getContentText()}`); } else { Logger.log(`登录失败,响应内容: ${loginResponse.getContentText()}`); } } catch (e) { Logger.log(`请求过程出错: ${e.toString()}`); } }
五、额外调试技巧
- 检查请求体字段:打开浏览器开发者工具,查看登录POST请求的
Payload,确认用户名密码的字段名是不是username和password(有些站点可能用user_id、pass之类的),确保代码里的payload和浏览器一致。 - 确认Token头名称:查看表格数据请求的
Request Headers,找到携带Token的那个头,替换代码里的x-logview-token。 - 查看错误详情:开启
muteHttpExceptions: true后,即使返回5xx/4xx错误,也能拿到后端返回的错误信息,有助于定位问题。
关于“绕过登录”或复用Cookie的问题
这种需要用户认证的站点几乎没法绕过登录,必须通过合法的登录接口获取Token才能访问数据。而复用浏览器Cookie的方式可靠性很低:Cookie是和浏览器会话绑定的,可能有过期时间,而且Google Apps Script请求时带浏览器Cookie可能会因为SameSite属性、跨域等问题失效,远不如直接用Token认证稳定。
内容的提问来源于stack exchange,提问作者sondeyp




