在 Python 中使用 Facebook Marketing API v2.9 关闭广告
Turning off Ads using Facebook Marketing API v2.9 in Python
我一直在努力关闭使用 Python 和 Facebook 营销 API 在广告集中表现不佳的 Facebook 广告。我有点担心我的代码对 API 的访问次数。另一个问题是我正在使用 'get_insights' 方法来访问我想用来构建逻辑决策的参数,但我需要使用 'get_ads' 才能将它们变为 on/off,所以我觉得我做事翻倍了。
这是到目前为止我使用 API v2.9 所做的示例:
from facebookads.api import FacebookAdsApi
from facebookads import adobjects
from facebookads.adobjects.adaccount import *
from facebookads.adobjects.campaign import *
from facebookads.adobjects.adset import *
from facebookads.adobjects.ad import *
from fctn import * # this is just a file where I centralized some functions
import credentials
import copy
# Auth
my_app_id = credentials.my_app_id
my_app_secret = credentials.my_app_secret
my_access_token = credentials.my_access_token
api = FacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)
ad_account = AdAccount(credentials.ad_account)
# Batch creation
my_batch = api.new_batch()
# Desired fields
fields = ['campaign_name', 'adset_name', 'ad_name', 'ctr', 'impressions']
# Getting all Adsets
ad_sets = ad_account.get_ad_sets(fields=[AdSet.Field.name, Ad.Field.created_time, Ad.Field.status],
params={
'effective_status': ['ACTIVE'],
'date_preset': 'last_30d',
'limit': 5000})
# We'll iterate over each adset because we want to campare just the ads inside the same adset
for ad_set in ad_sets:
ads = ad_set.get_ads(fields=[Ad.Field.name, Ad.Field.created_time, Ad.Field.status],
params={'effective_status': ['ACTIVE'],
'date_preset': 'last_30d',
'limit': 5000})
ads_insights = ad_set.get_insights(fields=fields,
params={'level': 'ad',
'date_preset': 'last_30d',
'effective_status': ['ACTIVE'],
'limit': 5000})
# this is an external funtion to get the median in relation with some metric
median_ctr = median_metric(ads_insights, 'ctr')
print(median_ctr)
print(ads_insights[0]['campaign_name'])
print(ad_set['name'])
print('BEFORE')
print(ads)
for i in range(0, len(ads)):
if dias_ate_hoje(ads[i]['created_time'][:10]) < 10:
# If Ad running less than 10 days, keep going
continue
else:
if float(ads_insights[i]['impressions']) < 300:
# If impressions less then 300, keep going (just an arbitrary decision here)
continue
else:
if float(ads_insights[i]['ctr']) < median_ctr:
# If Ad is in the worst half in relation with CTR: turn off
ads[i].api_update(params={'status': 'PAUSED'}, batch=my_batch)
else:
continue
my_batch.execute()
print('AFTER')
print(ads)
希望任何已经做过类似事情的人都可以帮助我改进这段代码,减少对 API 和双倍代码的访问。
谢谢
这是你可以做的:
- 从帐户级别获取所有广告
ad_account.get_ads()
- 从帐户中获取见解
ad_account.get_insights(fields=fields,params={'level': 'ad', ...})
在您的洞察 API 调用中,您需要将 adset_id
和 ad_id
添加到 fields
,以便您可以计算广告集点击率中值并暂停广告。
通过这种方式,您无需遍历广告集并为每个广告集进行 API 调用。如果insights数据太大,可以试试async insights api https://developers.facebook.com/docs/marketing-api/insights/best-practices#asynchronous
我一直在努力关闭使用 Python 和 Facebook 营销 API 在广告集中表现不佳的 Facebook 广告。我有点担心我的代码对 API 的访问次数。另一个问题是我正在使用 'get_insights' 方法来访问我想用来构建逻辑决策的参数,但我需要使用 'get_ads' 才能将它们变为 on/off,所以我觉得我做事翻倍了。 这是到目前为止我使用 API v2.9 所做的示例:
from facebookads.api import FacebookAdsApi
from facebookads import adobjects
from facebookads.adobjects.adaccount import *
from facebookads.adobjects.campaign import *
from facebookads.adobjects.adset import *
from facebookads.adobjects.ad import *
from fctn import * # this is just a file where I centralized some functions
import credentials
import copy
# Auth
my_app_id = credentials.my_app_id
my_app_secret = credentials.my_app_secret
my_access_token = credentials.my_access_token
api = FacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)
ad_account = AdAccount(credentials.ad_account)
# Batch creation
my_batch = api.new_batch()
# Desired fields
fields = ['campaign_name', 'adset_name', 'ad_name', 'ctr', 'impressions']
# Getting all Adsets
ad_sets = ad_account.get_ad_sets(fields=[AdSet.Field.name, Ad.Field.created_time, Ad.Field.status],
params={
'effective_status': ['ACTIVE'],
'date_preset': 'last_30d',
'limit': 5000})
# We'll iterate over each adset because we want to campare just the ads inside the same adset
for ad_set in ad_sets:
ads = ad_set.get_ads(fields=[Ad.Field.name, Ad.Field.created_time, Ad.Field.status],
params={'effective_status': ['ACTIVE'],
'date_preset': 'last_30d',
'limit': 5000})
ads_insights = ad_set.get_insights(fields=fields,
params={'level': 'ad',
'date_preset': 'last_30d',
'effective_status': ['ACTIVE'],
'limit': 5000})
# this is an external funtion to get the median in relation with some metric
median_ctr = median_metric(ads_insights, 'ctr')
print(median_ctr)
print(ads_insights[0]['campaign_name'])
print(ad_set['name'])
print('BEFORE')
print(ads)
for i in range(0, len(ads)):
if dias_ate_hoje(ads[i]['created_time'][:10]) < 10:
# If Ad running less than 10 days, keep going
continue
else:
if float(ads_insights[i]['impressions']) < 300:
# If impressions less then 300, keep going (just an arbitrary decision here)
continue
else:
if float(ads_insights[i]['ctr']) < median_ctr:
# If Ad is in the worst half in relation with CTR: turn off
ads[i].api_update(params={'status': 'PAUSED'}, batch=my_batch)
else:
continue
my_batch.execute()
print('AFTER')
print(ads)
希望任何已经做过类似事情的人都可以帮助我改进这段代码,减少对 API 和双倍代码的访问。 谢谢
这是你可以做的:
- 从帐户级别获取所有广告
ad_account.get_ads()
- 从帐户中获取见解
ad_account.get_insights(fields=fields,params={'level': 'ad', ...})
在您的洞察 API 调用中,您需要将 adset_id
和 ad_id
添加到 fields
,以便您可以计算广告集点击率中值并暂停广告。
通过这种方式,您无需遍历广告集并为每个广告集进行 API 调用。如果insights数据太大,可以试试async insights api https://developers.facebook.com/docs/marketing-api/insights/best-practices#asynchronous