Ich habe Probleme damit, Facebook-Anzeigen zu deaktivieren, die in einem Adset mit Python und der Marketing-API von Facebook nicht gut funktionieren. Ich bin ein wenig besorgt über die Anzahl der Zugriffe, die mein Code auf die API ausübt. Ein weiteres Problem ist, dass ich die 'get_insights'-Methode verwende, um Zugriff auf die Parameter zu haben, die ich verwenden möchte, um eine logische Entscheidung zu treffen, aber ich muss' get_ads 'verwenden, um sie ein- und ausschalten zu können dass ich Dinge verdopple. Hier ist ein Beispiel dafür, was ich habe bisher tun das API v2.9 mit:Deaktivieren von Anzeigen über Facebook Marketing API v2.9 in Python
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)
Hoffnung jeder, der schon so etwas getan hatte mir helfen könnte diesen Code besser auf die API mit weniger Zugang zu machen und doppelte Code-Teile. Danke.
Vielen Dank! Das ist schon besser. Jetzt habe ich alle ads_insights, aber sie sind nicht nach adset gruppiert. Ich habe mich gefragt, ob ich sowas machen könnte: 1. Gruppiere sie nach adset_id; 2. Wenden Sie den Median an; 3. Iterieren Sie über diese Gruppe, um die ad_id von denjenigen zu erhalten, deren ctr unter dem Median liegt; 4. Deaktivieren Sie die Anzeigen nach ihrer ID; Das ist der Weg? Klingt nach vielen Wiederholungen! Danke nochmal. – Mauricio
Hallo Mauricio, das stimmt. Noch ein paar Iterationen, aber sie sind auf der Client-Seite, so sollte es schnell sein und keinen zusätzlichen Netzwerkverkehr verursachen :) – Jiaming
Vielen Dank, Jiaming! (: – Mauricio