Facebook Business SDK:无法创建广告

时间:2018-08-13 12:16:48

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

我无法创建带有外部链接到移动应用的简单广告。我已正确设置访问权限,可以创建广告系列,广告集,加载图片,但是在制作广告时遇到错误:

  

广告和广告素材必须与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链接。

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

2 个答案:

答案 0 :(得分:2)

我很久以前就解决了这个问题,自那时以来,我的服务器应用成功为网站和移动应用成功创建了两种类型的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])

仅此而已!

答案 1 :(得分:1)

在为网站创建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上注册(与移动广告相比)。