2 Stimmen

Verwendung von PHP zum Speichern von JSON über die Instagram API

Ich habe das Gefühl, dass ich das überdenke. Was ich tun möchte, ist die neuesten Fotos aus der Instagram-API abzurufen und die resultierenden JSON-Informationen als Cache-Datei zu speichern. Anschließend werde ich jQuery verwenden, um aus dieser Datei zu lesen - das habe ich bereits herausgefunden. Was ich im Moment verwende, ist es, es in einer Cache-Datei zu speichern, aber nicht in einem Format, das ich erkenne. Ich denke, ich mache das zu kompliziert.

Dies ist der Code, mit dem ich basierend auf einem Tutorial gearbeitet habe, das ich gefunden habe:

// Client-ID für die Instagram-API
$instagramClientID = '9110e8c268384cb79901a96e3a16f588';

$api = 'https://api.instagram.com/v1/media/popular?client_id='.$instagramClientID; // API-Anfrage (bearbeiten Sie dies, um Tags widerzuspiegeln)
$cache = 'cache.txt';

if(file_exists($cache) && filemtime($cache) > time() - 60*60){
// Wenn eine Cache-Datei existiert und sie neuer als 1 Stunde ist, verwenden Sie sie
$images = unserialize(file_get_contents($cache));
}
else{
// Führen Sie eine API-Anfrage durch und erstellen Sie die Cache-Datei

// Zum Beispiel erhält die 32 beliebtesten Bilder auf Instagram

$response = file_get_contents($api); // Ändern Sie den Anforderungspfad, um unterschiedliche Fotos abzurufen

$images = array();

// Dekodieren Sie die Antwort und erstellen Sie ein Array
foreach(json_decode($response)->data as $item){ // Dekodiert JSON (Javascript) in ein Array

    $title = '';

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

    $src = $item->images->standard_resolution->url; // Caches Standardresolutionsbildpfad in Variable $src

    $lat = $item->data->location->latitude; // Caches Breitengrad als $lat
    $lon = $item->data->location->longtitude; // Caches Längengrad als $lon       

    $images[] = array(
        "title" => htmlspecialchars($title),
        "src" => htmlspecialchars($src),
        "lat" => htmlspecialchars($lat),
        "lon" => htmlspecialchars($lon) // Konsolidiert Variablen in ein Array
    );
}

// Entfernen Sie das letzte Element, damit wir
// 32 Elemente haben, wenn das Cover hinzugefügt wird
//array_pop($images);

// Fügen Sie das Cover am Anfang des Arrays hinzu
//array_unshift($images,array("title"=>"Cover", "src"=>"assets/img/cover.jpg"));

// Aktualisieren Sie die Cache-Datei
file_put_contents($cache,serialize($images));
}

4voto

Lawrence Cherone Punkte 44625

Eine Sache, die mir aufgefallen ist, dass die API mega langsam ist, guter Schachzug zu cachen.

Sie versuchen, als serialisiertes Array zu speichern (was kein Problem ist), aber Sie könnten es genauso gut als JSON speichern, wenn Sie es wieder als JSON lesen werden, spart es einen Schritt beim Deserialisieren.

Hier sind einige Änderungen, die ich vorgenommen habe: Curl hinzugefügt, um die Antwort zu beschleunigen oder auf FGC zurückgreifen, falls Sie es nicht installiert haben. Die Antwort wird als JSON gespeichert, und beim Abrufen aus dem Cache wird sie als Array decodiert anstelle eines Objekts, das bedeutet, dass Sie Ihre gleiche Array-Struktur beibehalten können.

$item->data->location->latitude und $item->data->location->longtitude sind immer null im Ergebnis, also habe ich eine Überprüfung hinzugefügt...

Hoffe, es hilft

 time() - 60*60){
    // Wenn eine Cache-Datei existiert und sie neuer als 1 Stunde ist, verwenden Sie sie
    $images = json_decode(file_get_contents($cache),true); //Dekodieren als JSON-Array
}
else{
    // Führen Sie eine API-Anforderung durch und erstellen Sie die Cache-Datei
    // Z. B. holt die 32 beliebtesten Bilder auf Instagram
    $response = get_curl($api); //Ändern des Anforderungspfads, um unterschiedliche Fotos abzurufen

    $images = array();

    if($response){
        // Antwort decodieren und ein Array erstellen
        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; //Cacht Standardauflösung des Bildpfads in der Variable $src

            //Koordinaten des Ortes schienen leer im Ergebnis, aber Sie müssten sie überprüfen, da sie meistens nicht definiert sind
            $lat = (isset($item->data->location->latitude))?$item->data->location->latitude:null; // Cacht Breitengrad als $lat
            $lon = (isset($item->data->location->longtitude))?$item->data->location->longtitude:null; // Cacht Längengrad als $lon

            $images[] = array(
            "title" => htmlspecialchars($title),
            "src" => htmlspecialchars($src),
            "lat" => htmlspecialchars($lat),
            "lon" => htmlspecialchars($lon) // Konsolidiert Variablen zu einem Array
            );
        }
        file_put_contents($cache,json_encode($images)); //Als JSON speichern
    }
}

//Debugausgabe
print_r($images);

//Curl hinzugefügt für schnellere Antwort
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);
    }

}

?>

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X