首页 文章

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 字段,我也尝试了其他不同的代码示例,但没有任何效果 . 我该如何连接页面?

附加信息:

  • 我的应用处于开发模式 . 我无法转换 生产环境 模式,因为它需要一个需要已完成的应用程序的审核 .

  • 我试图在其中使用带有 link_dataobject_story_spec ,但它会产生其他错误,因为它在开发模式下不起作用 .

  • 应用程序和页面与Facebook Business Manager链接 .

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

2 回答

  • 0

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

    1) 创建Campaign object . account_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应用设置中的其中一个链接 . 不幸的是,app只能手动注册(如果你知道如何以编程方式进行注册 - 请写评论) .

    另请注意, 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 doc . page_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])
    

    就这样!

  • 0

    也许有人需要使用或只是想在为网站创建FB / IG广告时看到差异,这有点简单 . 所以,这是我的 website ads 创建代码 .

    1) 创建Campaign object . 请注意,网站广告具有不同的 objective . account_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])
    

    预算规则相同:预算是指您广告帐户所用货币的金额 . 您可以指定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,请查看此文档 . page_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上注册的网站(与移动广告相比) .

相关问题