Яндекс фотки на вашем сайте
Хочу рассказать, как можно использовать 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 лучше и удобнее.
Полезные ссылки:
- API Яндекс фоток
- The Atom Publishing Protocol
- SimpleXML object
- Клуб API Яндекс.Фоток
- Клуб сервиса Яндекс.Фотки
Комментарии:
Ага
Рома забыл сказать, что есть такая штука как "Локальный Яндекс" и если у пользователя сайта Яндекс локален, то фотографии скорее всего будут грузиться без ограничения скорости.
Да, действительно забыл. У меня дома Яндекс как раз локален. Работать очень удобно!
Надо на Хабр отправить.
Супер тема, нужно будет обязательно заюзать!
// Ссылка на графический файл фотографии: (!!! БЕЗ ОКОНЧАНИЯ !!!) и почему то на конце бывает "_XL" а иногда "_orXL" в результате выдаёт надпись "фото недоступно" (но у мя альбомы были открыты!!!) исправил так ищем позицию последнего "_", и обрезаем
$pos = strrpos($item->content[0]->attributes()->src, '_');
$foto_src = substr($item->content[0]->attributes()->src, 0, $pos+1);
Спасибо за дополнение. Раньше "_orXL" не выводился. Сейчас видимо обновили API.
в этом 2011году создал сайт в конструкторе Народ.ру http://www.photo-rzd.narod.ru и добавил туда фотогалерею без особого труда. Вся система делает автоматически. Ещё бы найти такой же хостинг только уже для вап сайта.
Спасибо за код. Помог мне быстро сделать плагин для вывода альбомов в textpattern.
Добавление комментария
|
или |





Илья Якямсев • 31.Авг.2009 • 04:08
Роман - молодец.