Яндекс фотки на вашем сайте

Исаев Роман • 31 Августа, 2009

Хочу рассказать, как можно использовать API Яндекс фоток для создания фотогалереи на вашем сайте.

Преимущества использования Яндекс Фоток для хранения ваших альбомов:

  • Вы можете загружать туда неограниченное количество фотографий и при этом не будет заниматься место на вашем хостинге.
  • При заливке фотографии автоматически создаются семь уменьшенных копий разного размера (Хранение графического файла фотографии).
  • При создании превью используется шарпинг, благодаря чему уменьшенные изображения получаются хорошего качества.
  • Для создания фотогалереи не нужна база данных. Все можно реализовать через API.

API Фоток реализует протокол AtomPub (Atom Publishing Protocol). Клиентское приложение работает с сервером API Фоток, посылая XML-сообщения разными HTTP-методами. Для получения ресурсов фотографий и альбомов нужно обратиться GET-запросом по адресу коллекции.

  • Коллекция альбомов пользователя: http://api-fotki.yandex.ru/api/users/{login}/albums/.
  • Коллекция фотографий альбома: http://api-fotki.yandex.ru/api/users/{login}/album/{albom id}/photos/.
  • Общая коллекция фотографий: http://api-fotki.yandex.ru/api/users/{login}/photos/.

В случае успеха сервер возвращает 200 OK и Atom Feed коллекции. Без авторизации будет возвращена информация только о фотографиях с уровнем доступа "для всех" или альбомах, которые содержат хотя бы одну такую фотографию. Этого достаточно что бы организовать фотогаллерею. (Подробнее об авторизации)

В документации API Фоток написано, что НЕ рекомендуется жестко кодировать фиксированные URI ресурсов так как они могут со временем меняться. И рекомендуется всегда начинать работу с чтения сервисного документа. Однако этот подход не всегда удобен. Если запрашивать подряд сервисный документ и коллекцию фотографий или альбомов. То коллекция может не вернуться сервером, хотя документации об этом ничего не сказано. В таком случае, думаю, лучше использовать фиксированный URL.

Коллекции возвращаются постранично. Страницы представляют собой документы Atom Feed, связанные между собой ссылками на следующий документ ("обратная" связь не поддерживается, хотя хотелось бы). На каждой странице может быть не более ста элементов.

Для разбора Atom Feed коллекции будем использовать PHP и объект SimpleXML (присутствует в PHP начиная с версии 5). Он разбирает XML в массив с которым удобно работать.

Рассмотрим пример получения последних 100 фото общей коллекции фото пользователя.

<?php
$albom_foto = getAllFoto("blackbox-ru");
 
if ($albom_foto)
{
  echo "<ul>";
  for ($i=0; $i<count($albom_foto); $i++)
  {
    echo '<li><a href="' . $albom_foto[$i]['ya_link'] . '">' . $albom_foto[$i]['title'] . '</a><br /><br />';    
    echo '<a href="' . $albom_foto[$i]['src'] . 'XL"><img src="' . $albom_foto[$i]['src'] . 'S" alt="" /></a>';    
    echo "</li>";
  }
  echo "</ul>";
}else{
  echo "Error!!!";
}
 
function getAllFoto($username)
{
  $url = 'http://api-fotki.yandex.ru/api/users/'.$username.'/photos/'; // URL ресурса с колекцией всех фото пользователя
  $xml = @file_get_contents($url); // получаем atom feed 
  $date = @simplexml_load_string($xml); // разбираем atom
 
  if ($date) {                            
    $foto = array();   
    $i = 0;
    // перебираем все entry элементы
    foreach ($date->entry as $item) {
      // id фотографии
      $foto_id = $item->id;
      $foto_id = explode(':', $foto_id);
      $foto_id = $foto_id[count($foto_id)-1];
 
      // title фотографии
      $foto_title = $item->title;
 
      // Время создания фотографии
      $foto_published_date = (string)$item->published;
 
      // Время последнего значимого с точки зрения системы изменения фотографии
      $foto_updated_date = (string)$item->updated;
 
      // Флаг, запрещающий показ оригинала фотографии:
      $temp_foto_hide_original = $item->xpath('f:hide_original');
      $foto_hide_original = (string)$temp_foto_hide_original[0]->attributes()->value;
 
      // Ссылка на web-страницу фотографии в интерфейсе Яндекс.Фоток
      $foto_ya_link = $item->xpath('*[@rel="alternate"]');
      $foto_ya_link = (string)$foto_ya_link[0]->attributes()->href;
 
      // Ссылка на графический файл фотографии: (!!! БЕЗ ОКОНЧАНИЯ !!!)
      $foto_src = substr($item->content[0]->attributes()->src, 0, -2);
 
      $foto[$i] = array(
        'id' => $foto_id,
        'title' => $foto_title,     
        'published_date' => $foto_published_date,
        'updated_date' => $foto_updated_date,
        'hide_original' => $foto_hide_original,
        'ya_link' => $foto_ya_link,
        'src' => $foto_src    
      );
 
      $i++;          
    } 
 
    return $foto;       
  } else {
    return 0;
  }
}
?>

Думаю комментарии тут излишни. Аналогичным образом получается коллекция альбомов пользователя и коллекция фотографий альбома.

В процессе моей работы с API Яндекс фоток, были найдены некоторые ошибки и накопились некоторые замечания.

  • Не выводятся описание альбомов. Когда я начал работать с API они выводились, потом перестали почему-то.
  • Не понятно почему нельзя было выводить в API описание фотографий.
  • Нет возможности получить обложку альбома пользователя, хотя в RSS-поток они выводятся.
  • При постраничной выдачей коллекций с сортировкой по EXIF-данным выдаются не рабочие ссылки на следующую коллекцию.
  • В API нет возможности получить метки фотографий.
  • На Яндекс фотках появилась возможность ручной сортировки, было бы неплохо добавить работу с такой сортировкий в API.
  • Не поддерживается обратная связь при постраничной выдачи коллекций. Лучше было бы сделать сервисный документ, содержащий URL всех выдач. Так было бы удобнее работать.

* Все замечания действительны на момент написания статьи (31.08.2009).

Вывод такой: API Яндекс фоток пока далек от идеала, но пользоваться им вполне можно. Надеюсь разработчики исправят ошибки и сделают API лучше и удобнее.

Полезные ссылки:

Тэги: программирование, Яндекс фотки, технологии, полезное

Share/Bookmark

Комментарии:

Илья Якямсев31.Авг.2009 • 04:08

Роман - молодец.

Косыгин Александр1.Сен.2009 • 02:09

Ага

yandex@ fi1.Сен.2009 • 06:09

Рома забыл сказать, что есть такая штука как "Локальный Яндекс" и если у пользователя сайта Яндекс локален, то фотографии скорее всего будут грузиться без ограничения скорости.

Исаев Роман2.Сен.2009 • 10:09

Да, действительно забыл. У меня дома Яндекс как раз локален. Работать очень удобно!

google@ strunin2.Сен.2009 • 12:09

Надо на Хабр отправить.

yandex@ techmea3.Сен.2009 • 01:09

Супер тема, нужно будет обязательно заюзать!

потерянный19.Янв.2011 • 09:01

// Ссылка на графический файл фотографии: (!!! БЕЗ ОКОНЧАНИЯ !!!) и почему то на конце бывает "_XL" а иногда "_orXL" в результате выдаёт надпись "фото недоступно" (но у мя альбомы были открыты!!!) исправил так ищем позицию последнего "_", и обрезаем
$pos = strrpos($item->content[0]->attributes()->src, '_');
$foto_src = substr($item->content[0]->attributes()->src, 0, $pos+1);

Исаев Роман20.Янв.2011 • 02:01

Спасибо за дополнение. Раньше "_orXL" не выводился. Сейчас видимо обновили API.

Павел7.Фев.2011 • 07:02

в этом 2011году создал сайт в конструкторе Народ.ру http://www.photo-rzd.narod.ru и добавил туда фотогалерею без особого труда. Вся система делает автоматически. Ещё бы найти такой же хостинг только уже для вап сайта.

Wlodzimierz8.Фев.2012 • 12:02

Спасибо за код. Помог мне быстро сделать плагин для вывода альбомов в textpattern.

Добавление комментария

Как вас зовут:
E-mail:

или

Комментарии перед публикацией просматриваются и одобряются (или не одобряются), спасибо за понимание.



Напишите нам сейчас

Как вас зовут

Ваши контакты

Ваше сообщение

обзоры сайтов (15), #404fest (11), конференции (11), создание сайтов (8), социальное продвижение (7), лекции (6), семинары (6), а люди не знают (5), полезное (5), маркетинг (5), umi (5), еда (5), технологии (5), дизайн (4), пятница (4), seo (3), иллюстрации (3), образование (2), почта (2), новый год (2), книги (2), Яндекс (2), манифест (1),  (1), эконки (1), mysql (1), картинки (1), алмаз (1), random (1), Встреча дизайнеров (1), вручение призов (1), конкурс (1), gmail (1), softool (1), mail.ru (1), продвижение сайтов (1), музыка (1), ортопринт (1), неожиданно (1), редкие минуты счастья (1), конкурсы и призы (1), сайты (1), tumblr (1), контекст (1), коммуникации (1), бесплатно (1), продвижение (1), семинар (1), picasa (1), faq (1), интервью (1), генерация (1), программирование (1), автомобили (1), копирайтинг (1), Яндекс фотки (1), Hyundai (1), реагенты (1), google (1), интернет в Самаре (1), обеды (1), art in samara (1), Илья негодует (1), ересь (1), реклама (1), дядюшка Гудвин рассказывает (1)

Москва:

(495) 797-26-42

Самара:

(846) 222-92-14
(846) 222-92-13

info@blackbox.ru