Работа с API Instagram (JSON + PHP)

Я новичок в PHP и не могу понять, как работать с API-интерфейсами Instagram, чтобы (например) извлечь список ссылок на изображения стандартного разрешения по последним 3 элементам, опубликованным пользователем user_id 3.

Вот что я создал до сих пор:

<?php
function get_instagram($user_id,$count)
{
    $user_id = '3';
    $count = '3';
    $url = 'https://api.instagram.com/v1/users/'.$user_id.'/media/recent/?access_token=13137.f59def8.1a759775695548999504c219ce7b2ecf&count='.$count;
    $jsonData = $json_decode((file_get_contents($url)));
    $data = $jsonData->data;
    $result = '<ul>';
    foreach ($data as $key => $value) {
        $result .= '<li><a href='.$value->link.' ><img src="'.$value->images->standard_resolution->url.'" width="70" height="70" /></a></li> ';
    }
    $result .= '</ul>';
    return $result;
}

В результате получается пустая страница... не могли бы вы мне помочь?


person MultiformeIngegno    schedule 19.04.2012    source источник
comment
Вы return обрабатываете результат. Если вы хотите, чтобы он отображался на странице, вам нужно echo его. (echo $result;)   -  person    schedule 19.04.2012
comment
Спасибо nav_nav, я изменил это! В любом случае страница по-прежнему пуста.. Может, это что-то большее, чем ошибка..? :(   -  person MultiformeIngegno    schedule 19.04.2012
comment
попробуйте повторить данные JSON, чтобы увидеть, каков ваш результат из Instagram. echo $jsonData;   -  person    schedule 19.04.2012


Ответы (3)


Вам нужно повторить или что-то сделать с возвращенными данными (также у вас есть румяна $ перед вашей функцией json_decode)

Попробуйте это:

<?php
function get_instagram($user_id=15203338,$count=6,$width=190,$height=190){

    $url = 'https://api.instagram.com/v1/users/'.$user_id.'/media/recent/?access_token=13137.f59def8.1a759775695548999504c219ce7b2ecf&count='.$count;

    // Also Perhaps you should cache the results as the instagram API is slow
    $cache = './'.sha1($url).'.json';
    if(file_exists($cache) && filemtime($cache) > time() - 60*60){
        // If a cache file exists, and it is newer than 1 hour, use it
        $jsonData = json_decode(file_get_contents($cache));
    } else {
        $jsonData = json_decode((file_get_contents($url)));
        file_put_contents($cache,json_encode($jsonData));
    }

    $result = '<div id="instagram">'.PHP_EOL;
    foreach ($jsonData->data as $key=>$value) {
        $result .= "\t".'<a class="fancybox" data-fancybox-group="gallery" 
                            title="'.htmlentities($value->caption->text).' '.htmlentities(date("F j, Y, g:i a", $value->caption->created_time)).'"
                            style="padding:3px" href="'.$value->images->standard_resolution->url.'">
                          <img src="'.$value->images->low_resolution->url.'" alt="'.$value->caption->text.'" width="'.$width.'" height="'.$height.'" />
                          </a>'.PHP_EOL;
    }
    $result .= '</div>'.PHP_EOL;
    return $result;
}

echo get_instagram();
?>


С $value->location->name

Если вы хотите проверить, что он пуст, и если он есть, то не показывайте его, но также хотите добавить к нему строку, если она установлена, вы должны сделать что-то вроде:

$location = (!empty($value->location->name))?'@'.$value->location->name:null;

Затем используйте $location для повторения там, где вы хотите.

person Lawrence Cherone    schedule 19.04.2012
comment
@multiformeinggno добавил к нему базовый кеш, так как API может быть медленным, и если результаты не меняются часто, нет необходимости загружать свежий контент при каждой загрузке страницы. ;) - person Lawrence Cherone; 19.04.2012
comment
Последний вопрос. Теперь это мой код (добавлен Fancybox и прочее): pastebin.com/9FaxTx0y Как сделать Я преобразовываю временную метку unix, отраженную created_time, в обычные даты PHP? Заранее спасибо! :) - person MultiformeIngegno; 20.04.2012
comment
хорошо, чтобы преобразовать временную метку, используйте функцию date() что-то вроде date("F j, Y, g:i a", TIMESTAMPVALUE); проверьте это на php .net/manual/en/function.date.php - person Lawrence Cherone; 20.04.2012
comment
Большой! :) Я пытаюсь использовать это здесь: ‹a class=fancybox data-fancybox-group=gallery title='.$value-›caption-›text.' '.date(F j, Y, g:i a, $value-›caption-›created_time);' style=padding:3px href='.$value-›images-›standard_resolution-›url.'›‹img src='.$value-›images-›low_resolution-›url.' alt='.$value-›caption-›text.' ширина='.$ширина.' высота='.$высота.' /›‹/a› Это работает (я вижу правильную дату в исходном html), но это ломает код, т.е. исходный код заканчивается после тега title=, поэтому, вероятно, есть ошибка (мне не хватает точки или что-то еще ..?). - person MultiformeIngegno; 20.04.2012
comment
Другой вопрос (не убивайте меня .. :P): Как я могу иметь что-то вроде имени @ местоположения, если местоположение существует? Я использую это: '.$value-›местоположение-›имя». и он отображается, если местоположение существует, как мне добавить @ перед названием местоположения, если местоположение существует? :) - person MultiformeIngegno; 20.04.2012
comment
Я обновил ответ, чтобы включить ваши изменения, вам нужно использовать функцию htmlentities() для кодирования символов, которые не нарушат ваш вывод. не уверен, что вы имеете в виду под названием @местоположения, вы можете поставить @ перед любой переменной, чтобы подавить неопределенную ошибку или что-то в этом роде - person Lawrence Cherone; 20.04.2012
comment
Спасибо!! :D Под @ я подразумеваю АТ. Например, если на фотографии указан город Сан-Франциско, было бы неплохо добавить что-то вроде ЗАГОЛОВКА по адресу/@ LOCATION. :) Проблема в том, что я не хочу отображать AT, если данные о местоположении пусты.. - person MultiformeIngegno; 20.04.2012
comment
Теперь все работает отлично!! :D Единственное, что немного раздражает, так это то, что с htmlentities() у меня ломаются акценты. Например, ì становится Ã~ ... страница с набором символов UTF8 - person MultiformeIngegno; 20.04.2012
comment
Этот код правильный? :) '.htmlentities($value-›caption-›текст, ENT_QUOTES, UTF-8).' - person MultiformeIngegno; 20.04.2012
comment
Я хочу перестараться.. :P Верен ли этот другой фрагмент кода (я не пробовал)? $cache = bloginfo('stylesheet_directory');'./instagram_json/'.sha1($url).'.json'; Я хотел бы хранить файлы кеша JSON в каталоге моей темы Wordpress/instagram_json/, поэтому я вызываю bloginfo('stylesheet_directory'); функция для получения каталога.. - person MultiformeIngegno; 20.04.2012

Я расширил выбранный ответ, написав небольшой скрипт, который можно использовать в качестве шаблона для всех, кто пытается это сделать.

Он настроен со всеми переменными и начинается с базовой разметки. Используя селекторы из документов API Instagram, вы можете использовать его вывод по мере необходимости.

Это создано специально для использования с WordPress с одной небольшой настройкой размера изображения при условии, что его можно использовать в любом приложении PHP.

<?php
function instagram($count = 10, $width = 640, $height = 640) {

    $user_id = 123456789;
    $access_token = '123456789';
    $size = wp_is_mobile() ? 'low_resolution' : 'standard_resolution';
    $url = 'https://api.instagram.com/v1/users/'.$user_id.'/media/recent/?access_token='.$access_token.'&count='.$count;
    $cache_location = './'.sha1($url).'.json';
    $cache_time = '-1 hour';

    if (file_exists($cache_location) && filemtime($cache_location) > strtotime($cache_time)) {
        // If a cache file exists, and it is newer than 1 hour, use it
        $jsonData = json_decode(file_get_contents($cache_location));
    } else {
        $jsonData = json_decode((file_get_contents($url)));
        file_put_contents($cache_location,json_encode($jsonData));
    }

    foreach ($jsonData->data as $key=>$value) {
        echo '<div>';
        echo '<img src="'.$value->images->$size->url.'"/>';
        echo '</div>';
    }
}

Основное использование

<?php echo instagram(); ?>

Расширенное использование

<?php echo instagram($count = 1, $width = 100, $height = 100); ?>

Репозиторий Github

person Daniel Olson    schedule 13.02.2015

Хорошо, это работало неделю назад, но теперь выдает ошибку PHP:

"Сообщение: Попытка получить свойство не-объекта"

в строке с оператором foreach: foreach ($jsonData->data as $key=>$value)

Оказывается, мой фид JSON был на самом деле поврежден, подписи к некоторым моим инстаграмам отсутствовали, поэтому мне пришлось добавить пустой оператор if. Я также использую другой метод сейчас, любопытно, что вы думаете, отлично работает!

<?php

  function fetchData($url){
  $ch = curl_init();
  curl_setopt($ch, CURLOPT_URL, $url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_TIMEOUT, 20);
  $result = curl_exec($ch);
  curl_close($ch); 
  return $result;
  }

  $result = fetchData("https://api.instagram.com/v1/users/USER ID HERE/media/recent/?access_token=ACCES TOKEN HERE&count=14");

  $cache = './instagram.json';
  if(file_exists($cache) && filemtime($cache) > time() - 60*60){
  // If a cache file exists, and it is newer than 1 hour, use it
  $instaData = json_decode(file_get_contents($cache));
    } else {
  $instaData = json_decode((file_get_contents($result)));
    file_put_contents($cache,json_encode($instaData));
  }

  foreach ($instaData->data as $post) {
     if(empty($post->caption->text)) {
       // Do Nothing
     }
     else {
        echo '<a class="instagram-unit" target="blank" href="'.$post->link.'">
        <img src="'.$post->images->low_resolution->url.'" alt="'.$post->caption->text.'" width="100%" height="auto" />
        <div class="instagram-desc">'.htmlentities($post->caption->text).' | '.htmlentities(date("F j, Y, g:i a", $post->caption->created_time)).'</div></a>';
     }

  }
?>
person LookingLA    schedule 22.08.2013