python - Facebook 商业 SDK : cannot create an Ad

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

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

Ads and ad creatives must be associated with a Facebook Page. Try connecting your ad or ad creative to a Page and resubmit your ad.

但是我已经关联了一个页面!这是我的代码:

# 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 商务管理平台关联。

  • 如果我使用应用 token 或系统用户 token 初始化 API,结果是相同的:FacebookAdsApi.init(app_id, app_secret, app_access_token/system_user_token)。系统用户可以访问广告帐户和主页。

最佳答案

我很久以前就解决了这个问题,从那时起,我的服务器应用程序成功地为网站和移动应用程序创建了大量这两种类型的 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 与广告类型(移动/网络)相关并且彼此相关,您不能只选择另一个。 (但是如果您知道这是可能的,或者有一些关于此主题的文档 - 请告诉我。)

预算是以您广告帐户的货币表示的金额。您可以指定 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,该页面的名称和 Logo 将显示为广告作者。

您必须注意,创建广告的用户必须有权访问此页面、在 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])

仅此而已!

关于python - Facebook 商业 SDK : cannot create an Ad,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51822179/

相关文章:

ios - 以编程方式隐藏 Apple iAd ADBannerView

android - 在我的应用程序中集成 Android 添加网络

java - 我可以使用Cucumber测试使用多种语言的应用程序吗?

ios - 通过 Safari 或 FB App 登录 Facebook 无效

facebook - 使用 Facebook v2.1 Graph API 通过 cURL 以编程方式创建测试用户

php - 我可以使用 PHP Facebook SDK 向我的用户发送私有(private)消息吗?

javascript - 这是一种新的广告 JavaScript 类型,更改为 "window.opener.location",我该如何阻止它?

python - 我可以在 Python 的函数中声明一个类吗?

python - 如何在 Python 中编写正则表达式以删除字符串中间数字的前导零

python - 使用 contextlib.contextmanager 继承