我希望有人偶然发现了同样的问题,可能会引导我找到一个简单的问题解决方案。
我想定期在Facebook上检索一些关于我的广告的数据。基本上,我只想在我的一个数据库中存储一些元数据,以便进行进一步的报告。因此,我想为我的所有广告获取AD-ID、AD名称和相应的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数据的类似功能运行良好。但对于广告,我总是达到用户请求限制:"(#17) User request limit reached"
。
我确实有一个"基本"的API访问级别,我们在这里谈论的是12000个广告。不幸的是,异步调用似乎只适用于Insights边缘。
是否有办法避免用户请求限制,例如,将API请求限制为仅在特定日期后更改/新建的广告?
好吧,牺牲'created_time'
字段,我已经意识到我可以使用Insights边缘。以下是同一函数的修订代码,该函数现在使用异步调用和调用之间的延迟:
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)