You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

使用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请求头(比如authoritypathscheme),这些字段是浏览器请求的元信息,不是HTTP协议规定的请求头,AWS API Gateway会把它们当成非法自定义头,导致网关报错。

你只需要保留后端要求的必要请求头即可,比如OriginRefererUser-AgentAccept这些。

二、关于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()}`);
  }
}

五、额外调试技巧

  1. 检查请求体字段:打开浏览器开发者工具,查看登录POST请求的Payload,确认用户名密码的字段名是不是usernamepassword(有些站点可能用user_idpass之类的),确保代码里的payload和浏览器一致。
  2. 确认Token头名称:查看表格数据请求的Request Headers,找到携带Token的那个头,替换代码里的x-logview-token
  3. 查看错误详情:开启muteHttpExceptions: true后,即使返回5xx/4xx错误,也能拿到后端返回的错误信息,有助于定位问题。

关于“绕过登录”或复用Cookie的问题

这种需要用户认证的站点几乎没法绕过登录,必须通过合法的登录接口获取Token才能访问数据。而复用浏览器Cookie的方式可靠性很低:Cookie是和浏览器会话绑定的,可能有过期时间,而且Google Apps Script请求时带浏览器Cookie可能会因为SameSite属性、跨域等问题失效,远不如直接用Token认证稳定。

内容的提问来源于stack exchange,提问作者sondeyp

火山引擎 最新活动