python操作FacebookSDK以及字段说明
python操作fb sdk及字段说明
Based
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.campaign import Campaign
from facebook_business.adobjects.adset import AdSet
from facebook_business.adobjects.ad import Ad
# app_id/app_secret/access_token都是公司的账户
app_id = '<app_id>'
app_secret = '<app_secret>'
access_token = '<access_token>'
##### 必须先初始化这个API才能进行后续的操作
FacebookAdsApi.init(access_token=access_token)
广告账户ADAccount
## AdAccount —— 账户
my_account = AdAccount("act_833354897051966") # 公司帐户
## 0、账户信息
ret = my_account.api_get(fields=[
AdAccount.Field.account_id,
AdAccount.Field.id,
AdAccount.Field.business,
])
print("ret>>>>>",ret)
"""
<AdAccount> {
"account_id": "833354897051966",
"business": {
"id": "219781441994805",
"name": "\u5317\u4eac\u9f99\u521b\u60a6\u52a8\u7f51\u7edc\u79d1\u6280\u6709\u9650\u516c\u53f8-Last Shelter"
},
"id": "act_833354897051966"
}
"""
## 1、返回与此帐户关联的活动迭代程序
activities = my_account.get_activities()
print("activities>>>>",activities)
"""
[<AdActivity> {
"event_time": "2020-07-01T07:52:58+0000",
"event_type": "update_campaign_run_status"
},...]
"""
## 2、返回与这个账户关联的广告系列 ———— 指定fields与params *****
# 需要展示的字段
fields=[
Campaign.Field.account_id,
Campaign.Field.id,
Campaign.Field.name,
Campaign.Field.effective_status,
]
# 匹配的字段
params ={
# "effective_status": "PAUSED", # 可以查单个
"effective_status": ["ARCHIVED","PAUSED"], # 也可以多个查
}
campaigns = my_account.get_campaigns(
fields=fields,
params=params
)
print("campaigns>>>>>",campaigns)
"""
[<Campaign> {
"account_id": "833354897051966",
"effective_status": "ARCHIVED",
"id": "23843328891720320",
"name": "MM|-AN_Part1-06 0321@",
"start_time": "1970-01-01T07:59:59+0800"
}, <Campaign> {
"account_id": "833354897051966",
"effective_status": "ARCHIVED",
"id": "23843082487760320",
"name": "1",
"start_time": "1970-01-01T07:59:59+0800"
}, <Campaign> {
"account_id": "833354897051966",
"effective_status": "ARCHIVED",
"id": "23843082486220320",
"name": "1",
"start_time": "1970-01-01T07:59:59+0800"
}, <Campaign> {
"account_id": "833354897051966",
"effective_status": "ARCHIVED",
"id": "23843082483080320",
"name": "1",
"start_time": "1970-01-01T07:59:59+0800"
}, <Campaign> {
"account_id": "833354897051966",
"effective_status": "ARCHIVED",
"id": "23842993254780320",
"name": "MM|-AN_Part2-06-1011 jp\u5c0f\u8bd5",
"start_time": "1970-01-01T07:59:59+0800"
}]
"""
## 3、返回与此帐户关联的 AdSet 的迭代程序
ad_sets = my_account.get_ad_sets(fields=[
AdSet.Field.name,
AdSet.Field.id,
])
print("ad_sets>>>>",ad_sets)
"""
[<AdSet> {
"id": "23844923356130320",
"name": "test2222"
}, <AdSet> {
"id": "23844889356080320",
"name": "test1"
},...]
"""
## 4、返回与此帐户关联的 AdUser 的迭代程序
users = my_account.get_users()
print(users)
"""
[<AdAccountUser> {
"id": "100052331796930",
"name": "Gong Tricker",
"permissions": [
2,
3,
4,
7
],
"role": 1002,
"tasks": [
"DRAFT",
"ANALYZE",
"ADVERTISE"
]
},...]
"""
## 5、返回与此帐户关联的广告的迭代程序
ads = my_account.get_ads(fields=[
Ad.Field.name,
Ad.Field.id,
Ad.Field.configured_status,
Ad.Field.creative,
])
print(ads)
"""
[<Ad> {
"configured_status": "ACTIVE",
"creative": {
"id": "23843876675920320"
},
"id": "23843876746830320",
"name": "LS_video_09_21_\u56de\u5fc6+\u57f9\u517b\u76bf\u4e27\u5c38\u6539\u9020\u4e0a_1x1_\u5218\u4e00\u9e23_\u675c\u5146\u798f_\u5218\u82ae\u540d_\u6881\u5efa_\u5434\u8212\u840c"
# },...]
广告系列Campaign
##### Campaign —— 广告系列
campaign = Campaign("23844888259420320") # 公司帐户
## 0、创建compaign
## 注意:api_cerated is being deprecated
## 创建campaign需要使用ADAccount中的create_campaign方法,需要传入account_id
from facebook_business.adobjects.adaccount import AdAccount
ad_account = AdAccount("<my_account_id>")
params = {
"name": 'SK-TEST-2020-0610',
'objective': 'APP_INSTALLS',
# 'status': 'PAUSED',
"buying_type": "AUCTION",
# "daily_budget": 200,
# 'special_ad_categories': [],
# "bid_strategy": "COST_CAP",
}
ret = ad_account.create_campaign(params=params)
return ret # 返回一个字典 —— 新建的这个campaign的id
"""
<Campaign> {
"id": "xxxxx"
}
"""
## 1、获取campaign的信息
ret = campaign.api_get(fields=[
Campaign.Field.id, # 本campaign的id
campaign.Field.name, # 本campaign的名称
Campaign.Field.adlabels, # 广告标签
Campaign.Field.account_id, # 所属的账户的账户id
Campaign.Field.status, # 当前状态 enum{ACTIVE, PAUSED, DELETED, ARCHIVED}
Campaign.Field.configured_status, # 编辑状态 ???
Campaign.Field.effective_status, # 有效状态 ???
Campaign.Field.bid_strategy, # 投标策略 enum{LOWEST_COST_WITHOUT_CAP, LOWEST_COST_WITH_BID_CAP, TARGET_COST, COST_CAP}
Campaign.Field.buying_type, # 购买类型
Campaign.Field.daily_budget, # 每日预算
Campaign.Field.special_ad_categories, # 特殊广告类别
Campaign.Field.start_time,
Campaign.Field.stop_time,
Campaign.Field.updated_time,
Campaign.Field.objective, # 目标 enum{APP_INSTALLS, BRAND_AWARENESS, CONVERSIONS, EVENT_RESPONSES, LEAD_GENERATION, LINK_CLICKS,# LOCAL_AWARENESS, MESSAGES, OFFER_CLAIMS, PAGE_LIKES, POST_ENGAGEMENT, PRODUCT_CATALOG_SALES, REACH, STORE_VISITS, VIDEO_VIEWS}
])
print("ret>>>>>>", ret)
"""
<Campaign> {
"account_id": "833354897051966",
"bid_strategy": "COST_CAP",
"buying_type": "AUCTION",
"configured_status": "PAUSED",
"daily_budget": "300",
"effective_status": "PAUSED",
"id": "23844888259420320",
"name": "SK-TEST666-2020-0703",
"objective": "APP_INSTALLS",
"special_ad_categories": [],
"start_time": "2020-06-09T16:04:03+0800",
"status": "PAUSED",
"updated_time": "2020-07-03T14:56:04+0800"
"status": "PAUSED"
}
"""
## 2、修改campaign的信息 —— 指定params参数
campaign.api_update(
fields=[],
params={
Campaign.Field.name:"SK-TEST666-2020-0703",
}
)
ret2 = campaign.api_get(fields=[
Campaign.Field.id,
Campaign.Field.account_id,
Campaign.Field.buying_type,
Campaign.Field.name,
])
print("ret2>>>",ret2)
"""
<Campaign> {
"account_id": "833354897051966",
"buying_type": "AUCTION",
"id": "23844888259420320",
"name": "SK-TEST666-2020-0703"
}
"""
## 3、关联的广告集 ***
# 需要展示的字段
fields=[
AdSet.Field.id, # 本campaign的id
AdSet.Field.name, # 本campaign的名称
AdSet.Field.adlabels, # 广告标签
AdSet.Field.account_id, # 所属的账户的账户id
AdSet.Field.status, # 当前状态 enum{ACTIVE, PAUSED, DELETED, ARCHIVED}
AdSet.Field.configured_status,
AdSet.Field.effective_status, # 有效状态
]
# 匹配的字段
params ={
# "effective_status": "PAUSED", # 可以查单个
"effective_status": ["PAUSED","ARCHIVED"], # 也可以多个查
}
ret = campaign.get_ad_sets(fields=fields,params=params)
print("ret>>>>>>", ret)
"""
[<AdSet> {
"account_id": "833354897051966",
"configured_status": "PAUSED",
"effective_status": "PAUSED",
"id": "23844923356130320",
"name": "test2222",
"status": "PAUSED"
}, <AdSet> {
"account_id": "833354897051966",
"configured_status": "PAUSED",
"effective_status": "PAUSED",
"id": "23844889356080320",
"name": "test1",
"status": "PAUSED"
}]
"""
## 4、关联的广告
ads = campaign.get_ads(fields=[
Ad.Field.account_id,
Ad.Field.name,
Ad.Field.configured_status,
Ad.Field.creative,
])
print("ads>>>>>>",ads)
# []
## 删除
# campaign.api_delete()
广告组AdSet
##### AdSet —— 广告组
adset = AdSet('23844923356130320')
## 1、这个广告组的信息
ret = adset.api_get(fields=[
AdSet.Field.account_id,
AdSet.Field.adlabels,
AdSet.Field.id,
AdSet.Field.campaign,
])
print(ret["id"]) # 23844923356130320 可以直接用字典方式取值
print("ret>>>>>",ret,type(ret))
"""
<AdSet> {
"account_id": "833354897051966",
"campaign": {
"id": "23844888259420320"
},
"id": "23844923356130320"
} <class 'facebook_business.adobjects.adset.AdSet'>
"""
## 2、这个广告组关联的广告
ads = adset.get_ads()
print("ads>>>>>",ads)
# []
## 3、修改某个广告组的信息 —— api_update
adset = AdSet('23844923356130320')
params = dict(
name="test678",
)
ret = adset.api_update(
params=params,
)
print(ret)
"""
<AdSet> {
"id": "23844923356130320"
}
"""
result = adset.api_get(
fields=[
AdSet.Field.name,
AdSet.Field.id,
]
)
print(result)
"""
<AdSet> {
"id": "23844923356130320",
"name": "test678"
}
"""
广告组的创建以及捕获异常的操作
使用AdAccount创建AdSet以及捕获异常
创建时用到的参数:
params2 = {
'name': 'My First AdSet',
'lifetime_budget': '20000',
# 'start_time': '2019-12-12T23:41:41-0800',
# 'end_time': '2019-12-19T23:41:41-0800',
'campaign_id': '23844888259420320',
'bid_amount': '500',
'billing_event': 'IMPRESSIONS',
'optimization_goal': 'POST_ENGAGEMENT',
'promoted_object'={'application_id': '123385965003980', 'object_store_url': 'http://play.google.com/store/apps/details?id=com.more.dayzsurvival.gp'},
'targeting': {'age_min': 20, 'age_max': 24, 'behaviors': [{'id': '6002714895372', 'name': 'All travelers'}],
'genders': [1],
'geo_locations': {'countries': ['US'], 'regions': [{'key': '4081'}],
'cities': [{'key': '777934', 'radius': 10, 'distance_unit': 'mile'}]
},
'interests': [{'id': '<adsInterestID>', 'name': '<adsInterestName>'}],
'life_events': [{'id': '6002714398172', 'name': 'Newlywed (1 year)'}],
'facebook_positions': ['feed'],
'publisher_platforms': ['facebook', 'audience_network']
},
'status': 'PAUSED',
}
具体代码
from facebook_business import exceptions # SDK自带的异常
from facebook_business.adobjects.adaccount import AdAccount
## 0、创建ad_set ———— 必传:name、account_id、campaign_ids、billing_event、targeting、bid_amount
## 注意源码中的:api_cerated is being deprecated
## 创建ad_set需要使用ADAccount中的create_ad_set方法,需要传入account_id
my_account = AdAccount("act_833354897051966") # 公司帐户
params = dict(
name="test_adset123",
status="PAUSED",
bid_amount='21',
campaign_id="23844888259420320",
billing_event='IMPRESSIONS',
promoted_object={'application_id': '123385965003980', 'object_store_url': 'http://play.google.com/store/apps/details?id=com.more.dayzsurvival.gp'},
targeting={'device_platforms': ['mobile'], 'facebook_positions': ['feed'],
'geo_locations': {'countries': ['US']}, 'publisher_platforms': ['facebook', 'audience_network'],
'user_os': ['Android']},
)
try:
res = my_account.create_ad_set(params=params)
print("res>>>>", res) # 返回这个ad_set的id
"""
<AdSet> {
"id": "23845079496040320"
}
"""
except exceptions.FacebookRequestError as e:
# print(type(e))
print(e.api_error_message())
print(e.api_blame_field_specs())
print(e.api_error_code())
print(e.api_error_subcode())
print(e.api_error_type())
print(e.api_transient_error())
print(e.body()) # error下面的message比较有用
"""
dic = {'error': {'message': '(#1815161) Missing field billing_event in the spec', 'type': 'OAuthException',
'code': 1815161, 'fbtrace_id': 'AmW_hGcwJ54kj3Dc92i4fPB'},
'__fb_trace_id__': 'D3HuWPmT1e0',
'__www_request_id__': 'AmW_hGcwJ54kj3Dc92i4fPB'}
"""
print(type(e.body())) # dict
验证创建的结果
# 使用刚刚建好的adset的id
adset = AdSet('23845079496040320')
ret = adset.api_get(fields=[
AdSet.Field.account_id,
AdSet.Field.id,
AdSet.Field.campaign_id,
AdSet.Field.name,
AdSet.Field.status,
AdSet.Field.created_time,
AdSet.Field.billing_event,
AdSet.Field.promoted_object,
AdSet.Field.targeting,
])
print(ret["id"])
print("ret>>>>>",ret)
"""
23845079496040320
ret>>>>> <AdSet> {
"account_id": "833354897051966",
"billing_event": "IMPRESSIONS",
"campaign_id": "23844888259420320",
"created_time": "2020-07-07T18:39:18+0800",
"id": "23845079496040320",
"name": "test_adset123",
"promoted_object": {
"application_id": "123385965003980",
"object_store_url": "http://play.google.com/store/apps/details?id=com.more.dayzsurvival.gp"
},
"status": "PAUSED",
"targeting": {
"age_max": 65,
"age_min": 18,
"app_install_state": "not_installed",
"device_platforms": [
"mobile"
],
"facebook_positions": [
"feed"
],
"geo_locations": {
"countries": [
"US"
],
"location_types": [
"home"
]
},
"publisher_platforms": [
"facebook",
"audience_network"
],
"user_os": [
"Android"
]
}
}
"""
账户api获取超过25个结果的方法
在params参数中指定limit即可
my_account = AdAccount("act_833354897051966") # 公司帐户
# 现在这个账户下的ad_set的数量
ret2 = my_account.get_ad_sets(
fields=[
AdSet.Field.id,
AdSet.Field.name,
AdSet.Field.account_id,
AdSet.Field.campaign_id,
],
# 指定limit *************************
params={
"limit":"1000",
}
)
# print("ad_sets2>>>>>>",ret2)
print("length_of_ad_sets2>>>>>>",len(ret2)) # 417
广告Ad
待补充...
字段说明
广告账号 ADAccount
字段位置:facebook_business.adobjects.adaccount.AdAccount.Field
"id": "act_833354897051966",
"account_id": "833354897051966" ,
"business",
"name": , # 这里的那么全部显示的是二进制码???
.etc
广告系列 Campaign
字段位置:facebook_business.adobjects.campaign.Campaign.Field
参考文档:Campaign参考文档
| 参数名 | 类型 | 说明 |
|---|---|---|
| id | string | campaign_id |
| name | String | 名称 |
| adlabels | list<AdLabel> | 广告标签 |
| account_id | string | 所属账号id |
| status | Status | 状态 enum |
| bid_strategy | bid_strategy_enum | 投标策略 enum |
| buying_type | string | 购买类型 |
| daily_budget | 每日预算 | 每日预算 |
| special_ad_categories | list<string> | 特殊广告类别 |
| start_time | datetime | 开始日期 |
| stop_time | datetime | 结束日期 |
| updated_time | datetime | 修改日期 |
| objective | string | 目标 enum |
广告组AdSet
字段位置:facebook_business.adobjects.adset.AdSet.Field
参考文档:AdSet参考文档
| 参数名 | 类型 | 说明 |
|---|---|---|
| effective_status | EffectiveStatus | 有效状态 enum |
| status | Status | enum {ACTIVE, PAUSED, DELETED, ARCHIVED} —— 由于parent campaign这个字段可能与effective_status不同!它的值与configured_status的值一样,但主要还是用status! |
| configured_status | ConfiguredStatus | 注意常用status而不是这个! enum |
| id | string | 此adset的id |
| account_id | numeric string | 所属账号的id |
| adlabels | list<AdLabel> | 广告组关联的广告标签 |
| adset_schedule | list<DayPart> | 广告集计划(投放速率),每一天的投递计划 |
| asset_feed_id | numeric string | The ID of the asset feed that constains a content to create ads |
| attribution_spec | list<AttributionSpec> | 属性规格 |
| bid_adjustments | AdBidAdjustments | 投标调整类型与值的映射 无enum |
| bid_amount | unsigned int | 投标金额(竞价价格):这个广告集的投标上限或目标。 当没有选择自动竞价时可用,当结算事件为“展示,到达”时,bid_amount表示 价格/1000次,其它的结算事件为价格/单次 |
| bid_constraints | AdCampaignBidConstraint | 投标限制 无enum 与bid_strategy一起使用 |
| bid_info | map<string, unsigned int> | 投标的目标与值的映射 |
| bid_strategy | BidStrategy | 当使用拍卖作为购买类型(buying_type)时,此广告集的出价策略 enum |
| billing_event | BillingEvent | 计费事件 enum |
| budget_remaining | numeric string | 此广告集的剩余预算 |
| campaign | Campaign | 所属的campaign 实际拿到的是一个存放campaign的id的字典 "campaign": |
| campaign_id | numeric string | 所属的campaign的id |
| created_time | datetime | 创建日期 "2020-06-12T15:46:29+0800" 实际上是str类型的 |
| creative_sequence | list<numeric string> | 向用户展示广告组序列的顺序 |
| daily_budget | numeric string | 每日预算 |
| daily_min_spend_target | numeric string | 每日最低支出目标 必须在campaign中指定daily_budgets才能用这个字段 |
| daily_spend_cap | numeric string | 每日消费上限 必须在campaign中指定daily_budgets才能用这个字段 |
| destination_type | string | 此adset中广告的目的地 网站、应用程序和Messenger。。。 |
| end_time | datetime | 结束时间(UTC UNIX时间戳) |
| frequency_control_specs | list<AdCampaignFrequencyControlSpecs> | 此广告集的频率控制规格数组。由于当前只支持一种事件类型,因此此数组仅有一个元素。对该字段的写入仅在以REACH为目标的广告集中可用。 |
| full_funnel_exploration_mode | string | limited exploration and extended exploration |
| instagram_actor_id | numeric string | ins账户的id,用于广告,包括Ins上的动态创意广告 |
| is_dynamic_creative | bool | 是否为动态创意广告,动态创意广告只能在“广告集”下创建,且此字段设置为“真”。 |
| issues_info | list<AdCampaignIssuesInfo> | 阻止了该广告集投递的问题 |
| learning_stage_info | AdCampaignLearningStageInfo | learning 状态信息 |
| lifetime_budget | numeric string | 预算使用期限 |
| lifetime_imps | int | 注意仅适用于 buying_type是FIXED_CPM的情况 |
| lifetime_min_spend_target | numeric string | 在账户中定义的广告集的最低消费目标的期限 要使用此字段必须在campaign中指定lifetime_budget。 |
| lifetime_spend_cap | numeric string | 账户中定义的adset的spend上限的期限??要使用此字段必须在campaign中指定lifetime_budget。 |
| multi_optimization_goal_weight | string | 多优化目标权重 |
| name | string | adset名称 |
| optimization_goal | OptimizationGoal | 优化目标 具体见OptimizationGoal类中的字段 |
| optimization_sub_event | string | 优化子事件 —— 特定的optimization_goal的优化子事件,比如为TWO_SECOND_CONTINUOUS_VIDEO_VIEWS这个optimization_goal优化声音开启事件。 |
| pacing_type | list<string> | 调整类型 |
| promoted_object | AdPromotedObject | 此广告集在其所有广告中推广的对象 |
| recommendations | list<AdRecommendation> | 如果有针对此adset的建议则会包含在此字段中。否则响应中将不包含它。此字段不包括在 redownload mode中! |
| recurring_budget_semantics | bool | 如果此字段为True,则您的每日开支可能会超过您的每日预算,而您的每周开支不会超过您每日预算的7倍。更多细节在广告设置预算文件中解释。如果是False的,你每天花费的金额不会超过每日预算。此字段不适用于lifetime buddgets。 |
| review_feedback | string | feedback的评论 |
| rf_prediction_id | string | Reach and frequency prediction ID |
| source_adset | AdSet | 从中复制此广告集的源广告集 |
| start_time | datetime | 开始时间 in UTC UNIX timestamp |
| targeting | Targeting | 目标定位 |
| time_based_ad_rotation_id_blocks | list<list<int>> | |
| time_based_ad_rotation_intervals | list<unsigned int> | |
| updated_time | datetime | 更新日期 |
| use_new_app_click | bool | 如果已设置,则允许移动应用程序参与广告针对 LINK_CLICKS 进行优化 |
计费事件billing_event中的字段说明
| 字段 | 说明 |
|---|---|
| CLICKS | 当人们点击广告的任何地方时付费 |
| APP_INSTALLS | 用户安装你的应用时付费 |
| IMPRESSIONS | 当广告向人们展示时付费 |
| LINK_CLICKS | 当人们点击广告链接时付费 |
| OFFER_CLAIMS | 当人们要求出价时付款 |
| PAGE_LIKES | 当人们喜欢你的页面时付费 |
| POST_ENGAGEMENT | 有人参与你的工作就付钱 |
| VIDEO_VIEWS | 当人们看你的视频广告至少10秒时付费 |
| THRUPLAY | 付费广告播放完成,或播放至少15秒 |
广告Ad
字段位置:facebook_business.adobjects.ad.Ad.Field
浙公网安备 33010602011771号