2016-04-01 29 views
2

üzerinden birçok Reklam için meta verileri alma umarım, birisi aynı konu üzerinde tökezledi ve benim sorunum için basit bir çözüm yolunda bana rehberlik edebilir.Facebook Marketing API: Python

Facebook'taki Reklamlarım ile ilgili bazı verileri düzenli olarak almak istiyorum. Temel olarak, daha fazla raporlama amacıyla veritabanlarımdan birinde bazı meta verileri depolamak istiyorum. Böylece tüm Reklamlarım için AD-ID, AD-ismi ve ilgili ADSET-ID'yi almak istiyorum.

Python içinde bu küçük işlevi yazdım:

def get_ad_stats(ad_account): 
    """ Pull basic stats for all ads 
    Args: 'ad_account' is the Facebook AdAccount object 
    Returns: 'fb_ads', a list with basic values 
    """ 
    fb_ads = [] 
    fb_fields = [ 
       Ad.Field.id, 
       Ad.Field.name, 
       Ad.Field.adset_id, 
       Ad.Field.created_time, 
    ] 

    fb_params = { 
     'date_preset': 'last_14_days', 
    } 

    for ad in ad_account.get_ads(fields = fb_fields, params = fb_params): 
     fb_ads.append({ 
      'id':     ad[Ad.Field.id], 
      'name':     ad[Ad.Field.name], 
      'adset_id':    ad[Ad.Field.adset_id], 
      'created_time':   datetime.datetime.strptime(ad[Ad.Field.created_time], "%Y-%m-%dT%H:%M:%S+0000"), 
     }) 

    return (fb_ads) 

Benzer fonksiyonları kampanya ve AdSet-data çalışma cezayı. Ancak, Reklamlar için her zaman bir kullanıcı isteği sınırına ulaşıyorum: "(#17) User request limit reached".

"BASIC" API erişim düzeyim var ve burada 12.000 Reklam hakkında konuşuyoruz. Ve maalesef, async-calls sadece Insights-edge için çalışıyor gibi görünüyor. Kullanıcı isteği sınırlamasını engellemenin bir yolu var mı, örn. API talebini yalnızca belirli bir tarihten sonra değiştirilen/yeni oluşturulan Reklamlarla sınırlandırarak mı?

cevap

1

Tamam, 'created_time' alanını feda ederek, bunun için Insights-edge'i kullanabileceğimi fark ettim. Şimdi, async-call ve şu çağrılar arasında bir gecikme olan aynı işlev için gözden geçirilmiş bir kod:

def get_ad_stats(ad_account): 
    """ Pull basic stats for all ads 
    Args: 'ad_account' is the Facebook AdAccount object 
    Returns: 'fb_ads', a list with basic values 
    """ 
    fb_ads = [] 

    fb_params = { 
     'date_preset': 'last_14_days', 
     'level': 'ad', 
    } 

    fb_fields = [ 
     'ad_id', 
     'ad_name', 
     'adset_id', 
    ] 

    async_job = ad_account.get_insights(fields = fb_fields, params = fb_params, async=True) 
    async_job.remote_read() 

    while async_job['async_percent_completion'] < 100: 
     time.sleep(1) 
     async_job.remote_read() 

    for ad in async_job.get_result(): 
     fb_ads.append({ 
      'id':     ad['ad_id'], 
      'name':     ad['ad_name'], 
      'adset_id':    ad['adset_id'], 
     }) 

    return (fb_ads)