Как получить данные, не прерывая вызов в Facebook Graph API?

#facebook #facebook-graph-api

#Facebook #facebook-graph-api

Вопрос:

Что мне нужно сделать, чтобы обойти эту проблему, потому что, когда я запрашиваю данные за 2 месяца, я уже получаю эту ошибку, когда происходит перерыв в день, у меня следующий вызов. С небольшим количеством данных работает идеально, но когда я увеличиваю период, сервер возвращает мне

Ограничение на запрос пользователя reached»,»type»:»OAuthException»,»is_transient»:true,»code»:17,»error_subcode»:2446079,»fbtrace_id»:»…

 function solicitacaoAssicrona(){
 var service = getService()
 var batch = [{"method": "GET", "relative_url":"v3.2/act_1125789557444919/insights/impressions,reach,frequency,spend,campaign_name,account_name,clicks,cost_per_10_sec_video_view,cpm,cpp?level=campaignamp;since=2016-03-03amp;until=2019-03-04amp;time_increment=1amp;limit=100"}]
// var batchUrl = encodeURIComponent(JSON.stringify(batch));
// Logger.log(batchUrl);
 var url = "https://graph.facebook.com?include_headers=falseamp;batch="   encodeURIComponent(JSON.stringify(batch)) 
 var response = UrlFetchApp.fetch(url, {
   method: 'POST',
   headers: {    
     Authorization: 'Bearer '   service.getAccessToken()
   }
 });
 var result =  JSON.parse(response.getContentText()); 
 Logger.log(result)
// response.forEach(function(resp){
// var resp = JSON.parse(resp.body);
// //Logger.log(JSON.stringify(resp, null, 2));
//   
////   resp.data[0].values.forEach(function(response){
////     
////   
////   }) 
//// 
// })
}
  

Я просмотрел документацию, но на данный момент безуспешно!
https://developers.facebook.com/docs/marketing-api/insights/best-practices

Это вызов, который у меня есть

 var metricas = [
'impressions',
'reach',
'unique_clicks',
'account_currency',
'account_id',
'account_name',
'ad_id',
'ad_name',
'adset_id',
'adset_name',
'buying_type',
'campaign_id',
'campaign_name',
'clicks',
'cost_per_inline_link_click',
'cost_per_inline_post_engagement',
'cost_per_unique_click',
'cost_per_unique_inline_link_click',
'cpc', 
'cpm',
'cpp',
'ctr',
'date_start',
//'date_stop',
'frequency',
'inline_link_click_ctr',
'inline_link_clicks',
'inline_post_engagement',
'objective',
'relevance_score',
'social_spend',
'spend',
'unique_ctr',
'unique_inline_link_click_ctr',
'unique_inline_link_clicks',
'unique_link_clicks_ctr',
//'website_ctr',
'video_10_sec_watched_actions',
'cost_per_10_sec_video_view',
'video_30_sec_watched_actions',
'video_avg_percent_watched_actions',
'video_avg_time_watched_actions',
'video_p100_watched_actions',
'video_p25_watched_actions',
'video_p50_watched_actions',
'video_p75_watched_actions',
'video_play_actions',
'video_thruplay_watched_actions',
'video_p95_watched_actions', 
]

var parameters = metricas.join(',');
var url = 'https://graph.facebook.com/v3.2/act_xxxxxxxxxx/insights?fields=   parameters   'amp;level=adamp;time_range[since]=2019-02-05amp;time_range[until]=2019-04-05amp;time_increment=1amp;limit=200'
  

Ответ №1:

Это связано с тем, сколько данных вы можете получить с помощью пакетных запросов. Для более длительных периодов вам следует разделить их на более мелкие фрагменты, следующие друг за другом, таким образом извлекая данные, необходимые в нескольких запросах. Взгляните на этот пример:

Code.gs

Из строки 88 файла вы можете видеть, как они могут быть разделены на несколько запросов. https://github.com/halsandr/Facebook_Connector/blob/master/Code.gs

 function dateDelta(dObj, num) {
    if (isNaN(num)) {
      var dateStart = new Date(dObj);
    } else {
      var dateStart = new Date(dObj);
      var dateStart = new Date(dateStart.setDate(dateStart.getDate()   num));
    }
    var dd = dateStart.getDate();
    var mm = dateStart.getMonth() 1; //January is 0!
    
    var yyyy = dateStart.getFullYear();
    if(dd<10){
        dd='0' dd;
    } 
    if(mm<10){
        mm='0' mm;
    } 
    var dateStart = yyyy   "-"   mm   "-"   dd;
    return dateStart;
  }
  
  var gStartDate = new Date(request.dateRange.startDate);
  var gStartDate = new Date(dateDelta(gStartDate, -1));
  var gEndDate = new Date(request.dateRange.endDate);
  var gEndDate = new Date(dateDelta(gEndDate,  1));
  var gRange = Math.ceil(Math.abs(gEndDate - gStartDate) / (1000 * 3600 * 24));
  var gBatches = Math.ceil(gRange / 92);

  if (gBatches < 2) {
    var batch = [{"method": "GET", "relative_url": request.configParams.pageID   "/insights/page_fans,page_impressions,page_post_engagements?since="   dateDelta(gStartDate)   "amp;until="   dateDelta(gEndDate)}];
    //console.log(batch);
  } else {
    batch = [];
    var iterRanges = gRange / gBatches;
    
    for (i = 0; i < gBatches; i  ) {
      var iterStart = dateDelta(gStartDate, (iterRanges * i));
      if (i == (gBatches - 1)) {
        var iterEnd = dateDelta(gEndDate);
      } else {
        var iterEnd = dateDelta(gStartDate, (iterRanges * (i   1))   1);
      }
      batch.push({"method": "GET", "relative_url": request.configParams.pageID   "/insights/page_fans,page_impressions,page_post_engagements?since="   iterStart   "amp;until="   iterEnd})
    }
    //console.log(batch);
  }
  
    // Fetch the data with UrlFetchApp
  var url = "https://graph.facebook.com?include_headers=falseamp;batch="   encodeURIComponent(JSON.stringify(batch))