尝试使用 Google Apps 脚本将图像上传到 Graph API 时如何修复 "Exception: Limit Exceeded" 错误?

How to fix "Exception: Limit Exceeded" error when trying to upload an image to Graph API using Google Apps Script?

我正在使用 Facebook Graph API 通过 Google Apps 脚本创建 Facebook 广告活动。

我需要将图片上传到我的 Facebook 广告帐户。我已经尝试将图像字节用作 Base64 UTF-8 字符串,但是当我调用 API 时,我得到:

Exception: Limit Exceeded: URLFetch URL Length.

基本上是字符串太长了。

我正在使用以下代码:

function uploadTest2() {
  var image_id = 'blabla';
  var image_blob = DriveApp.getFileById(image_id).getBlob();
  var input = image_blob.getBytes();
  var docImg = Utilities.base64Encode(input);
  
  var account_id = '1111111111111';
  var facebookUrl = 
    'https://graph.facebook.com/v7.0' +
    '/act_' + account_id +
    '/adimages?bytes=' + docImg +
    '&access_token=' + TOKEN;
  Logger.log(facebookUrl);

  //var encodedFacebookUrl = encodeURI(facebookUrl);
  var options = {
    'method' : 'post'
  };

  var response = UrlFetchApp.fetch(facebookUrl, options);
  var results = JSON.parse(response);
  Logger.log(response);
}

图片不超过5MB,字节串我已经用在线解码器验证过了

您知道如何在 post 请求中直接使用图像 URL 吗?


第二版代码:

function uploadTest2() {
  var image_id = 'blabla';
  var image_blob = DriveApp.getFileById(image_id).getBlob();
  var input = image_blob.getBytes();
  var docImg = Utilities.base64Encode(input);
  
  var account_id = '1111111111111';
  var facebookUrl = 
    'https://graph.facebook.com/v7.0' +
    '/act_' + account_id +
//    '/adimages?bytes=' + encodedImage +
//    '&access_token=' + TOKEN;
    '/adimages?access_token=' + TOKEN;
  Logger.log(facebookUrl);

  //var encodedFacebookUrl = encodeURI(facebookUrl);
  var options = {
    'method' : 'post',
    'payload' : image_blob
  }; 

  var response = UrlFetchApp.fetch(facebookUrl, options);
  var results = JSON.parse(response);
  Logger.log(response);
}

解决方案

为了使用 UrlFetchApp.fetch() 发出图像的 post 请求,您必须提供方法、有效负载(即您想要 POST 的正文),有时还提供内容类型(如果我们传递的不是 JavaScript 对象)。

如果你想传递从 blob 中获得的 base64Encode 对象,你应该将这个 JSON 对象字符串化。

最初的 poster 缺少的是传递有效负载,在我的贡献和他的工作之后,他终于通过编辑选项变量解决了这个问题,例如:

var options = {
   'method' : 'post',
   'contentType': 'application/json',
   'payload': JSON.stringify({"bytes": docImg,"name" : 'Test'})};
   }

Documentation reference : Class UrlFetchApp