Skip to content

Instantly share code, notes, and snippets.

@vinaysikarwar
Created January 17, 2023 05:44
Show Gist options
  • Save vinaysikarwar/9fb8f7a8a56be063b34c534c940cb5ae to your computer and use it in GitHub Desktop.
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
<?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