Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Instagram API使用PHP存储json_Php_Json_Api_Instagram - Fatal编程技术网

通过Instagram API使用PHP存储json

通过Instagram API使用PHP存储json,php,json,api,instagram,Php,Json,Api,Instagram,我觉得我想得太多了。我想做的是从instagram api中提取最新的照片,并将生成的json信息保存为缓存文件。然后,我将使用jQuery读取该文件-我已经找到了该部分。我现在使用的是将其保存在缓存文件中,但不是以我识别的格式。我想我把这个复杂化了 这是我根据找到的教程编写的代码: // Client ID for Instagram API $instagramClientID = '9110e8c268384cb79901a96e3a16f588'; $api = 'https://ap

我觉得我想得太多了。我想做的是从instagram api中提取最新的照片,并将生成的json信息保存为缓存文件。然后,我将使用jQuery读取该文件-我已经找到了该部分。我现在使用的是将其保存在缓存文件中,但不是以我识别的格式。我想我把这个复杂化了

这是我根据找到的教程编写的代码:

// 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));
}

我注意到的一点是,API速度非常慢,是缓存的好选择

您正试图将其另存为序列化数组,这并没有什么大不了的,但您也可以将其另存为json,如果您再次将其读取为json,则可以在再次取消序列化时节省1个步骤

以下是我所做的一些更改: 添加了curl以尝试加快响应速度,如果没有安装FGC,则返回FGC。 响应被保存为json,当从缓存中检索时,它被解码为数组而不是对象,这意味着您可以保持相同的数组结构

$item->data->location->latitude和$item->data->location->longtude在结果中始终为空,因此添加了一个检查

希望能有帮助

<?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);
    }

}

?>

我注意到的一点是,API速度非常慢,是缓存的好选择

您正试图将其另存为序列化数组,这并没有什么大不了的,但您也可以将其另存为json,如果您再次将其读取为json,则可以在再次取消序列化时节省1个步骤

以下是我所做的一些更改: 添加了curl以尝试加快响应速度,如果没有安装FGC,则返回FGC。 响应被保存为json,当从缓存中检索时,它被解码为数组而不是对象,这意味着您可以保持相同的数组结构

$item->data->location->latitude和$item->data->location->longtude在结果中始终为空,因此添加了一个检查

希望能有帮助

<?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);
    }

}

?>

如果要将文件另存为JSON,请使用JSON_encode而不是serialize。如果要将文件另存为JSON,请使用JSON_encode而不是serialize。