在 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 和双倍代码的访问。 谢谢

这是你可以做的:

  1. 从帐户级别获取所有广告 ad_account.get_ads()
  2. 从帐户中获取见解 ad_account.get_insights(fields=fields,params={'level': 'ad', ...})

在您的洞察 API 调用中,您需要将 adset_idad_id 添加到 fields,以便您可以计算广告集点击率中值并暂停广告。

通过这种方式,您无需遍历广告集并为每个广告集进行 API 调用。如果insights数据太大,可以试试async insights api https://developers.facebook.com/docs/marketing-api/insights/best-practices#asynchronous