Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

15 Commits

Folders and files

NameName
Last commit message
Last commit date

Repository files navigation

Facebook广告投放自动化需求1.0(阿童木)

目录

[TOC]

项目概述

需求背景

在日常的投放中发现并Facebook的人确认过后,确定在FB投放的每个广告和素材都能拿到一定的基础展示,所以想用自动化的手段来增加素材、广告的数量级,目的是增加投放展示。

Facebook 营销API中提供了很多接口可以解决目前投放中遇到的问题(如批量创建、数据管理等)、提高投放的效率(自动投放),所以需要一个后台系统来调用API。

项目目标

成本可控的情况下,通过自动化提高广告投放的数量,获得更多的展示

规划和进度

系统规划

整体逻辑1

整体逻辑2

  • 投放自动化流程
  1. 多渠道素材采集
  2. 批量创建广告
  3. 根据情况、算法实时调整出价
  4. 数据管理、查看投放效果

进度

  • 第一期:(8月初上线)

新主题盲测批量创建

目前进度:开发中,前端已完成,后端未开始

  • 第二期:(8月中旬)

新主题自动化投放,应用rule,接入商业LTV数据,数据查看

目前进度:正在整理规则,商业LTV数据接口需求已提

  • 第二期:(8月底)

接入CM design接口、图片拼接

素材生产自动化,扩大素材数量级

目前进度:—

功能需求

创建

批量创建(一期功能)

功能背景

1.提高投放效率

因为Launcher是以主题为单位来进行投放的,每周都会有新主题进行投放。而在一个新主题的投放工作里,最为繁琐重复的就是创建广告功能。所以需要批量上传工具来提升运营投放效率。

2.跑通自动化投放流程

投放自动化需求中,最基本的需求就是利用API进行广告的创建,后期会有各种不同场景的自动创建广告需求,所以首先需要验证的就是创建功能。

  • 解决思路

在Ad这一级,通过选择素材的数量直接决定广告的数量,减去Ad这一级之后,需要提供信息就只有Campaign和Adset层级。而投放信息通过将部分字段写死,另外一部分字段通过模板复用,从而减少了投放信息的维护。

流程图

整体流程

原型图

原型图在需求文档根目录中

前端需求

1.批量创建功能界面

2.素材库

3.账号、应用维护界面

后端需求

1.创建广告接口

后端接收到来自前端的json请求后解析,将信息分为四类(Campaign,Adset,Ad,Adcreative),并且按照顺序上传创建广告。

预留点

  • 能接收创建各层级(Campaign到Adcreative层级)的单独创建请求的接口。
  • 能向已有的Campaign中创建广告组、广告(如果前端返回了Campaign id这个字段,就在对应的Campaign中创建。

2.素材库的建立;前端上传完素材后,需要将素材上传到Facebook服务器,并将返回的素材id和文件一一对应。

预留点

  • 这次的素材库只有一级结构,是通过文件名前缀的来实现二级结构的,之后可能会增加素材库的层级。

3.拉取广告账户、应用列表的接口

预留点

  • BM平台的Admin权限下来之后,广告账户和应用的拉取,将实时通过Facebook API来完成
  • 这个功能放在最后做,这两周之内我会尽量申请到权限

4.测试广告账户、应用是否有关联的接口

预留点

  • 关联关系可能会在之后的拉取数据功能中用到,所以需要找个地方存起来。

5.投放信息模板拉取

基本信息

维护上传所需的基本信息。

选择广告账户、应用

选择本次创建要使用的广告账户,以及关联的应用。

选择广告账户,选择账户后后端返回与广告账户关联的应用。

创建名称

由运营创建时手动输入,作为正式上传名称的一部分字符串,后面选择投放信息应用模板时在前端合成正式名称。

合成规则在【名称组成规则】中详叙。

投放信息

投放信息以模板形式上传,运营在在前端填写完模板后,储存在后端,每个用户的模板是独立储存的。

每次批量创建都可以选择之前填写的模板,需要前端提供一个删除模板的入口,新增模板的入口在选择模板的边上。

新建模板
  • 模板名称

手动输入模板名称

  • 新建广告系列

手动输入广告系列名称

  • 新建所属的广告组

不输入任何广告组也可以提交进入下一步。

1.手动输入信息,点击'新增广告组'则增加行。

2.通过Excel粘贴批量输入,分隔符为\t

  • 显示信息

显示已创建的广告系列和对应的广告

模板结构

新建模板后,以如下结构的json储存在前端。

模板结构

字段对应关系

模板中的字段需要转换后放在给后端的json中,转换关系如下:

模板中字段名称对应给后端的字段处理方法
广告系列名称Campaign_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
广告组名称AdSet_name模板中的名称只是作为合成上传名称的部分字符串,和其他名称一起组成上传的名称
国家AdSet_targeting:countries单选的国家按照附1【国家-国家代码对应关系】转换后上传即可,单选'全球'则;多选的国家需要用英文逗号拆分后转换为国家代码加入 country_groups中
出价AdSet_bid_amount传入即可
单日预算AdSet.Field_daily_budget需要将数值转换后传入,例:10转换为1000
加速状态AdSet.Field_pacing_type加速:no_pacing 匀速:standard
名称组成规则

正式用API上传的名称,是由运营填写/选择的字段拼接而成的,拼接规则如下。

名称组成规则对应字段
广告系列名称关联应用名称+创建名称+模板中的广告系列名称Campaign.name
广告组名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称AdSet.Field.name
广告名称关联应用名称+创建名称+模板中的广告系列名称+模板中广告组名称+关联素材文件编号Ad.name

广告系列、广告组名称创建示例

  • 关联应用名称为:3D cute cat
  • 创建名称为:盲测
  • 模板中的广告系列名为:一类国家
  • 模板中的广告组名为:美国

则正式上传的广告系列名称为 3D cute cat 盲测 一类国家

广告组名称为3D cute cat 盲测 一类国家 美国


广告名称=广告组名称+文案标号+视频文件名+封面图编号+图片编号

广告名称创建示例

  • 广告组名称为3D cute cat 盲测 一类国家 美国
  • 关联的素材为:

标题:3D cute cat 文案1(T1):**** 视频1:竖版.mp4(文件名) + 封面图1(C1) 视频2:横版.mp4(文件名) + 封面图2(C2)

则这个广告组下产生的4个广告(更详细的广告创建规则参考【广告创建规则】,这里只解释名称创建规则)分别名为:

  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 竖版 C2
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C1
  • 3D cute cat 盲测 一类国家 美国 T1 横版 C2
审核规则

模板中的信息需要审核后再储存,审核规则如下。

模板中字段名称对应投放信息字段审核规则
广告系列名称Campaign.name不用审核
广告组名称AdSet.Field.name不用审核
国家AdSet.Field.targeting:countries检查中文国家名称是否在【国家-国家代码对应关系】中,多选国家需要拆开后检查
出价AdSet.bid_amount出价<=2
单日预算AdSet.Field.daily_budget单日预算>0
加速状态AdSet.Field.pacing_type只能为:''匀速'' 或 ''加速''
国家代码转换规则

在需求文档-附录-国家代码转换规则里,需求文档同目录里有csv版本。

素材选择

通过选择素材的数量,直接在选定的广告组下创建对应数量的广告。

选择方式
  • 通过广告系列选择

选择一个广告系列则是选中了其所属的所有广告组,下拉列表框,可以多选,可以全选。

  • 通过广告组选择

广告组选择,下拉列表框,可以多选,可以全选。

关联素材

标题、文案需要每次关联时输入,都只支持单个,不支持一次关联多个标题、文案。

有三种素材关联方式:

这三种方式互斥,只能单选,不能多选。

被选择的图片、视频、封面图需要从后端拉取,图片、封面图需要拉取缩略图和文件名;视频最好可以拉取首帧和文件名,实现难度大的话拉取文件名即可。

  • 选择图片
  • 选择视频
  • 选择视频+封面图

关联完成后,将对应的素材编号(不是文件名,是素材对应的Facebook素材编号!)传入json中。

广告创建规则
  • 选择图片

可单选可多选,选择几张图片则在选定的广告组创建几个广告。

创建数量 = 图片数量

  • 选择视频

可单选可多选,选择几张视频则在选定的广告组创建几个广告。

创建数量 = 视频数量

  • 选择视频+封面图

视频、封面图都是必选,选择后创建视频、封面图排列组合的广告。

创建数量 = 视频数量*封面图数量

例:

选择了视频1、视频2

封面图1、封面图2

则在对应的广告组下创建:

视频1-封面图1

视频1-封面图2

视频2-封面图1

视频2-封面图2

广告账户、应用列表
  • 上传广告账户、应用流程图

账号上传逻辑

  • 原型图

原型图在需求文档根目录中

  • 流程

1.运营维护广告账号、应用编号、应用密钥,点击提交

2.提交后前端发送给后端,后端接收到使用应用和密钥组成的app token,发送一个创建Campaign的请求,创建成功后返回Campaign ID,用此ID创建一个Adset,创建成功则意味着广告账户和应用有关联。将这个关联关系储存进广告账户、应用列表;如果创建失败,直接前端返回失败提示:“错误!此广告账户和应用没有关联!”

3.运营批量创建广告,填写基本信息的时候选择账号,选择完应用后,后端返回与这个账号关联的应用列表给运营选择。

  • 需要预留的点

广告账户、应用的列表可以通过Facebook Bussiness Manager平台的API拉取,关联关系不清楚能不能拉取,这个BM平台目前只有user权限,user权限只能拉取列表,不能新增账号、应用,所以一期选择用手动维护的方式。能够新增账号、应用的Admin权限正在申请中,所以需要给这个自动拉取功能预留空间。

前后端交互
流程图

后端流程图

json结构

json

json字段表
层级字段名称(key)字段值(value)字段类型
1AD_ACCOUNT_ID账号编号string
1APP_ID应用编号int
1Campaign_infoCampaign信息构成的字典dict
2生成的Campaign名称对应Campaign信息构成的字典dict
3Adset_infoAdset信息构成的字典dict
4生成的Adset名称对应Adset信息构成的字典dict
5AdSet_bid_amount对应广告组的出价float
5AdSet_daily_budget对应广告组的单日预算int
5AdSet_pacing_type对应广告组的加速状态string
5AdSet_targeting:country对应广告组的目标国家(单选国家情况)string
5AdSet_targeting:countries对应广告组的目标国家(多选国家情况)list
5AdSet_targeting:rule自定义受众:除了安装关联应用的受众string
5Ad_infoAd信息构成的字典dict
6生成的Ad名称对应Ad信息构成的字典dict
7Ad_title运营填写的标题(会有多语言)string
7Ad_text运营填写的文案(会有多语言)string
7Ad_image_idFacebook素材库中的图片编号string
7Ad_video_idFacebook素材库中的视频编号string
7Ad_cover_idFacebook素材库中的封面图编号string
7Ad_app_link关联应用的Google play链接string
json示例

在需求文档根目录中。

上传所需接口、参考文档
层级说明上传顺序上传说明接口参考文档地址
Campaign广告系列2创建后,返回Campaign IDfacebookads.adobjects.adaccount.AdAccountcreate_campaignCampaign
Adset广告组3使用返回的Campaign ID创建Adsetfacebookads.adobjects.adset.AdSetadset.updateAd set
Ad广告4使用返回的Ad set ID和广告创意创建Adsetfacebookads.adobjects.adaccount.AdAccountcreate_adAd
Adcreative广告创意(素材)1会从后端收到素材id,使用素材id创建广告创意facebookads.adobjects.adaccount.AdAccountcreate_ad_creativeAd creative
创建所需字段处理方法

这里是我看参考文档总结出来的创建所需字段,可能会缺,要是缺了啥随时问我。

创建层级所需字段含义字段来源参考文档
广告系列(Campaign)Campaign.name广告系列名称前端
Campaign.objective营销目标默认为:应用安装量
Campaign.status广告系列状态批量上传时为Pause,所有上传完成后Active
广告组(Adset)AdSet.Field.name广告组名称前端
AdSet.Field.campaign_id广告系列编号自动连线,创建Campaign时获取
AdSet.Field.daily_budget单日预算前端
AdSet.Field.billing_event计费方式默认为:impression
AdSet.Field.optimization_goal优化目标默认为:应用安装量
AdSet.Field.bid_amount出价前端
AdSet.Field.start_time开始时间自动取上传当天的日期
AdSet.Field结束时间默认为:长期
AdSet.Field.pacing_type加速状态前端
AdSet.Field.targeting:rule目标受众中的自定义受众默认为:除了安装关联应用的受众创建自定义受众参考文档
AdSet.Field.targeting:genders目标受众中的性别默认为:不限
AdSet.Field.targeting:countries目标受众中的国家前端(需要区分单选和多选的情况)
AdSet.Field.targeting:age_min目标受众中的年龄(最小年龄)默认为:18
AdSet.Field.targeting:age_max目标受众中的年龄(最大年龄)默认为:65
广告(Ad)Ad.name广告名称前端
adset_id广告组编号自动连线,创建广告组时获取
creative-id广告创意自动连线,创建广告创意时获取
广告创意(Adcreative)creative广告创意前端
AdCreativeLinkData.Field.link素材 - app link前端
AdCreativeLinkData.Field.caption素材 - 图片标题前端(这个字段是不是标题需要确认一下)
AdCreativeLinkData.Field.message素材 - 图片文案前端
AdCreativeLinkData.Field.image_hash素材 - 图片前端
AdCreativeVideoData.Field.video_id素材 - 视频前端
AdCreativeVideoData.Field.image_url素材 - 封面图前端
AdCreativeVideoData.Field.description素材 - 视频文案前端
call_to_action:type素材 - 行动号召默认为:INSTALL_MOBILE_APP
call_to_action:value:link素材 - 行动号召默认为:app link
call_to_action:value:link_title素材 - 视频标题
素材素材id前端

素材库(一期功能)

需求背景

1.批量创建功能需要提前上传素材到Facebook服务器,减少单次创建的信息量。

2.不同应用之中会有素材需要复用的情况,需要将上传过的素材储存起来。

3.后期的自动化需求通过其他接口产生素材,需要一个素材库将创建功能和素材接口连接起来。

流程图

素材库逻辑

原型图

原型图在需求文档根目录中。

素材上传&使用
本地上传

选择应用、类型之后上传,上传时在文件名前加上类型的前缀。

类型前缀
图片Photo_
视频Video_
封面图Cover_

例:

上传的本地文件名:1.jpg

储存在服务器上的文件名:Photo_1.jpg

上传到Facebook服务器

运营上传素材后,将素材上传到Facebook服务器,获得素材id,将文件和素材id一一对应。

素材使用

当选择定好关联方式时,调出素材库选择界面,只需要展示对应的类型。(关联方式选择图片时,默认拉取当前选择应用的图片,同时界面上也有选择其他应用的选项,但是不能选择其他的类型)

当选择素材时,展示文件缩略图和文件名,按照时间倒序排列(新上传的在前)。

当运营选定素材后,后端不用给前端文件,只要给前端文件对应的素材id。

前端将素材id写进创建信息json中,传回后端。

素材库管理

第一期暂时只将素材库做成一级的结构,第二级的结构是通过文件名命名规则来实现的。

只有上传的入口,没有删查减的入口。

素材库结构

  • 第一级

以应用名来区分的文件夹

  • 第二级

以文件名来区分(图片、视频、封面图)的文件

投放

数据查看

功能背景
  1. 因为Facebook政策限制,一个账号下的投放应用是有限的,所以创建了很多账号。同一个应用,可能投放的数据分布在各个账号中,查看数据的时候十分不方便,需要有一个统一的数据查看平台。
  2. 基于之后的投放自动化的需求,需要将数据拉取下来之后根据算法计算评分,然后根据评分做出出价、预算等变动。所以需要一个数据查看平台。
查看数据
  • 选择应用
  • 选择查看时间段
  • 选择查看维度(广告系列、广告组、广告)
  • 查看细分数据(国家、版位等)

选择完成后选择点击应用按钮,则从服务器调取相应的数据。

数据筛选、排序
  • 数据筛选

    可以对每一个数值列进行区间筛选(规定展示的最小值和最大值区间)

  • 数据排序

    单击列名可以对该列进行排序

原型图

原型图在需求文档同目录中

投放规则

广告规则是在广告规则库中创建和存储的独立对象,至少包含一个 name、一个 evaluation_spec 和一个 execution_spec。规则的基本架构如下所示:

curl \
-F 'name=Rule 1' \
-F 'evaluation_spec={
...
}' \
-F 'execution_spec={
...
}' \
-F "access_token=<ACCESS_TOKEN>" \
https://graph.facebook.com/<VERSION>/<AD_ACCOUNT_ID>/adrules_library

Facebook 会在成效分析指标或对象元数据字段出现变化时评估实时触发规则,根据设置的时间间隔评估定期触发规则。

流程图

投放规则逻辑

内容源

CM Design平台接口接入

非功能需求

账号管理

1.0暂时先手动维护FB账号和token,后续拿到商务管理平台的admin token后会改成通过API拉取。

账号上传

需要一个账号上传、维护界面

原型图

原型图在需求文档同目录下

附录

国家代码转换规则

国家代码
阿尔巴尼亚AL
阿尔及利亚DZ
阿根廷AR
阿拉伯联合酋长国AE
阿鲁巴AW
阿曼OM
阿塞拜疆AZ
埃及EG
爱尔兰IE
爱沙尼亚EE
安哥拉AO
奥地利AT
澳大利亚AU
巴布亚新几内亚PG
巴哈马BS
巴基斯坦PK
巴拉圭PY
巴拿马PA
巴西BR
白俄罗斯BY
保加利亚BG
比利时BE
冰岛IS
波多黎各PR
波兰PL
波斯尼亚和黑塞哥维那BA
玻利维亚BO
伯利兹BZ
博茨瓦纳BW
布基纳法索BF
丹麦DK
德国DE
多哥TG
俄罗斯RU
厄瓜多尔EC
法国FR
菲律宾PH
芬兰FI
佛得角CV
哥伦比亚CO
哥斯达黎加CR
海地HT
韩国KR
荷兰NL
洪都拉斯HN
几内亚比绍GW
加拿大CA
加纳GH
加蓬GA
柬埔寨KH
捷克CZ
津巴布韦ZW
喀麦隆CM
卡塔尔QA
科威特KW
克罗地亚HR
肯尼亚KE
拉脱维亚LV
老挝LA
黎巴嫩LB
立陶宛LT
卢森堡LU
罗马尼亚RO
马耳他MT
马来西亚MY
马里ML
马其顿MK
毛里求斯MU
美国US
孟加拉国BD
秘鲁PE
缅甸MM
摩尔多瓦MD
摩洛哥MA
莫桑比克MZ
墨西哥MX
纳米比亚NA
南非ZA
尼泊尔NP
尼加拉瓜NI
尼日尔NE
尼日利亚NG
挪威NO
葡萄牙PT
日本JP
瑞典SE
瑞士CH
萨尔瓦多SV
塞内加尔SN
塞浦路斯CY
沙特阿拉伯SA
斯里兰卡LK
斯洛伐克SK
斯洛文尼亚SI
塔吉克斯坦TJ
台湾TW
泰国TH
坦桑尼亚TZ
特立尼达和多巴哥TT
突尼斯TN
土耳其TR
土库曼斯坦TM
危地马拉GT
委内瑞拉VE
乌干达UG
乌克兰UA
乌拉圭UY
乌兹别克斯坦UZ
西班牙ES
希腊GR
香港HK
新加坡SG
新西兰NZ
匈牙利HU
牙买加JM
亚美尼亚AM
也门YE
伊拉克IQ
伊朗IR
以色列IL
意大利IT
印度IN
印尼ID
英国UK
约旦JO
越南VN
赞比亚ZM
智利CL
中国CN

账号&Token信息

账号信息

不放在这,问我要

应用信息

Token

Facebook平台token架构

long_live_token_generate

生成长期Token
  1. Short-lived access

obtained via login dialog. 2. Start with a short-lived token generated on a client and ship it back to your server. 3. Use the user token, your app ID and app secret to make the following call from your server to Facebook's servers:

GET /oauth/access_token? grant_type=fb_exchange_token& client_id={app-id}&
client_secret={app-secret}&
fb_exchange_token={short-lived-token} 

参考文档

Business Manager平台

bm_token

目前我们有的是BM平台System user级别的权限,可以用来拉取关联项目下的账号、应用列表,出于安全原因不写在这,需要的话找我要。

Admin权限的token正在协调申请中,申请好了之后可以通过Admin access token完成新应用、账号关联等操作。

BM平台管理参考文档

新增账户

如果您以“管理员”身份管理商务管理平台以外的广告帐户,可以为平台认领这些帐户。这是一次性程序。您认领广告帐户后,只能在商务管理平台管理这些广告帐户。

如要为平台认领广告帐户,请提供格式为 act_### 的广告帐户编号。发送 POST 请求:

curl \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

如果您是广告帐户的管理员,我们会立即批准此认领请求。Facebook 会返回设为 CONFIRMEDaccess_status

如果您是对广告帐户没有适当权限的用户,我们会向广告帐户管理员发送所有权请求。在我们发送该请求后,响应会包含设置为 PENDINGaccess_status

要接受所有权请求,您必须是广告帐户管理员,而且应在广告管理工具中登录并接受请求。

查看自有帐户

您可以通过 GET 调用查看商务管理平台可访问的所有广告帐户:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_ad_accounts"

这会返回商务管理平台拥有的所有广告帐户。有些字段会特别指明平台与广告帐户之间的关系。

移除帐户

如果您的商务管理平台是 OWNER,且广告帐户为 CONFIRMED 状态,则您不能从平台删除广告帐户。如果您具有处于 PENDING 状态的访问请求,或具有对广告帐户的 AGENCY 访问权限,则可以发出以下 DELETE 调用:

curl \
-X DELETE \
-F "adaccount_id=act_<AD_ACCOUNT_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/ad_accounts"
查看帐户访问权限

如要查看某个用户对某个广告帐户拥有的权限,请发出以下 GET 调用:

curl -G \
-d "access_token=ACCESS_TOKEN" \
"https://graph.facebook.com/act_AD_ACCOUNT_ID/assigned_users"
查看商务管理平台拥有的应用

如要查看商务管理平台拥有的所有应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/owned_apps"

这会返回一列与商务管理平台关联的应用。

如要查看平台有权访问的所有客户应用程序,或您已请求访问但等待批准的客户应用程序:

curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/client_apps"
curl -G \
-d "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/pending_client_apps"

响应包含 permitted_roles。这是您可为该特定广告帐户分配的一组身份。

从商务管理平台中移除应用

如要从商务管理平台中移除某个应用,请发出以下 DELETE 调用:

curl \
-X DELETE \
-F "app_id=<APP_ID>" \
-F "access_token=<ACCESS_TOKEN>" \
"https://graph.facebook.com/<API_VERSION>/<BUSINESS_ID>/apps"

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages