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

posted on 2020-07-20 17:12  江湖乄夜雨  阅读(4)  评论(0)    收藏  举报