【问题标题】:Facebook Business SDK: cannot create an AdFacebook Business SDK:无法创建广告
【发布时间】:2019-01-20 04:12:01
【问题描述】:

我无法制作带有指向移动应用程序的外部链接的简单广告。我已正确设置访问权限,可以创建广告系列、广告集、加载图片,但在广告创建过程中出现错误:

广告和广告素材必须与 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_speclink_data,但它会产生其他错误,因为它在开发模式下不起作用。

  • 应用和页面与 Facebook Business Manager 链接。

  • 如果我使用应用令牌或系统用户令牌初始化 API,结果相同:FacebookAdsApi.init(app_id, app_secret, app_access_token / system_user_token)。系统用户有权访问广告帐户和页面。

【问题讨论】:

  • “但 init 不适用于我在 Business Manager 中创建的系统用户的访问令牌” - 究竟是什么意思?
  • @CBroe 我更新了信息。使用授予访问权限的系统用户令牌没有任何改变。

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


【解决方案1】:

我很久以前就解决了这个问题,从那时起,我的服务器应用程序成功地为网站和移动应用程序创建了大量两种类型的 Facebook 广告。解决问题的第一步是了解这些广告类型在 Facebook 上是完全不同的,它们需要对 Campaign、AdSet 和 Ad 进行不同的设置。这是我的移动广告创建代码。

1) 创建Campaign objectaccount_id 必须是您的广告帐户的 ID。

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 object

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_eventoptimization_goal 与广告类型(移动/网络)相关,并且彼此相关,您不能只选择另一个。 (但如果您知道这是可能的,或者有一些关于此主题的文档 - 请告诉我。)

budget 是以您的广告帐户所用货币表示的金额。您可以指定 lifetime_budget 或类似 day_budget 的内容,请阅读相关文档。

3) 然后,您必须使用其他一些子对象创建AdCreative object。请注意,其中一些代码行仅对 FB 广告是必需的,其他代码行对 IG 是必需的,其他代码对两者都是必需的,但它们一起适用于所有事情。你可以找到description for all the formats here

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,请查看this docpage_id 必须是页面的 ID,其名称和徽标将显示为广告的作者。

您必须注意,创建广告的用户必须有权访问此页面、在 FB 上注册的移动应用 (ad_app_id) 和广告帐户 (account_id)。在我的服务器应用程序中,我使用 Facebook system users 来处理 API 的所有工作。

4) 最后,创建Ad object 本身:

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])

就是这样!

【讨论】:

  • 嗨 AivanF,您如何通过 api 调用将页面分配给您的系统用户?我们在陡峭的 3 上有堆栈(我们可以手动将页面添加给用户)但是如何使用 api all 添加它?
  • @OscarJofre 我们没有办法做到这一点,所以我们手动分配了所有页面。
  • 另一种方法可能是将系统用户添加到该页面?但应该有办法。
  • 我找到了方法。使用管理员系统用户的令牌(您可以从“生成新标识符”的业务管理器中获取它)并调用 $response = $fb->post( '/123146749086177/assigned_users', array ( 'user' => '100022818247829 ', 'tasks' => '['ADVERTISE', 'ANALYZE']' ), '{access-token}' );
【解决方案2】:

在为网站创建 FB/IG 广告时,也许有人需要使用或只是想看看不同之处,它有点简单。所以,这是我创建网站广告的代码。

1) 创建Campaign object。请注意,网站广告具有不同的objectiveaccount_id 必须是您的广告帐户的 ID。

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 object。请注意,billing_eventoptimization_goal 与广告类型(移动/网络)相关联并且彼此相关联。另外,这里不需要在 AdSet 中指定promoted_object

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 是以您的广告帐户所用货币表示的金额。您可以指定 lifetime_budget 或类似 day_budget 的内容,请阅读相关文档。

3) 然后,您必须使用其他一些子对象创建AdCreative object。你可以找到description for all the formats here

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,请查看this docpage_id 必须是页面的 ID,其名称和徽标将显示为广告的作者。请注意,创建广告的用户必须有权访问此页面、在 FB 上注册的移动应用 (ad_app_id) 和广告帐户 (account_id)。

4) 最后,创建Ad object 本身:

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 上注册(与移动广告相反)。

【讨论】:

  • 嗨,@AivanF。谢谢你,但是,你提到你在你的应用程序处于开发模式时做了所有这些?那是您的应用程序也在使用营销 API 吗?我问的原因是,在尝试创建 AdCreative 时,我得到错误 cannot create ad creative in development mode ... 也许它与您使用的系统用户有关,或者???
  • @philkills 你好!老实说,我不记得了,但是如果您需要此信息,请随时给我写信in PM on Facebook,我会查看应用设置。
猜你喜欢
  • 1970-01-01
  • 2015-10-25
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-18
相关资源
最近更新 更多