[英]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.