Skip to content

Instantly share code, notes, and snippets.

@mosheeshel
Last active March 8, 2019 19:32
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save mosheeshel/7560362c68ac32b1b0b9d74de892b98e to your computer and use it in GitHub Desktop.
Save mosheeshel/7560362c68ac32b1b0b9d74de892b98e to your computer and use it in GitHub Desktop.
Create AdInsights Report from Facebook and download it into TSV (customize for different stuff easily)
import time, datetime
import csv
from facebook_business.api import FacebookAdsApi
from facebook_business.adobjects.adaccount import AdAccount
from facebook_business.adobjects.adsinsights import AdsInsights
from facebook_business.adobjects.adreportrun import AdReportRun
from facebook_business.adobjects.campaign import Campaign
import boto3
start_run = time.time()
my_app_id = ''
my_app_secret = ''
my_access_token = ''
accountId = ''
AWS_ACCESS_KEY_ID = ''
AWS_SECRET_ACCESS_KEY = ''
S3_BUCKET = ""
FacebookAdsApi.init(my_app_id, my_app_secret, my_access_token)
my_account = AdAccount('act_%s' % accountId)
def wait_for_async_job(job):
for _ in range(20000):
time.sleep(1)
job = job.remote_read()
status = job[AdReportRun.Field.async_status]
precent = job[AdReportRun.Field.async_percent_completion]
print("%s - %d%% time running: %s " % (status, precent, str(datetime.timedelta(seconds=(time.time()-start_run)))))
if status == "Job Completed":
return job.get_result(params={"limit": 500})
fields_names = ["adset_id","campaign_id","date_start","clicks", "inline_link_clicks", "unique_inline_link_click_ctr", "unique_inline_link_clicks", "unique_link_clicks_ctr", "unique_outbound_clicks", "unique_outbound_clicks_ctr", "unique_clicks","cpc","cpm","cpp","ctr","impressions","reach","spend"]
fields_names_for_print = ["campaign_id","adset_id","product_id","date_start","clicks","unique_clicks","inline_link_clicks", "unique_inline_link_click_ctr", "unique_inline_link_clicks", "unique_link_clicks_ctr", "unique_outbound_clicks", "unique_outbound_clicks_ctr", "cpc","cpm","cpp","ctr","impressions","reach","spend"]
params = {
"fields": fields_names,
"action_attribution_windows": [AdsInsights.ActionAttributionWindows.value_1d_click, AdsInsights.ActionAttributionWindows.value_1d_view],
"filtering": [{"field":"ad.effective_status","operator":"IN","value":["ACTIVE"]},{"field":"impressions","operator":"GREATER_THAN","value":0}],
"level": AdsInsights.Level.adset,
"time_increment": 1,
"date_preset": Campaign.DatePreset.yesterday, # amount of days to bring back
# "date_range": {"since":"2019-03-02","until":"2019-03-02"},
"breakdowns": [AdsInsights.Breakdowns.product_id],
"action_breakdowns": [AdsInsights.ActionBreakdowns.action_type],
}
job = my_account.get_insights_async(params=params)
print(job)
result_cursor = wait_for_async_job(job)
job_date_start = job[AdReportRun.Field.date_start]
job_date_stop = job[AdReportRun.Field.date_stop]
outputfile_name = 'act_%s-output-%d-from-%s-to-%s.tsv' % (accountId, time.time(), job_date_start, job_date_stop)
print("Output File: %s" % outputfile_name)
with open(outputfile_name, 'w') as output_file:
dw = csv.DictWriter(output_file, fields_names_for_print, delimiter='\t',extrasaction='ignore')
dw.writeheader()
dw.writerows(result_cursor)
# Upload file to S3 bucket
client = boto3.client('s3', aws_access_key_id=AWS_ACCESS_KEY_ID, aws_secret_access_key=AWS_SECRET_ACCESS_KEY, region_name="us-east-1")
client.upload_file(Filename=outputfile_name, Bucket=S3_BUCKET, Key="kenshoo/inbound/raw_files/Social/" + outputfile_name)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment