How to do a batch request using facebook_business SDK for python?
I have created this code to fetch leads from Facebook:
import pandas as pd from facebook_business.api import FacebookAdsApi from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad from facebook_business.adobjects.user import User from facebook_business.adobjects.lead import Lead import requests from datetime import datetime import time # Permanent Access Token access_token = "my_token" facebook_api = FacebookAdsApi.init(access_token=access_token) start_date = '2023-07-01' end_date = '2023-07-31' account_id = "my_ad_account_id" lead_fields = ['campaign_name',"created_time","field_data"] lead_params = { 'filtering': [{'field': 'time_created', 'operator': 'GREATER_THAN', 'value': start_date}, {'field': 'time_created', 'operator': 'LESS_THAN', 'value': end_date} ] } leads_list = [] # Getting ads ad_account = AdAccount(account_id) ads = ad_account.get_ads() for ad in ads: leads = ad.get_leads(fields=lead_fields,params=lead_params) for lead in leads: lead_dic = {} lead_dic["campaign_name"] = lead["campaign_name"] lead_dic["created_time"] = lead["created_time"] field_data = lead["field_data"] for field in field_data: lead_dic[field["name"]] = field["values"][0] leads_list.append(lead_dic) print(leads_list)
It works for my test account that has few ads, but I get an limit error when I try to use it with my main account.
I figure that I should use batch request, but I could not make it work. Can someone please help to to adapt this code so it does not get limit errors?
Basically, batch requests allow you to group multiple requests and send them as a single HTTP request, reducing the chance of exceeding the rate limits.
it works for my test account that has few ads, but I get an limit error when I try to use it with my main account.
Updated implementation with batch request:
import pandas as pd from facebook_business.api import FacebookAdsApi from facebook_business.adobjects.adaccount import AdAccount from facebook_business.adobjects.ad import Ad from facebook_business.adobjects.lead import Lead from facebook_business.exceptions import FacebookRequestError from facebook_business.adobjects.batch import Batch import requests from datetime import datetime import time # Permanent Access Token access_token = "YOUR_TOKEN" FacebookAdsApi.init(access_token=access_token) start_date = '2023-07-01' end_date = '2023-07-31' account_id = "YOUR_AD_ACCOUNT_ID" lead_fields = ['campaign_name', "created_time", "field_data"] lead_params = { 'filtering': [ {'field': 'time_created', 'operator': 'GREATER_THAN', 'value': start_date}, {'field': 'time_created', 'operator': 'LESS_THAN', 'value': end_date} ] } leads_list = [] # Getting ads ad_account = AdAccount(account_id) ads = ad_account.get_ads() batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) for ad in ads: batch.add_request( ad.get_leads(fields=lead_fields, params=lead_params) ) if len(batch) >= 50: # Facebook batch limit is 50 requests per batch try: batch.execute() for response in batch: if response.is_success(): for lead in response.json(): lead_dic = {} lead_dic["campaign_name"] = lead.get("campaign_name") lead_dic["created_time"] = lead.get("created_time") field_data = lead.get("field_data", []) for field in field_data: lead_dic[field["name"]] = field["values"][0] leads_list.append(lead_dic) else: print(f"Error: {response.error()}") except FacebookRequestError as e: print(f"Facebook Request Error: {e.api_error_code()}, {e.api_error_message()}") batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) # Execute any remaining requests in the batch if len(batch) > 0: try: batch.execute() for response in batch: if response.is_success(): for lead in response.json(): lead_dic = {} lead_dic["campaign_name"] = lead.get("campaign_name") lead_dic["created_time"] = lead.get("created_time") field_data = lead.get("field_data", []) for field in field_data: lead_dic[field["name"]] = field["values"][0] leads_list.append(lead_dic) else: print(f"Error: {response.error()}") except FacebookRequestError as e: print(f"Facebook Request Error: {e.api_error_code()}, {e.api_error_message()}") print(leads_list)Refer:
https://github.com/facebook/facebook-python-business-sdk https://github.com/facebook/facebook-python-business-sdk/blob/main/examples/batch_create.pyThank you so much for your answer. I will test the code and award you bounty soon. Meanwhile, could please you explain what the parameters of this function do? batch = Batch(FacebookAdsApi.get_default_api(), 'GET', '', [], [lead_fields]) and where in the documentation I can find a description of who this work?
When I try to run this code I get this error: No module named 'facebook_business.adobjects.batch'. Could you please help me?