首页 > 解决方案 > 尝试使用 Google Apps 脚本将图像上传到 Graph API 时如何解决“异常:超出限制”错误?

问题描述

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

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

例外:超出限制:URLFetch 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=' + 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,我已经使用在线解码器检查了字节字符串以进行验证。

您对如何在发布请求中直接使用图像 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);
}

标签: javascriptfacebook-graph-apigoogle-apps-scriptfacebook-marketing-api

解决方案


解决方案

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

如果要传递base64Encode从 blob 获得的对象,则应将此 JSON 对象字符串化。

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

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

文档参考:类 UrlFetchApp


推荐阅读