API返回函数,如何使用UrlFetchApp等待和解析JSON

y1aodyip  于 2023-05-02  发布在  其他
关注(0)|答案(1)|浏览(146)

我正在编写一个脚本,并使用此脚本测试API调用:

function floorGrab(){
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  var helpSheet = ss.getSheetByName("Helper");
  var urls = helpSheet.getRange("aa2:aa").getDisplayValues();
  console.log(urls[0]);
  var options = {
  muteHttpExceptions: true,
                }
  var rawData = UrlFetchApp.fetch(urls[0], options);
  console.log(rawData);
  var data = JSON.parse(rawData);
  console.log(data);
}

本例中的URL为:https://api-mainnet.magiceden.io/sft/markets/4YjkU4KrCnWhQ7DhMNLkUqeJjdhgK2xZYYmt5MgNfPYq?name=Pipelia-Wing
当访问这个网站时,JSON很容易加载。但是当调用它的时候,它会返回这个,当然这是无法解析的:

{ toString: [Function],
    getResponseCode: [Function],
    getContent: [Function],
    getAllHeaders: [Function],
    getHeaders: [Function],
    getContentText: [Function],
    getBlob: [Function],
    getAs: [Function] }

Appscript中有没有一种方法可以让页面首先完全加载,然后获取JSON?我已经尝试了许多不同的选项,比如添加一个Origin,在选项中对数据进行字符串化,请求JSON等。但一切都是一样的。

snvhrwxg

snvhrwxg1#

无法解析JSON的原因是request failed。由于在上面的代码中将选项muteHttpExceptions设置为true,因此无法看到错误响应。
Class UrlFetchApp中,如果此选项设置为true;
如果响应代码指示失败,fetch不会抛出异常,而是返回HTTPResponse
这就是为什么当您有console.log(rawData)时,您看到的输出是HTTPResponse

{ toString: [Function],
getResponseCode: [Function],
getContent: [Function],
getAllHeaders: [Function],
getHeaders: [Function],
getContentText: [Function],
getBlob: [Function],
getAs: [Function] }

编码:

我尝试在不添加muteHttpExceptions选项的情况下从您的示例中调用API

function myFunction() {
  var url = 'https://api-mainnet.magiceden.io/sft/markets/4YjkU4KrCnWhQ7DhMNLkUqeJjdhgK2xZYYmt5MgNfPYq?name=Pipelia-Wing'
  var rawData = UrlFetchApp.fetch(url);
  console.log(rawData)
}

执行日志:

异常:https://api-mainnet.magiceden.io的请求失败,返回代码403。截断的服务器响应:错误代码:1020(使用muteHttpExceptions选项检查完整响应)

HTTP响应码(403):

HTTP 403 Forbidden响应状态码表示服务器理解请求但拒绝授权。
您可能希望查看此thread以了解此错误的可能修复。我还在下面添加了其他可能有助于修复错误的参考资料。

错误码(1020):

Error 1020访问被拒绝是在Cloudflare保护的站点上违反防火墙规则时导致的。如果站点访问者尝试直接访问受保护的端点,则可能会触发此事件。
我碰巧在SO上发现了一个类似的关于错误1020的案例,答案建议根据您的请求添加UserAgent header。您可能想尝试这种方法。
我还在下面添加了讨论此错误可能修复的网站列表。

参考资料:

免责声明:我不属于所有的网站建议。

https://developers.google.com/apps-script/reference/url-fetch/url-fetch-app
https://developers.google.com/apps-script/reference/url-fetch/http-response
https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/403
错误403可能的修复:
https://support.google.com/chrome/thread/147521409/what-is-403-error?hl=en
https://www.online-tech-tips.com/computer-tips/how-to-fix-403-forbidden-error-on-google-chrome/
https://www.howtogeek.com/357785/what-is-a-403-forbidden-error-and-how-can-i-fix-it/
错误1020可能的修复:
Why curl giving 1020 error while postman giving response
curl 1020 error when trying to scrape page using bash script
https://rockcontent.com/blog/error-1020-access-denied/#:~:text=Wrap%20Up-,What%20is%20Error%201020%20Access%20Denied%3F,an%20endpoint%20that%20is%20protected.
https://www.makeuseof.com/cloudflare-error-1020-access-denied-fix/

相关问题