简体   繁体   English

使用PHP通过Instagram API存储json

[英]Using PHP to store json via Instagram API

I feel like I'm overthinking this. 我觉得我想得太多了。 What I want to do is pull the most recent photos from the instagram api and save the resulting json information as a cache file. 我想做的是从instagram API中提取最新照片,并将得到的json信息保存为缓存文件。 I'll then use jQuery to read from that file -- I've got that part figured out. 然后,我将使用jQuery读取该文件-我已经弄清楚了那部分。 What I'm using now is saving it in a cache file, but not in a format that I recognize. 我现在使用的是将其保存在缓存文件中,但不是我可以识别的格式。 I think I'm overcomplicating this. 我想这太复杂了。

This is code I've been working with based on a tutorial I found: 这是我根据发现的一个教程使用的代码:

// Client ID for Instagram API
$instagramClientID = '9110e8c268384cb79901a96e3a16f588';

$api = 'https://api.instagram.com/v1/media/popular?client_id='.$instagramClientID; //api       request (edit this to reflect tags)
$cache = 'cache.txt';

if(file_exists($cache) && filemtime($cache) > time() - 60*60){
// If a cache file exists, and it is newer than 1 hour, use it
$images = unserialize(file_get_contents($cache));
}
else{
// Make an API request and create the cache file

// For example, gets the 32 most popular images on Instagram

$response = file_get_contents($api); //change request path to pull different photos

$images = array();

// Decode the response and build an array
foreach(json_decode($response)->data as $item){ // Decodes json (javascript) into an array

    $title = '';

    if($item->caption){
        $title = mb_substr($item->caption->text,0,70,"utf8");
    }

    $src = $item->images->standard_resolution->url; //Caches standard res img path to variable $src

    $lat = $item->data->location->latitude; // Caches latitude as $lat
    $lon = $item->data->location->longtitude; // Caches longitude as $lon       

    $images[] = array(
        "title" => htmlspecialchars($title),
        "src" => htmlspecialchars($src),
        "lat" => htmlspecialchars($lat),
        "lon" => htmlspecialchars($lon) // Consolidates variables to an array
    );
}

// Remove the last item, so we still have
// 32 items when when the cover is added
//array_pop($images);

// Push the cover in the beginning of the array
//array_unshift($images,array("title"=>"Cover", "src"=>"assets/img/cover.jpg"));

// Update the cache file
file_put_contents($cache,serialize($images));
}

One thing I noticed is the API is mega slow, good choice to cache. 我注意到的一件事是API非常慢,是缓存的不错选择。

You are attempting to save as a serialized array (which is no biggie) but you may as well save it as json if your going to read it as json again, it saves 1 step in unserializing it again. 您正在尝试另存为序列化数组(这没什么大不了的),但是如果您要再次将其读取为json,则也可以将其另存为json,这样可以节省再次反序列化的1个步骤。

Here are some changes I made: Added curl to try and speed up the response or fall back to FGC if u dont have it installed. 这是我所做的一些更改:添加了curl以尝试加快响应速度,或者如果您未安装FGC则退回到FGC。 The response gets saved as json, and when retrieved from the cache its decoded as an array instead of an object, this means you can keep your same array structure. 响应将另存为json,当从缓存中检索到时,将其解码为数组而不是对象,这意味着您可以保留相同的数组结构。

$item->data->location->latitude and $item->data->location->longtitude is always null in the result so added a check for that... $item->data->location->latitude$item->data->location->longtitude在结果中始终为空,因此为此添加了检查...

Hope it helps 希望能帮助到你

<?php
// Client ID for Instagram API
$instagramClientID = '9110e8c268384cb79901a96e3a16f588';

$api = 'https://api.instagram.com/v1/media/popular?client_id='.$instagramClientID; //api request (edit this to reflect tags)
$cache = './cache.json';

if(file_exists($cache) && filemtime($cache) > time() - 60*60){
    // If a cache file exists, and it is newer than 1 hour, use it
    $images = json_decode(file_get_contents($cache),true); //Decode as an json array
}
else{
    // Make an API request and create the cache file
    // For example, gets the 32 most popular images on Instagram
    $response = get_curl($api); //change request path to pull different photos

    $images = array();

    if($response){
        // Decode the response and build an array
        foreach(json_decode($response)->data as $item){

            $title = (isset($item->caption))?mb_substr($item->caption->text,0,70,"utf8"):null;

            $src = $item->images->standard_resolution->url; //Caches standard res img path to variable $src

            //Location coords seemed empty in the results but you would need to check them as mostly be undefined
            $lat = (isset($item->data->location->latitude))?$item->data->location->latitude:null; // Caches latitude as $lat
            $lon = (isset($item->data->location->longtitude))?$item->data->location->longtitude:null; // Caches longitude as $lon

            $images[] = array(
            "title" => htmlspecialchars($title),
            "src" => htmlspecialchars($src),
            "lat" => htmlspecialchars($lat),
            "lon" => htmlspecialchars($lon) // Consolidates variables to an array
            );
        }
        file_put_contents($cache,json_encode($images)); //Save as json
    }
}

//Debug out
print_r($images);

//Added curl for faster response
function get_curl($url){
    if(function_exists('curl_init')){
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL,$url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt ($ch, CURLOPT_SSL_VERIFYPEER, 0); 
        $output = curl_exec($ch);
        echo curl_error($ch);
        curl_close($ch);
        return $output;
    }else{
        return file_get_contents($url);
    }

}

?>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM