微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么在这种情况下 UrlFetchApp 无法获取内容? 听起来 CME 可能阻止了 Apps 脚本索引.html代码.gs警告参考

如何解决为什么在这种情况下 UrlFetchApp 无法获取内容? 听起来 CME 可能阻止了 Apps 脚本索引.html代码.gs警告参考

我希望将一些文件保存到我的 Google 云端硬盘。但是 UrlFetchApp.fetch 不会得到任何响应并且会超时。我怎么知道这里出了什么问题?

var url = 'https://www.cmegroup.com/cmeWS/exp/voiProductsViewExport.ctl?media=xls&TradeDate=20210702&assetClassId=2&reportType=F&excluded=CEE,CEU,KCB';
var response = UrlFetchApp.fetch(url);

Logger.log(response.getResponseCode())

var folder = DriveApp.getFolderById(folderID); // omitting folderID in this snippet
var file = folder.createFile(response.getBlob());
file.setName('file.xls');

解决方法

听起来 CME 可能阻止了 Apps 脚本。

我今天看到了几个这样的问题。

对于 CME 阻塞,您无能为力(如果是这种情况),但有一种方法可以解决此问题,即使它需要访问浏览器。我注意到,如果我使用 JavaScript fetch API,它会正确返回 XLS blob,因此这里有一个使用 Apps Script Web App 的解决方法。

索引.html

<!DOCTYPE html>
<html>
  <head>
    <base target="_top">
  </head>
  <body>
    
  </body>

  <script>
    const r = fetch('https://www.cmegroup.com/CmeWS/exp/voiProductsViewExport.ctl?media=xls&tradeDate=20210702&assetClassId=2&reportType=F&excluded=CEE,CEU,KCB')
    .then(r => r.blob())
    .then(b => readFile(b))
    .then(result => saveToDrive(result))

    function saveToDrive(base64) {
      google.script.run
        .withSuccessHandler(() => console.log("success"))
        .saveAsXLS(base64)
    }

    function readFile(blob){
      return new Promise((resolve,reject) => {
        var fr = new FileReader();  
        fr.onload = () => {
          resolve(fr.result)
        };
        fr.onerror = reject;
        fr.readAsDataURL(blob);
      });
    }

  </script>

</html>

代码.gs

function doGet(){
  return HtmlService.createHtmlOutputFromFile("index")
}

function saveAsXLS(dataURL){
  const parts = dataURL.split(",")
  const type = (parts[0]).replace('data:','');
  const blob = Utilities.newBlob(Utilities.base64Decode(parts[1],Utilities.Charset.UTF_8),type,"sheet.xls")

  DriveApp.createFile(blob)
}

基本上,它不是使用 UrlFetchApp,而是使用浏览器实例使用 JavaScript fetch API 来获取 blob,然后在将其发送到 Apps 脚本端之前对其进行编码。然后,Apps 脚本端对其进行解码并将其保存到云端硬盘。

警告

尽管此时您最好使用 curl 或 Python,因为您必须实际访问 Web 应用程序才能执行它。

参考

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。