2017-05-16 16 views
-1

私は、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倍にしました。おかげさまで

答えて

0

これはあなたが何ができるかです:

  1. は、アカウントレベルad_account.get_ads()
  2. からのすべての広告があなたの洞察力のAPIコールでアカウントad_account.get_insights(fields=fields,params={'level': 'ad', ...})

から洞察をゲットするには、adset_idを追加する必要があり、 ad_idfieldsのように、広告のメディアンctrと一時停止広告を計算することができます。

このようにして、広告セットをループオーバーする必要はなく、それぞれに対してAPIコールを行う必要はありません。インサイトデータが大きすぎる場合は、非同期インサイトapi https://developers.facebook.com/docs/marketing-api/insights/best-practices#asynchronous

+0

ありがとうございます。それはすでに良いです。今ではすべてのads_insightsがありますが、広告セットごとにグループ化されていません。私は次のようなことをしているのだろうかと思っていた。 1. adset_idでグループ化する。 2.メディアンを適用します。 3. ctrが中央値以下の人のad_idを取得するには、そのグループを繰り返します。 4. IDで広告をオフにします。 これは方法ですか?多くの反復のように聞こえる! もう一度ありがとうございます。 – Mauricio

+0

こんにちはマウリシオ、そうです。まだいくつかの反復がクライアント側にあるので、高速で、追加のネットワークトラフィックは発生しません:) – Jiaming

+0

ありがとう、Jiaming! (: – Mauricio

関連する問題