簡體   English   中英

FB Ads API (#17) 達到用戶請求限制

[英]FB Ads API (#17) User request limit reached

我正在使用 Facebook 廣告 api 來獲取帳戶活動數據。我在這里做的是獲取所有活動的列表,並對每個活動進行 forloop 獲取活動統計信息

$campaignSets = $account->getCampaigns(array(
      CampaignFields::ID,
      CampaignFields::NAME
));

foreach ($campaignSets as $campaign) {
      $campaign = new Campaign($campaign->id);
      $fields = array(
        InsightsFields::CAMPAIGN_NAME,
        InsightsFields::IMPRESSIONS,
        InsightsFields::UNIQUE_CLICKS,
        InsightsFields::REACH,
        InsightsFields::SPEND,
        InsightsFields::TOTAL_ACTIONS,
        InsightsFields::TOTAL_ACTION_VALUE
      );
      $params = array(
        'date_preset' => InsightsPresets::TODAY
      );
                $insights = $campaign->getInsights($fields, $params);
}

執行上面的代碼時,我收到錯誤,因為(#17)達到了用戶請求限制。

誰能幫我解決這種錯誤?

謝謝,羅納克沙

您應該考慮針對 Adaccount 生成一份報告,該報告會返回您所有廣告系列的見解,這應該會顯着減少所需的請求數量。

Cursor::setDefaultUseImplicitFetch(true);

$account = new AdAccount($account_id);
$fields = array(
  InsightsFields::CAMPAIGN_NAME,
  InsightsFields::CAMPAIGN_ID,
  InsightsFields::IMPRESSIONS,
  InsightsFields::UNIQUE_CLICKS,
  InsightsFields::REACH,
  InsightsFields::SPEND,
  InsightsFields::TOTAL_ACTIONS,
  InsightsFields::TOTAL_ACTION_VALUE,
);
$params = array(
  'date_preset' => InsightsPresets::TODAY,
  'level' => 'ad',
  'limit' => 1000,
);

$insights = $account->getInsights($fields, $params);
foreach($insights as $i) {
  echo $i->campaign_id.PHP_EOL;
}

如果您遇到 API 限制,您唯一的選擇就是減少調用。 您可以通過延遲 API 調用輕松地做到這一點。 我假設您已經在使用 Cron 作業,因此實現一個計數器來存儲您請求數據的最后一個活動。 當 Cron Job 再次運行時,請求下一個 1-x 活動數據的數據(您必須測試每個 Cron Job 調用可能有多少)並再次存儲最后一個。

此外,您應該批處理 API 調用 - 它不會避免限制,但會快得多。 與批處理中最慢的 API 調用一樣快。

將此添加到您的代碼中,您將永遠不必擔心 FB 的速率限制/達到用戶限制。 一旦接近限制,您的腳本將自動休眠,然后在冷卻后從它離開的地方開始。 享受 :)

import logging
import requests as rq

#Function to find the string between two strings or characters
def find_between( s, first, last ):
    try:
        start = s.index( first ) + len( first )
        end = s.index( last, start )
        return s[start:end]
    except ValueError:
        return ""

#Function to check how close you are to the FB Rate Limit
def check_limit():
    check=rq.get('https://graph.facebook.com/v3.3/act_'+account_number+'/insights?access_token='+my_access_token)
    call=float(find_between(check.headers['x-business-use-case-usage'],'call_count":','}'))
    cpu=float(find_between(check.headers['x-business-use-case-usage'],'total_cputime":','}'))
    total=float(find_between(check.headers['x-business-use-case-usage'],'total_time":',','))
    usage=max(call,cpu,total)
    return usage

#Check if you reached 75% of the limit, if yes then back-off for 5 minutes (put this chunk in your loop, every 200-500 iterations)
if (check_limit()>75):
    print('75% Rate Limit Reached. Cooling Time 5 Minutes.')
    logging.debug('75% Rate Limit Reached. Cooling Time 5 Minutes.')
    time.sleep(300)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM