#/venv/bin/python3
import http.client, json, csv, requests
import pandas as pd
from pandas import json_normalize
# Replace placeholder values with your API credentials
client_id = 'YOUR_CLIENT_ID'
client_secret = 'YOUR_CLIENT_SECRET'
def get_token():
conn = http.client.HTTPSConnection("api.ispot.tv")
payload = "client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&grant_type=client_credentials".format(CLIENT_ID=client_id, CLIENT_SECRET=client_secret)
headers = { 'content-type': "application/x-www-form-urlencoded" }
conn.request("POST", "/v4/oauth2/token", payload, headers)
res = conn.getresponse()
token_raw = res.read()
data_parsed = json.loads(token_raw.decode("utf-8"))
access_token = data_parsed['access_token']
conn.close()
return (access_token)
conn = http.client.HTTPSConnection("api.ispot.tv")
payload = ""
headers = {'Authorization': "Bearer {TOKEN}".format(TOKEN=str(get_token())), }
#######
## Set filters, parameters and define the api request.
endpoint = '/v4/metrics/audience/airings?'
page_size = '&page[size]=10000' # Do not alter
page_number = '&page[number]=1' # Do not alter
start_date = 'filter[start_date]=2022-01-01'
end_date = '&filter[end_date]=2022-02-01'
filters = '&filter[airing_type]=N,R&filter[national_only]=1'
includes = '&include=brand,parent_brand,spot,creative,day_of_week,day_part,episode,industry,network,genre,sub_genre,show,product'
params = start_date + end_date + filters + includes
api_request = endpoint + params + page_size
conn.request("GET", api_request + page_number, payload, headers, )
res = conn.getresponse()
request_id = res.headers.get('X-Request-ID')
request_datetime = res.headers.get('Date')
print('\r\nRequest ID: {REQUEST_ID}\r\nDatetime: {REQUEST_DATETIME}\r\nStatus: {STATUS}'.format(REQUEST_ID=request_id,REQUEST_DATETIME=request_datetime,STATUS=res.status))
final = res.read()
jsonResponse = json.loads(final.decode('utf-8'))
########
# Determine results and page data. JSON normalize converts all keys into headers for csv output
p = 0
p_total = jsonResponse.get('meta')['pagination']['total_pages']
total_values = jsonResponse.get('meta')['pagination']['total']
current_page = jsonResponse.get('meta')['pagination']['current_page']
print('\r\n{NRESULTS} results across {PAGE_NUM} pages\r\n'.format(NRESULTS=total_values, PAGE_NUM=p_total))
print('Completed: ' + api_request + page_number)
jsonResponse = jsonResponse['data']
json_norm = json_normalize(jsonResponse, sep='_')
if p == 0:
json_norm.to_csv('output.csv', mode='w', sep=',', header=True, index=False)
else:
json_norm.to_csv('output.csv', mode='a', sep=',', header=False, index=False)
while p < (p_total + 1):
try:
p += 1
conn.request("GET", api_request + "&page[number]=" + str(int(current_page + 1)), payload, headers, )
res = conn.getresponse()
final = res.read()
jsonResponse = json.loads(final.decode('utf-8'))
jsonResponse = jsonResponse['data']
json_norm = json_normalize(jsonResponse, sep='_')
json_norm.to_csv('output.csv', mode='a', sep=',', header=False, index=False)
print('Completed: https://api.ispot.tv{ENDPOINT}&page[number]={CURRENT}'.format(ENDPOINT=api_request,CURRENT=str(int(current_page + 1))))
current_page += 1
except Exception:
pass
else:
pass