FB广告API(#17)已达到用户请求限制


FB Ads API (#17) User request limit reached

我正在使用Facebook广告api来获取帐户Campaign数据。我在这里做的是我得到所有活动的列表,并做每个活动的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)用户请求限制已达到。

有人能帮我解决这种错误吗?

谢谢,Ronak Shah

您应该考虑针对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 Job,所以实现一个计数器来存储您请求的最后一个活动的数据。当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)