Facebook Business SDK: невозможно создать объявление

1

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

Объявления и рекламные объявления должны быть связаны с Facebook. Попробуйте подключить свое объявление или рекламное объявление к странице и повторно отправить свое объявление.

Но я связал страницу! Вот мой код:

# No problem with these ones
adset = ...
image_hash = '...'
url = 'https://itunes.apple.com/app/96...'
page_id = '25036...'

# Create an Ad Creative
creative = AdCreative()
creative['_parent_id'] = my_ads_acc_id
creative[AdCreative.Field.title] = 'Aivan Test Creative'
creative[AdCreative.Field.body] = 'Aivan Test Ad Creative Body'
creative[AdCreative.Field.actor_id] = page_id
creative[AdCreative.Field.link_url] = url
creative[AdCreative.Field.object_url] = url
creative[AdCreative.Field.object_type] = AdCreative.ObjectType.domain
creative[AdCreative.Field.call_to_action_type] = AdCreative.CallToActionType.use_mobile_app
creative[AdCreative.Field.image_hash] = image_hash

# Create an Ad
ad = Ad()
ad['_parent_id'] = my_ads_acc_id
ad[Ad.Field.name] = 'Aivan Ad'
ad[Ad.Field.adset_id] = adset[AdSet.Field.id]
ad[Ad.Field.creative] = creative
# This line generates an exception:
ad.remote_create(params={
    'status': Ad.Status.paused,
})

Я указал поле actor_id, также я пробовал другие образцы кода, но ничего не работает. Как подключить страницу?

Дополнительная информация:

  • Мое приложение находится в режиме разработки. Я не могу включить режим производства, потому что ему нужен обзор, который требует завершенного приложения.

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

  • Приложение и страница связаны с Facebook Business Manager.

  • Результаты совпадают, если я инициализирую API с помощью токена приложения или токена пользователя системы: FacebookAdsApi.init(app_id, app_secret, app_access_token/system_user_token). Пользователь системы имеет доступ как к учетной записи объявлений, так и к странице.

  • 0
    «Но init не работает с токенами пользователей системы, которые я создал в Business Manager» - что именно?
  • 0
    @CBroe Я обновил информацию. Использование токена пользователя системы с предоставленным доступом ничего не изменило.
Теги:
facebook-graph-api
ads
facebook-marketing-api
facebook-ads-api

2 ответа

0
Лучший ответ

Я давно решил проблему, и с тех пор мое серверное приложение успешно создало множество объявлений в Facebook для обоих типов, для веб-сайтов и мобильных приложений. Первым шагом для решения проблемы было понимание того, что эти типы объявлений совершенно разные на Facebook, им нужны разные настройки для кампании, AdSet и Ad. Вот мой код для создания мобильных объявлений.

1) Создайте объект кампании. account_id должен быть идентификатором вашей учетной записи Ad.

campaign = Campaign()
campaign['_parent_id'] = account_id
campaign[Campaign.Field.name] = 'Some Campaign Name'
campaign[Campaign.Field.objective] = 'APP_INSTALLS'
campaign.remote_create()
campaign_id = str(campaign[Campaign.Field.id])

2) Создайте объект AdSet.

adset = AdSet()
adset['_parent_id'] = account_id
adset.update({
    AdSet.Field.name: 'Some AdSet Name',
    AdSet.Field.campaign_id: campaign_id,
    AdSet.Field.lifetime_budget: budget * 100,
    AdSet.Field.bid_strategy: 'LOWEST_COST_WITHOUT_CAP',
    AdSet.Field.billing_event: AdSet.BillingEvent.link_clicks,
    AdSet.Field.optimization_goal: AdSet.OptimizationGoal.link_clicks,
    AdSet.Field.promoted_object: {
        'object_store_url': app_store_url,
        'application_id': ad_app_id,
    },
    AdSet.Field.targeting: targeting_object,
    AdSet.Field.start_time: '2018-12-01 00:00:00',
    AdSet.Field.end_time: '2018-12-30 23:59:00',
})
adset.remote_create()
adset_id = str(adset[AdSet.Field.id])

Обратите внимание, что для создания мобильного объявления вам сначала необходимо зарегистрировать свое мобильное приложение в качестве приложения Facebook (здесь вы получите ad_app_id) и указать ссылки на Apple App Store и Google Play Market. Таким образом, значение app_store_url должно быть равно одной из этих ссылок в настройках вашего приложения Facebook. К сожалению, приложение может быть зарегистрировано только вручную (если вы знаете, как это сделать программно, напишите комментарий, пожалуйста).

Также отметим, что billing_event и optimization_goal связаны с типом объявления (мобильный/веб) и друг с другом, вы не можете просто выбрать другой. (Но если вы знаете, что это возможно, или есть какие-то документы по этим темам - дайте мне знать.)

budget - это сумма денег в валюте вашей учетной записи Ad. Вы можете указать либо lifetime_budget либо что-то вроде day_budget, прочитать документы об этом.

3) Затем вам нужно создать объект AdCreative с некоторыми другими предметами. Обратите внимание, что некоторые из этих строк кода необходимы только для рекламы FB, другие для IG, другие для обоих из них, но вместе они хорошо работают для всего. Здесь вы можете найти описание для всех форматов.

link_data = AdCreativeLinkData()
link_data[AdCreativeLinkData.Field.name] = main_text
link_data[AdCreativeLinkData.Field.message] = title
link_data[AdCreativeLinkData.Field.link] = app_store_url
link_data[AdCreativeLinkData.Field.image_hash] = image_hash
link_data[AdCreativeLinkData.Field.call_to_action] = {
    'type': 'INSTALL_MOBILE_APP',
    'value': {
        'application': ad_app_id,
        'link': app_store_url,
    },
}

object_story_spec = AdCreativeObjectStorySpec()
object_story_spec[AdCreativeObjectStorySpec.Field.page_id] = page_id
object_story_spec[AdCreativeObjectStorySpec.Field.link_data] = link_data

creative = AdCreative()
creative['_parent_id'] = account_id
creative[AdCreative.Field.object_story_spec] = object_story_spec
creative[AdCreative.Field.title] = main_text
creative[AdCreative.Field.body] = title
creative[AdCreative.Field.actor_id] = page_id
creative[AdCreative.Field.link_url] = app_store_url
creative[AdCreative.Field.image_hash] = image_hash

Чтобы загрузить изображение и получить image_hash, ознакомьтесь с этим документом. page_id должен быть идентификатором страницы, имя и логотип которого будут отображаться в качестве автора объявления. Обратите внимание, что пользователь, создавший объявление, должен иметь доступ к этой странице, мобильному приложению, зарегистрированному на FB (ad_app_id), и учетной записи Ad (account_id).

4) И, наконец, создайте сам объект Ad:

ad = Ad()
ad['_parent_id'] = account_id
ad[Ad.Field.name] = 'Some Ad Name'
ad[Ad.Field.adset_id] = adset_id
ad[Ad.Field.creative] = creative
ad.remote_create(params={
    'status': Ad.Status.active,
})
ad_id = str(ad[Ad.Field.id])

Все это!

0

Возможно, кому-то понадобится использовать или просто захочет увидеть разницу при создании объявлений FB/IG для сайтов, это немного проще. Итак, вот мой код для создания объявлений на сайте.

1) Создайте объект кампании. Обратите внимание, что реклама на сайте имеет другую objective. account_id должен быть идентификатором вашей учетной записи Ad.

campaign = Campaign()
campaign['_parent_id'] = account_id
campaign[Campaign.Field.name] = 'Some Campaign Name'
campaign[Campaign.Field.objective] = 'LINK_CLICKS'
campaign.remote_create()
campaign_id = str(campaign[Campaign.Field.id])

2) Создайте объект AdSet. Обратите внимание, что billing_event и optimization_goal связаны с типом объявления (мобильный/веб) и друг с другом. Кроме того, здесь вам не нужно указывать promoted_object в AdSet.

adset = AdSet()
adset['_parent_id'] = account_id
adset.update({
    AdSet.Field.name: 'Some AdSet Name',
    AdSet.Field.campaign_id: campaign_id,
    AdSet.Field.lifetime_budget: budget * 100,
    AdSet.Field.bid_strategy: 'LOWEST_COST_WITHOUT_CAP',
    AdSet.Field.billing_event: AdSet.BillingEvent.impressions,
    AdSet.Field.optimization_goal: AdSet.OptimizationGoal.reach,
    AdSet.Field.targeting: targeting_object,
    AdSet.Field.start_time: '2018-12-01 00:00:00',
    AdSet.Field.end_time: '2018-12-30 23:59:00',
})
adset.remote_create()
adset_id = str(adset[AdSet.Field.id])

Правила для бюджета одинаковы: budget - это сумма денег в валюте вашей учетной записи Ad.Вы можете указать либо lifetime_budget либо что-то вроде day_budget, прочитать документы об этом.

3) Затем вам нужно создать объект AdCreative с некоторыми другими предметами. Здесь вы можете найти описание для всех форматов.

link_data = AdCreativeLinkData()
link_data[AdCreativeLinkData.Field.name] = main_text
link_data[AdCreativeLinkData.Field.message] = title
link_data[AdCreativeLinkData.Field.link] = website_url
link_data[AdCreativeLinkData.Field.image_hash] = image_hash

object_story_spec = AdCreativeObjectStorySpec()
object_story_spec[AdCreativeObjectStorySpec.Field.page_id] = page_id
object_story_spec[AdCreativeObjectStorySpec.Field.link_data] = link_data

creative = AdCreative()
creative['_parent_id'] = account_id
creative[AdCreative.Field.object_story_spec] = object_story_spec
creative[AdCreative.Field.title] = main_text
creative[AdCreative.Field.body] = title
creative[AdCreative.Field.actor_id] = page_id
creative[AdCreative.Field.link_url] = website_url
creative[AdCreative.Field.object_type] = AdCreative.ObjectType.domain
creative[AdCreative.Field.image_hash] = image_hash

Чтобы загрузить изображение и получить image_hash, ознакомьтесь с этим документом.page_id должен быть идентификатором страницы, имя и логотип которого будут отображаться в качестве автора объявления.Обратите внимание, что пользователь, создавший объявление, должен иметь доступ к этой странице, мобильному приложению, зарегистрированному на FB (ad_app_id), и учетной записи Ad (account_id).

4) И, наконец, создайте сам объект Ad:

ad = Ad()
ad['_parent_id'] = account_id
ad[Ad.Field.name] = 'Some Ad Name'
ad[Ad.Field.adset_id] = adset_id
ad[Ad.Field.creative] = creative
ad.remote_create(params={
    'status': Ad.Status.active,
})
ad_id = str(ad[Ad.Field.id])

Как вы можете видеть, для продвижения сайтов вам не нужно регистрировать их на Facebook (в отличие от мобильных объявлений).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню