私は、PythonとFacebookマーケティングAPIを使用してAdset内でうまく機能しないFacebook広告を無効にすることに苦労しています。自分のコードがAPIに対して行うアクセス数について少し気になります。もう一つの懸念は、私は論理的な決定をするために使用したいパラメータにアクセスするために 'get_insights'メソッドを使用していますが、私はそれらをオン/オフできるようにするためには 'get_ads'を使う必要があるので、私は物事を倍増させている。ここ は、私がこれまでのAPI V2.9を使って何をしてきたの例です:PythonでFacebook Marketing 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にあまりアクセスして、より良い、このコードを作る私を助けることができるし、コードを2倍にしました。おかげさまで
ありがとうございます。それはすでに良いです。今ではすべてのads_insightsがありますが、広告セットごとにグループ化されていません。私は次のようなことをしているのだろうかと思っていた。 1. adset_idでグループ化する。 2.メディアンを適用します。 3. ctrが中央値以下の人のad_idを取得するには、そのグループを繰り返します。 4. IDで広告をオフにします。 これは方法ですか?多くの反復のように聞こえる! もう一度ありがとうございます。 – Mauricio
こんにちはマウリシオ、そうです。まだいくつかの反復がクライアント側にあるので、高速で、追加のネットワークトラフィックは発生しません:) – Jiaming
ありがとう、Jiaming! (: – Mauricio