2017-05-16 2 views
-1

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.

Antwort

0

Dies ist, was Sie tun können:

  1. alle Anzeigen von Kontenebene ad_account.get_ads()
  2. Erhalten Sie Einblicke von Konto ad_account.get_insights(fields=fields,params={'level': 'ad', ...})

In Ihre Erkenntnisse API-Aufrufe, müssen Sie adset_id hinzufügen Holen und ad_id bis fields, sodass Sie Adset-Median-CTR- und -Pause-Anzeigen berechnen können.

Auf diese Weise müssen Sie keine Adsets durchlaufen und API-Aufrufe für jede von ihnen durchführen. Wenn die Einsichten Daten zu groß sind, können Sie die asynchronen Einblicke api https://developers.facebook.com/docs/marketing-api/insights/best-practices#asynchronous

+0

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

+0

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

+0

Vielen Dank, Jiaming! (: – Mauricio

Verwandte Themen