Facebook Marketing API:通过Python检索许多广告的元数据

时间:2016-04-01 15:23:57

标签: python facebook-ads-api facebook-marketing-api

我希望,有人偶然发现了同样的问题,可能会指导我找到解决问题的简单方法。

我想定期检索一些关于我在Facebook上的广告的数据。基本上,我只想在我的一个数据库中存储一些元数据,以便进一步报告。因此,我希望为我的所有广告获取AD-ID,AD-name和相应的ADSET-ID。

我在Python中编写了这个小函数:

def get_ad_stats(ad_account):
    """ Pull basic stats for all ads
    Args: 'ad_account' is the Facebook AdAccount object
    Returns: 'fb_ads', a list with basic values
    """
    fb_ads = []
    fb_fields = [
                Ad.Field.id,
                Ad.Field.name,
                Ad.Field.adset_id,
                Ad.Field.created_time,
    ]

    fb_params = {
        'date_preset': 'last_14_days',
    }

    for ad in ad_account.get_ads(fields = fb_fields, params = fb_params):
        fb_ads.append({
            'id':                   ad[Ad.Field.id],
            'name':                 ad[Ad.Field.name],
            'adset_id':             ad[Ad.Field.adset_id],
            'created_time':         datetime.datetime.strptime(ad[Ad.Field.created_time], "%Y-%m-%dT%H:%M:%S+0000"),
        })

    return (fb_ads)

Campaign-和AdSet-data的类似功能正常工作。但对于广告,我始终达到用户请求限制:"(#17) User request limit reached"

我的API访问级别为“BASIC”,我们在这里谈论的是12,000个广告。 而且,不幸的是,异步调用似乎只适用于Insights-edge。

有没有办法避免用户请求限制,例如通过将API请求限制为仅在特定日期之后更改/新创建的广告?

1 个答案:

答案 0 :(得分:2)

好的,牺牲了'created_time'字段,我意识到我可以使用Insights-edge。 以下是同一功能的修订代码,现在使用异步调用和调用之间的延迟:

def get_ad_stats(ad_account):
    """ Pull basic stats for all ads
    Args: 'ad_account' is the Facebook AdAccount object
    Returns: 'fb_ads', a list with basic values
    """
    fb_ads = []

    fb_params = {
        'date_preset': 'last_14_days',
        'level': 'ad',
    }

    fb_fields = [
        'ad_id',
        'ad_name',
        'adset_id',
    ]

    async_job = ad_account.get_insights(fields = fb_fields, params = fb_params, async=True)
    async_job.remote_read()

    while async_job['async_percent_completion'] < 100:
        time.sleep(1)
        async_job.remote_read()

    for ad in async_job.get_result():
        fb_ads.append({
            'id':                   ad['ad_id'],
            'name':                 ad['ad_name'],
            'adset_id':             ad['adset_id'],
        })

    return (fb_ads)