如何在单个查询中获取所有广告系列的见解 + Facebook营销API

9

我希望用Python编写查询,一次请求获取所有广告系列的性能详细信息。

如何将下面的图形API请求转换为Python查询?

/<version>/act_<ACT_ID>/campaigns?fields=insights.fields(actions_results)

我曾尝试使用以下查询,但这是发送多个请求到Facebook的错误想法,同时Facebook会阻止用户30分钟。

fields = [Insights.Field.cpm,
          Insights.Field.cpp]

class Fb_insights(object):

    def __init__(self, app_id, app_secret, access_token):
        FacebookAdsApi.init(app_id, app_secret, access_token)

        # Add after FacebookAdsApi.init
        me = AdUser(fbid='me')
        self.my_account = me.get_ad_accounts()[0]

    def campaign_reports(self, since, until):
        params = {
           'level': Insights.Level.campaign, 
           'time_range': {
                'since': since,
                'until': until,
            },
        }

        for campaign in self.my_account.get_campaigns():
            for stat in campaign.get_insights(fields=fields,
                                                  params=params):
                print(stat)

不好的是,我正在通过调用“get_insights()”为每个广告系列发送请求。

更新

我还尝试直接获取见解,下面的代码仅返回1个广告系列的详细信息,而我有1个活动广告系列和87个未交付的广告系列,还要在参数中更新level=campaign

for insight in self.my_account.get_insights(fields=fields, params=params):
    print insight

查询:通过使用我的更新代码,如何使用单个查询获取所有已交付和未交付的广告活动?


2
为什么不直接请求帐户对象上的“/insights”,并指定?level=campaign以按广告系列拆分结果呢? - Igy
@Igy,同样适用于广告,我使用了level=ad,现在我也想获取目标URL,我该如何使用/insight来获取? - Mitul Shah
@Igy感谢您的建议,它起作用了,现在只有目标URL(对象URL)的问题,我无法使用广告创意的洞察。您能否在这里也帮助我? - Mitul Shah
为此,您仍需要进行单独的请求以获取广告详细信息,它不是/insights输出的一部分。 - Igy
@Igy,出现了相同的问题,用户请求限制已达到。首先,我尝试使用get_ad_creatives获取创意ID,然后对于每个ID再次发送remote_read(fields = fields),由于存在多个广告,我的用户请求限制已达到。 - Mitul Shah
显示剩余3条评论
5个回答

6
请看 "Making Nested Requests" 部分,链接为 https://developers.facebook.com/docs/graph-api/using-graph-api
您可以使用字段扩展通过以下 API 调用一次查询帐户中所有广告系列的见解:
https://graph.facebook.com/v2.10/YOUR_ACCOUNT_ID/campaigns?fields=name,status,insights{reach,impressions,clicks}&access_token=YOUR_TOKEN

字段扩展允许您在节点上设置字段请求。 在上面的示例中,我正在获取按广告系列分组的帐户中所有广告系列的见解,然后使用'insights{reach,impressions,clicks}'可以选择节点级别的字段。

编辑:从URL中删除level=campaign,因为数据已经通过端点/campaigns按广告系列分组。


如何使用嵌套请求添加 date_preset 过滤器? - leopragi

3
为了在单个请求中获取所有广告链接,我已经使用以下代码解决了我的问题。
class FB(object):
    def __init__(self):
        me = AdUser(fbid='me')
        self.my_account = me.get_ad_accounts()[0]

    def fb_creativies(self, since, until):
        """
        This function is used to get destination url
        for each creative object
        """
        fields = [AdCreative.Field.object_story_spec]
        params = {
            'time_range': {
                'since': since,
                'until': until,
            },
        }

        return self.my_account.get_ad_creatives(fields=fields, params=params)

嘿,这看起来像是我需要的东西。当获取多个广告账户的信息时,我该如何实现它?我该如何传递广告账户ID? - LucyTurtle

1

你的第一个答案是正确的,与@igy在评论中给出的答案相同。但是你的第二个解决方案并不满足我们的需求,因为我们有50多个广告,你的答案会向Facebook发送多个请求。我们不能像你那样发送多个请求。 - Mitul Shah
顺便说一句,对于好的回答加上 +1。我之前已经解决了它,但这肯定对其他人有所帮助 :) - Mitul Shah

1
我发现了一些与Business Manager相关的Facebook Graph API编码。
添加Facebook Graph前缀。
https://graph.facebook.com/v2.8/

接着是广告 ID(注意,广告 ID 和广告创意 ID 是不同的)

然后是这段代码:

?fields=%5B%22insights.date_preset(lifetime).action_attribution_windows(%5B%5C%22default%5C%22%5D).default_summary(false).fields(%5B%5C%22impressions%5C%22%2C%5C%22reach%5C%22%2C%5C%22frequency%5C%22%2C%5C%22actions%5C%22%5D).limit(5000).summary_action_breakdowns(%5B%5C%22action_type%5C%22%5D)%22%5D

然后添加你的&access_token=WDVW##$Y#%G@$f
它将返回印象、覆盖范围、频率和按行动类型分隔的一系列动作值列表。
"insights": {"data": [
{
"impressions": "963986",
"reach": "335872",
"frequency": "2.870099",
    "actions": [
        {"action_type": "comment", "value": "133"},
        {"action_type": "like","value": "60"},
        {"action_type": "link_click","value": "4652"},
        {"action_type": "post","value": "76"},
        {"action_type": "post_reaction","value": "516"},
        {"action_type": "unlike","value": "1"},
        {"action_type": "page_engagement","value": "5437"},
        {"action_type": "post_engagement","value": "5377"}
],

"date_start": "2016-05-31",
"date_stop": "2016-06-30"

但你也可以使用广告账户ID,然后使用过滤器按照广告ID进行过滤,以一种账户ID下同时显示多个广告的方式展示。
例如:https://graph.facebook.com/v2.8/YOURADACCOUNTID?fields....etc上面的链接,再加上下面的代码。
用你的广告ID替换“_ENTERADIDHERE_”以一次性获取多个广告。
&filtering=%5B%7B%22field%22%3A%22ad.id%22%2C%22operator%22%3A%22IN%22%2C%22value%22%3A%5B%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%2C%22_ENTERADIDHERE_%22%5D%7D%5D

希望这能帮助某人开始。

0

不知道你是否还需要它。

主要的解决方案在于在广告级别调用洞察。这可以限制 API 调用的数量。只需在你的代码中添加一行:

class Fb_insights(object):

    def __init__(self, app_id, app_secret, access_token):
        FacebookAdsApi.init(app_id, app_secret, access_token)

        # Add after FacebookAdsApi.init
        me = AdUser(fbid='me')
        self.my_account = me.get_ad_accounts()[0]

    def campaign_reports(self, since, until):
        params = {
            'level': 'ad',
            'date_preset': 'lifetime',
            'fields': ['account_id',
                'account_name',
                'actions',
                'ad_id',
                'ad_name',
                'adset_id',
                'adset_name',

                                        ]
        }
        insights = account.get_insights(params=params)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接