Created
January 17, 2023 05:44
-
-
Save vinaysikarwar/9fb8f7a8a56be063b34c534c940cb5ae to your computer and use it in GitHub Desktop.
Fetch All Car Make, Model, Trim & Trim Detail data from https://carapi.app/users/api
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
ini_set('display_errors', 1); | |
/** Api Endpoints */ | |
$apiData = array( | |
'api_endpoint' => "https://carapi.app/api/", | |
'years_endpoint' => "years", | |
'makes_endpoint' => "makes", | |
'model_endpoint' => "models", | |
'trim_endpoint' => "trims?year=2020", | |
'trim_details_endpoint' => "trims/" | |
); | |
/** Get & Save Models List based on Years & Make */ | |
$models = getJson("models_data"); | |
if (!$models) { | |
$years = getYearsData($apiData); | |
$makes = getMakesData($apiData, $years); | |
$models = getModelData($apiData, $makes); | |
saveJson("models_data", json_encode($models)); | |
} | |
/** Get & Save Trims Data based on models data */ | |
$trims = getJson("trims"); | |
if (!$trims) { | |
$trims = getTrimData($apiData,$models); | |
saveJson("trims", json_encode($trims)); | |
} | |
/** Get & Save Trim Details data based on Year, Makes, Models & Trims */ | |
$trim_details = getJson("trim_details"); | |
if (!$trim_details) { | |
$trim_details = getTrimDetails($apiData, $trims); | |
saveJson("trim_details", json_encode($trim_details)); | |
} | |
/** Prepare CSV */ | |
prepareCsv($trim_details); | |
/** Save Data in given json filename */ | |
function saveJson($file, $json) | |
{ | |
$filename = $file.".json"; | |
if (file_put_contents($filename, $json)) { | |
echo "$filename file created successfully..."; | |
} else { | |
echo "Oops! Error creating json file..."; | |
} | |
} | |
/** get data from Given json filename */ | |
function getJson($filename) | |
{ | |
$filename = $filename .".json"; | |
$json = file_get_contents($filename); | |
return json_decode($json); | |
} | |
/** Get years list from car api */ | |
function getYearsData($apiData) | |
{ | |
$endpoint = $apiData['api_endpoint'].$apiData['years_endpoint']; | |
return processCurlRequest($endpoint); | |
} | |
/** Get makes list from Years list */ | |
function getMakesData($apiData, $years) | |
{ | |
$makes = []; | |
foreach ($years as $year) { | |
if ($year == "2020") { | |
$endpoint = $apiData['api_endpoint'].$apiData['makes_endpoint'].'?year='.$year; | |
$makesData = processCurlRequest($endpoint); | |
$makes[$year] = $makesData['data']; | |
} | |
} | |
return $makes; | |
} | |
/** Get Models data based on Year & Make */ | |
function getModelData($apiData, $makes) | |
{ | |
$models= []; | |
foreach ($makes as $year => $make) { | |
foreach ($make as $makeItem) { | |
$makeItemName = $makeItem['name']; | |
$makeModelData = getModelPagesData($apiData, $year, $makeItem); | |
$models[$year][$makeItemName] = $makeModelData; | |
} | |
} | |
return $models; | |
} | |
/** Get model pages data */ | |
function getModelPagesData($apiData, $year, $makeItem) | |
{ | |
$url = $apiData['api_endpoint'].$apiData['model_endpoint'].'?year='.$year.'&make_id='.$makeItem['id']; | |
$modelData = processCurlRequest($url); | |
/** $makeItemName = $makeItem['name']; */ | |
return $modelData['data']; | |
} | |
/** Get trim data based on models list */ | |
function getTrimData($apiData, $vehicleData) | |
{ | |
$trims= []; | |
$endpoint = $apiData['api_endpoint'].$apiData['trim_endpoint']; | |
foreach ($vehicleData as $year => $makes) { | |
foreach ($makes as $makeName => $models) { | |
foreach ($models as $model) { | |
$modelName = $model->name; | |
$apiUrl = $endpoint.'&make_id='.$model->make_id.'&model_id='.$model->id; | |
$trimData = processCurlRequest($apiUrl); | |
if (!empty($trimData['data'])) { | |
$trims[$year][$makeName][$modelName] = $trimData['data']; | |
} | |
} | |
} | |
} | |
return $trims; | |
} | |
/** Get Trim details based on trims list */ | |
function getTrimDetails($apiData, $trims) | |
{ | |
$trimDetail = []; | |
$i=0; | |
foreach ($trims as $year => $makes) { | |
foreach ($makes as $makeName => $models){ | |
foreach ($models as $modelName => $trims){ | |
foreach ($trims as $trim) { | |
$trimDetail[] = getTrimDetail($apiData, $year, $makeName, $modelName, $trim); | |
$i++; | |
echo "$year $makeName $modelName $i records inserted \n"; | |
} | |
} | |
} | |
} | |
echo "Total Rows $i"; | |
return $trimDetail; | |
} | |
/** Prepare trim detail data from trim row */ | |
function getTrimDetail($apiData, $year, $makeName, $modelName, $trim) | |
{ | |
$endpoint = $apiData['api_endpoint'].$apiData['trim_details_endpoint']; | |
$endpoint = $endpoint.$trim->id; | |
$trimData = processCurlRequest($endpoint); | |
$trimDesc = $trim->description; | |
$vehicleData = array( | |
'make' => $makeName, | |
'model' => $modelName, | |
'year' => $year, | |
'trim_name' => $trim->name."($trimDesc)" | |
); | |
if (!empty($makeModelTrimBody = $trimData['make_model_trim_body'])) { | |
$vehicleData['length'] = $makeModelTrimBody['length']; | |
$vehicleData['width'] = $makeModelTrimBody['width']; | |
$vehicleData['height'] = $makeModelTrimBody['height']; | |
} | |
return $vehicleData; | |
} | |
/** Format print array */ | |
function pre($data) | |
{ | |
echo '<pre>'; | |
print_R($data); | |
echo '</pre>'; | |
} | |
/** Process curl request */ | |
function processCurlRequest($url) | |
{ | |
$token = "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJjYXJhcGkuYXBwIiwic3ViIjoiNTU5M2Y3OWItMTRmNy00YmZiLWEzMjAtZWUxYmNmN2Q4OWMwIiwiYXVkIjoiNTU5M2Y3OWItMTRmNy00YmZiLWEzMjAtZWUxYmNmN2Q4OWMwIiwiZXhwIjoxNjc0MjEzMDMyLCJpYXQiOjE2NzM2MDgyMzIsImp0aSI6IjhhYjljNjM1LTQ2NjAtNGJmZi04Zjg1LTc3OWEzZmJjNjA5NyIsInVzZXIiOnsic3Vic2NyaWJlZCI6ZmFsc2V9fQ.KyHjMU0AE5ZyzPPYaTp0FCdMZajzVfT0gE3tPYMERhw"; | |
$authorization = "Authorization: Bearer ".$token; | |
$ch = curl_init($url); | |
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json' , $authorization )); | |
curl_setopt($ch, CURLOPT_TIMEOUT, 5); | |
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5); | |
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); | |
$data = curl_exec($ch); | |
curl_close($ch); | |
return json_decode($data, true); | |
} | |
/** Prepare Excel file */ | |
function prepareCsv($vehicleData) | |
{ | |
$out = fopen("vehicle_trims_data.csv", 'w'); | |
/** Prepare Header */ | |
$line = ["Year", "Make", "Model", "Trim", "Trim Length", "Trim Width", "Trim Height"]; | |
fputcsv($out, $line); | |
echo "CSV Export Process Started.."; | |
foreach ($vehicleData as $year => $makes) { | |
foreach ($makes as $make_name => $make) { | |
foreach ($make as $model_name => $model) { | |
foreach ($model as $trim) { | |
$line = [$year, $make_name,$model_name,$trim->name.'('.$trim->description.')',"-","-","-"]; | |
fputcsv($out, $line); | |
} | |
} | |
} | |
} | |
fclose($out); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment