как получить статистику по всем кампаниям в одном запросе + API маркетинга Facebook

Я хочу написать запрос на 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 кампаний Not Delivering, также обновите level=campaign в параметрах

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

Запрос:. Как с помощью обновленного кода получить все доставленные и недоставленные кампании с помощью одного запроса?


comment
Почему бы просто не запросить /insights в объекте учетной записи и указать? Level = campaign, чтобы получить результаты с разбивкой по кампаниям?   -  person Igy    schedule 06.01.2016
comment
@Igy и то же самое для рекламы, я использовал level = ad, и теперь мне также нужен целевой URL, как я могу использовать / insight?   -  person Mitul Shah    schedule 06.01.2016
comment
@Igy, спасибо за предложение, это работает, теперь проблема только с целевым URL-адресом (URL-адрес объекта), я не могу использовать понимание с ad_creatives. не могли бы вы также помочь мне здесь?   -  person Mitul Shah    schedule 06.01.2016
comment
Для этого вам все равно нужно будет сделать отдельный запрос для получения сведений об объявлении, это не является частью вывода / insights.   -  person Igy    schedule 06.01.2016
comment
@Igy как слить отдельный ответ на рекламу? Я хочу, чтобы каждый URL был с его рекламой. Если возможно, вы можете написать образец кода?   -  person Mitul Shah    schedule 07.01.2016
comment
@Igy возникает такая же проблема, достигнут лимит запросов пользователя. Сначала я пытаюсь получить идентификатор объявления, используя get_ad_creatives, а затем для каждого идентификатора снова отправляя remote_read(fields=fields), и только из-за наличия нескольких объявлений мой предел запросов пользователей исчерпан.   -  person Mitul Shah    schedule 07.01.2016
comment
@Igy Можно ли получить creative_id, используя get_insights функции для всех объявлений? Я использую account.get_insights(), чтобы получить отчет по эффективности всех объявлений.   -  person Mitul Shah    schedule 11.01.2016
comment
нет, идентификатор объявления не является частью API Insights - для полей с объявлениями, которые не являются частью API Insights, вам нужно будет сделать дополнительные вызовы для получения этих полей.   -  person Igy    schedule 11.01.2016


Ответы (5)


Взгляните на 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 {охват, показы, клики}' вы можете выбрать поля для уровня узла.

РЕДАКТИРОВАТЬ: удален уровень = кампания из URL-адреса, поскольку данные уже сгруппированы по кампании из-за конечной точки / campaign

person maleta    schedule 22.08.2017
comment
как добавить date_preset фильтр с помощью вложенного запроса? - person leopragi; 19.04.2021

Чтобы получить ссылку на всю рекламу в одном запросе, я решил свои проблемы с помощью приведенного ниже кода.

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)
person Mitul Shah    schedule 15.01.2016
comment
Эй, это похоже на то, что мне нужно. Как бы это реализовать при получении информации для нескольких рекламных аккаунтов. Как передать ему идентификатор рекламного аккаунта? - person LucyTurtle; 26.06.2018

Я делал нечто подобное. Я установил уровень рекламы - см. Пример кода здесь: http://www.samk3nny.com/getting-ad-insights-from-facebook-and-avoiding-error-17/

А затем для каждого объявления получите креативы:

ad = Ad(fbid=ad_id)
creatives = ad.get_ad_creatives(fields=[AdCreative.Field.id,
                                        AdCreative.Field.object_story_spec,              
                                        AdCreative.Field.object_story_id])
person Sam Kenny    schedule 14.01.2016
comment
ваш первый ответ правильный, на который так же ответил @igy в комментарии, ваше второе решение не устраивает, так как у нас более 50 объявлений, и ваш ответ отправит несколько запросов в Facebook, мы не можем отправлять несколько запросов, как вы - person Mitul Shah; 15.01.2016
comment
Кстати +1 за хороший ответ. Решал уже раньше, но другим точно поможет :) - person Mitul Shah; 15.01.2016

Некоторое кодирование API графа facebook я нашел, копаясь в Business Manager.

Добавьте префикс графика Facebook

https://graph.facebook.com/v2.8/

За ним следует идентификатор объявления (обратите внимание, что идентификатор объявления и идентификатор объявления объявления различаются).

Далее следует этот код:

?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"

НО вы также можете использовать свой Ad Acct ID, а затем использовать фильтрацию для фильтрации по Ad ID, чтобы одновременно отображать несколько объявлений под одним идентификатором Acct.

Например: https://graph.facebook.com/v2.8/YOURADACCOUNTID?fields....etc сверху, затем код ниже.

Замените _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

Надеюсь, это поможет кому-нибудь помешать.

person MattMcL1988    schedule 15.03.2017

Не знаю, нужно ли оно вам еще.

Основное решение заключается в том, чтобы получить информацию на уровне рекламы. Это ограничивает количество вызовов 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)
person Nabeela tabu    schedule 15.06.2017