Библиотека классов для работы со службой «API Яндекс.Фотки»
Библиотека позволит вам использовать службу «API Яндекс.Фотки» в проектах, написанных на PHP и охватывает все возможности, которые на данный момент предоставляет API.
Страничка, которая посвящена работе библиотеки: code.websaints.net/
Используя эту библиотеку вы можете:
Сервис «Яндекс.Фотки» стоит использовать, так как:
Под катом вы найдете пример работы и его код, снабженный краткими комментариями.
Галерея любимых фотографий Владислава Мамонтовича
Сразу оговорюсь:
— Нет, вы не сможете создать хостинг изображений на основе этого сервиса, так как это будет нарушать п. 1.2.4. пользовательского соглашения службы «API Яндекс.Фотки». Пример выбран именно таким из соображений наглядности и является… не совсем корректным. Я надеюсь, что сотрудники Яндекса отнесутся к нему снисходительно. Или, по крайней мере, предупредят, прежде чем блокировать несчастного Владислава Мамонтовича.
Пример состоит из 2х файлов:
Я не буду акцентировать внимание ни на чем, кроме кода, где непосредственно идет работа с Яндекс.Фотки. Если возникнут вопросы, связанные с каким то кодом — задайте их в комментариях. Я обязательно отвечу.
Какие ключевые возможности должна реализовать эта страница:
1. Создадим пользователя от имени которого будем работать с сервисом. А именно — Владислава Мамонтовича.
2. Получим общую коллекцию фотографий Мамонтовича
3. Получим последние 25 загруженных Мамонтовичем фотографий
4. Перебрав их все сформируем галерею
5. Если Мамонтович загрузил фотографию, то в скрипт был передан идентификатор новой фотографии. Получаем свежезагруженную фотографию по ее id
6. Выводим список ссылок
Какие ключевые возможности должна реализовать эта страница:
1. Так как загрузка фотографий возможна только для аутентифицированного пользователя, то мы создаем объект класса yandex_fotki и аутентифицируемся.
2. После этого надо получить коллекцию фотографий, в которую мы добавим новую фотографию Мамонтовича.
3. И, собственно, загрузим фотографию на Яндекс.Фотки. После загрузки мы получим идентификатор фотографии.
4. Сохраним идентификатор фотографии. Вы можете использовать любой способ, хоть GETом передать. Я для этих целей использую систему сообщений, которая хранит данные в сессии.
5. Направляем Мамонтовича на example.html, где он получит ссылки на загруженную фотографию и увидеть ее в галерее.
Как видите, все предельно просто и приятно.
Используя минимум усилий вы можете внедрить галерею на сайт.
Единственный минус хранения фотографий на Яндекс.Фотки заключается в том, что на запросы метаданных у службы уходит больше времени, чем при хранении их на вашем сервисе. Но разумное использование кэширования практически сводит его на нет.
Огромное спасибо ar2r и nickmitin за помощь с портированием алгоритма шифрования, proto за разьяснения по поводу проекта API Яндекс.Фотки, комментарии и всем всем всем за уделенное мне время. И не менее большое спасибо тем людям с канала #php RusNet, которые дали моей работе экспертную оценку и посоветовали, что можно сделать лучше. mz, avz, focusshifter и всем остальным. Спасибо вам.
Дальше будет поиск и исправление ошибок, рефакторинг кода, написание более подробных статей о использовании библиотеки и идеологии работы Яндек.Фоток, возможно, создание плагинов для нескольких CMS. Да, собственно, все, что будет нужно и интересно мне и вам.
Но для того что бы дальше было хоть что то мне нужно знать, что моя работа кому то нужна. Если вам библиотека может быть полезна — напишите об этом. Не молчите.
P.S. Если вам понравилась библиотека и вы думаете об участии DEVCONF — проголосуйте за мой доклад на сайте конференции: www.devconf.ru/phpconf/offers
Страничка, которая посвящена работе библиотеки: code.websaints.net/
Используя эту библиотеку вы можете:
- Организовать фотогалерею или систему фотогалерей на сайте
- Управлять галереей, включая загрузку и удаление фотографий, создание и удаление альбомов, а так же управление метаданными
Сервис «Яндекс.Фотки» стоит использовать, так как:
- Вы не тратите место на хранение изображений на сервере вашего проекта
- Для работы галереи вам не требуется использование базы данных или другого инструмента, для хранения метаданных и управления ими
- Служба создает картинки предпросмотра шириной 800,500,300,150,100,75 и 50px и вам не нужно делать это самому.
- Высока вероятность того, что сервера Яндекс, на которых будут храниться материалы, более надежны, чем у вашего хостинг провайдера
- Высока вероятность того, что скорость загрузки фотографий пользователем будет выше, чем при загрузке их с вашего сервера
Под катом вы найдете пример работы и его код, снабженный краткими комментариями.
Пример
Галерея любимых фотографий Владислава Мамонтовича
Сразу оговорюсь:
— Нет, вы не сможете создать хостинг изображений на основе этого сервиса, так как это будет нарушать п. 1.2.4. пользовательского соглашения службы «API Яндекс.Фотки». Пример выбран именно таким из соображений наглядности и является… не совсем корректным. Я надеюсь, что сотрудники Яндекса отнесутся к нему снисходительно. Или, по крайней мере, предупредят, прежде чем блокировать несчастного Владислава Мамонтовича.
Пример состоит из 2х файлов:
- example.html — отображение галереи
- upload_image.html — загрузка изображений
Я не буду акцентировать внимание ни на чем, кроме кода, где непосредственно идет работа с Яндекс.Фотки. Если возникнут вопросы, связанные с каким то кодом — задайте их в комментариях. Я обязательно отвечу.
example.html
Какие ключевые возможности должна реализовать эта страница:
- Показать список из 25 последних загруженных Мамонтовичем изображений
- Если нам передан идентификатор загруженного изображения, вывести список ссыллок на созданные службой Яндекс.Фотки картинки предпросмотра и оригинал изображения
- Вывести форму загрузки изображений, что бы Владислав Мамонтович мог пополнять свою галерею
1. Создадим пользователя от имени которого будем работать с сервисом. А именно — Владислава Мамонтовича.
- $photo = new yandex_fotki("MojoElephant");
2. Получим общую коллекцию фотографий Мамонтовича
- $photo->user()->add_photo_collection("Слонофотки");
3. Получим последние 25 загруженных Мамонтовичем фотографий
- $photo->user()->photo_collection("Слонофотки")->se(array("limit"=>25));
4. Перебрав их все сформируем галерею
- foreach($photo->user()->photo_collection("Слонофотки")->photo_list() as $index=>$photo_element){
- $photo_block = new template_class("Фото","../../templates/photo.html");
- $photo_block->point("Точки ввода");
- $photo_block->plug("Точки ввода","Увеличенное","Увеличенное",$photo_element->get_L());
- $photo_block->plug("Точки ввода","Предпросмотр","Предпросмотр",$photo_element->get_XXS());
- $gallery->plug("Точки ввода","Фотография",$index,$photo_block->render());
- }
5. Если Мамонтович загрузил фотографию, то в скрипт был передан идентификатор новой фотографии. Получаем свежезагруженную фотографию по ее id
- $new_photo = $photo->user()->photo_collection("Слонофотки")->get_photo_by_id($photo_id);
6. Выводим список ссылок
- $link_block = new template_class("Ссылки","../../templates/link_block.html");
- $link_block->point("Точки ввода");
- $link_block->plug("Точки ввода","Оригинальная","Ссылка",$new_photo->get_orig());
- $link_block->plug("Точки ввода","XL","Ссылка",$new_photo->get_XL());
- $link_block->plug("Точки ввода","L","Ссылка",$new_photo->get_L());
- $link_block->plug("Точки ввода","M","Ссылка",$new_photo->get_M());
- $link_block->plug("Точки ввода","S","Ссылка",$new_photo->get_S());
- $link_block->plug("Точки ввода","XS","Ссылка",$new_photo->get_XS());
- $link_block->plug("Точки ввода","XXS","Ссылка",$new_photo->get_XXS());
- $link_block->plug("Точки ввода","XXXS","Ссылка",$new_photo->get_XXXS());
upload_image.html
Какие ключевые возможности должна реализовать эта страница:
- Сохранить присланное изображение на сервисе Яндекс.Фотки
- Сообщить example.html идентификатор загруженного на сервер изображения
1. Так как загрузка фотографий возможна только для аутентифицированного пользователя, то мы создаем объект класса yandex_fotki и аутентифицируемся.
- $photo = new yandex_fotki("MojoElephant","пароль");
2. После этого надо получить коллекцию фотографий, в которую мы добавим новую фотографию Мамонтовича.
- $photo->user()->add_photo_collection("Слонофотки");
3. И, собственно, загрузим фотографию на Яндекс.Фотки. После загрузки мы получим идентификатор фотографии.
- $new_photo = array(
- "path"=>"../../uploaded/".$_FILES["photo"]["name"]
- );
- $result = $photo->user()->photo_collection("Слонофотки")->up($new_photo);
4. Сохраним идентификатор фотографии. Вы можете использовать любой способ, хоть GETом передать. Я для этих целей использую систему сообщений, которая хранит данные в сессии.
5. Направляем Мамонтовича на example.html, где он получит ссылки на загруженную фотографию и увидеть ее в галерее.
Заключение
Как видите, все предельно просто и приятно.
Используя минимум усилий вы можете внедрить галерею на сайт.
Единственный минус хранения фотографий на Яндекс.Фотки заключается в том, что на запросы метаданных у службы уходит больше времени, чем при хранении их на вашем сервисе. Но разумное использование кэширования практически сводит его на нет.
Материалы для дополнительного изучения
- Портированная на Java script и Python нестандартная функция RSA шифрования
- Документация службы «API Яндекс.Фотки»
- Пользовательское соглашение службы «API Яндекс.Фотки»
- Клуб API Яндекс.Фоток
- Сайт моей библиотеки классов на PHP
Спасибо
Огромное спасибо ar2r и nickmitin за помощь с портированием алгоритма шифрования, proto за разьяснения по поводу проекта API Яндекс.Фотки, комментарии и всем всем всем за уделенное мне время. И не менее большое спасибо тем людям с канала #php RusNet, которые дали моей работе экспертную оценку и посоветовали, что можно сделать лучше. mz, avz, focusshifter и всем остальным. Спасибо вам.
Код подсвечен highlight.hohli.com/ который придумал antonshevchuk
Что дальше?
Дальше будет поиск и исправление ошибок, рефакторинг кода, написание более подробных статей о использовании библиотеки и идеологии работы Яндек.Фоток, возможно, создание плагинов для нескольких CMS. Да, собственно, все, что будет нужно и интересно мне и вам.
Но для того что бы дальше было хоть что то мне нужно знать, что моя работа кому то нужна. Если вам библиотека может быть полезна — напишите об этом. Не молчите.
P.S. Если вам понравилась библиотека и вы думаете об участии DEVCONF — проголосуйте за мой доклад на сайте конференции: www.devconf.ru/phpconf/offers



комментарии (49)