PHP

индекс
206,19

Библиотека классов для работы со службой «API Яндекс.Фотки»

Библиотека позволит вам использовать службу «API Яндекс.Фотки» в проектах, написанных на PHP и охватывает все возможности, которые на данный момент предоставляет API.
Страничка, которая посвящена работе библиотеки: code.websaints.net/

Используя эту библиотеку вы можете:
  • Организовать фотогалерею или систему фотогалерей на сайте
  • Управлять галереей, включая загрузку и удаление фотографий, создание и удаление альбомов, а так же управление метаданными

Сервис «Яндекс.Фотки» стоит использовать, так как:
  • Вы не тратите место на хранение изображений на сервере вашего проекта
  • Для работы галереи вам не требуется использование базы данных или другого инструмента, для хранения метаданных и управления ими
  • Служба создает картинки предпросмотра шириной 800,500,300,150,100,75 и 50px и вам не нужно делать это самому.
  • Высока вероятность того, что сервера Яндекс, на которых будут храниться материалы, более надежны, чем у вашего хостинг провайдера
  • Высока вероятность того, что скорость загрузки фотографий пользователем будет выше, чем при загрузке их с вашего сервера

Под катом вы найдете пример работы и его код, снабженный краткими комментариями.


Пример


Галерея любимых фотографий Владислава Мамонтовича

Сразу оговорюсь:
— Нет, вы не сможете создать хостинг изображений на основе этого сервиса, так как это будет нарушать п. 1.2.4. пользовательского соглашения службы «API Яндекс.Фотки». Пример выбран именно таким из соображений наглядности и является… не совсем корректным. Я надеюсь, что сотрудники Яндекса отнесутся к нему снисходительно. Или, по крайней мере, предупредят, прежде чем блокировать несчастного Владислава Мамонтовича.

Пример состоит из 2х файлов:
  1. example.html — отображение галереи
  2. upload_image.html — загрузка изображений

Я не буду акцентировать внимание ни на чем, кроме кода, где непосредственно идет работа с Яндекс.Фотки. Если возникнут вопросы, связанные с каким то кодом — задайте их в комментариях. Я обязательно отвечу.

example.html


Какие ключевые возможности должна реализовать эта страница:
  • Показать список из 25 последних загруженных Мамонтовичем изображений
  • Если нам передан идентификатор загруженного изображения, вывести список ссыллок на созданные службой Яндекс.Фотки картинки предпросмотра и оригинал изображения
  • Вывести форму загрузки изображений, что бы Владислав Мамонтович мог пополнять свою галерею


1. Создадим пользователя от имени которого будем работать с сервисом. А именно — Владислава Мамонтовича.

  1. $photo = new yandex_fotki("MojoElephant");


2. Получим общую коллекцию фотографий Мамонтовича

  1. $photo->user()->add_photo_collection("Слонофотки");


3. Получим последние 25 загруженных Мамонтовичем фотографий

  1. $photo->user()->photo_collection("Слонофотки")->se(array("limit"=>25));


4. Перебрав их все сформируем галерею

  1. foreach($photo->user()->photo_collection("Слонофотки")->photo_list() as $index=>$photo_element){
  2. $photo_block = new template_class("Фото","../../templates/photo.html");
  3. $photo_block->point("Точки ввода");
  4. $photo_block->plug("Точки ввода","Увеличенное","Увеличенное",$photo_element->get_L());
  5. $photo_block->plug("Точки ввода","Предпросмотр","Предпросмотр",$photo_element->get_XXS());
  6. $gallery->plug("Точки ввода","Фотография",$index,$photo_block->render());
  7. }


5. Если Мамонтович загрузил фотографию, то в скрипт был передан идентификатор новой фотографии. Получаем свежезагруженную фотографию по ее id

  1. $new_photo = $photo->user()->photo_collection("Слонофотки")->get_photo_by_id($photo_id);


6. Выводим список ссылок

  1. $link_block = new template_class("Ссылки","../../templates/link_block.html");
  2. $link_block->point("Точки ввода");
  3. $link_block->plug("Точки ввода","Оригинальная","Ссылка",$new_photo->get_orig());
  4. $link_block->plug("Точки ввода","XL","Ссылка",$new_photo->get_XL());
  5. $link_block->plug("Точки ввода","L","Ссылка",$new_photo->get_L());
  6. $link_block->plug("Точки ввода","M","Ссылка",$new_photo->get_M());
  7. $link_block->plug("Точки ввода","S","Ссылка",$new_photo->get_S());
  8. $link_block->plug("Точки ввода","XS","Ссылка",$new_photo->get_XS());
  9. $link_block->plug("Точки ввода","XXS","Ссылка",$new_photo->get_XXS());
  10. $link_block->plug("Точки ввода","XXXS","Ссылка",$new_photo->get_XXXS());


upload_image.html


Какие ключевые возможности должна реализовать эта страница:
  • Сохранить присланное изображение на сервисе Яндекс.Фотки
  • Сообщить example.html идентификатор загруженного на сервер изображения

1. Так как загрузка фотографий возможна только для аутентифицированного пользователя, то мы создаем объект класса yandex_fotki и аутентифицируемся.

  1. $photo = new yandex_fotki("MojoElephant","пароль");


2. После этого надо получить коллекцию фотографий, в которую мы добавим новую фотографию Мамонтовича.

  1. $photo->user()->add_photo_collection("Слонофотки");


3. И, собственно, загрузим фотографию на Яндекс.Фотки. После загрузки мы получим идентификатор фотографии.

  1. $new_photo = array(
  2. "path"=>"../../uploaded/".$_FILES["photo"]["name"]
  3. );
  4. $result = $photo->user()->photo_collection("Слонофотки")->up($new_photo);


4. Сохраним идентификатор фотографии. Вы можете использовать любой способ, хоть GETом передать. Я для этих целей использую систему сообщений, которая хранит данные в сессии.

5. Направляем Мамонтовича на example.html, где он получит ссылки на загруженную фотографию и увидеть ее в галерее.

Заключение


Как видите, все предельно просто и приятно.
Используя минимум усилий вы можете внедрить галерею на сайт.
Единственный минус хранения фотографий на Яндекс.Фотки заключается в том, что на запросы метаданных у службы уходит больше времени, чем при хранении их на вашем сервисе. Но разумное использование кэширования практически сводит его на нет.

Материалы для дополнительного изучения



Спасибо


Огромное спасибо ar2r и nickmitin за помощь с портированием алгоритма шифрования, proto за разьяснения по поводу проекта API Яндекс.Фотки, комментарии и всем всем всем за уделенное мне время. И не менее большое спасибо тем людям с канала #php RusNet, которые дали моей работе экспертную оценку и посоветовали, что можно сделать лучше. mz, avz, focusshifter и всем остальным. Спасибо вам.

Код подсвечен highlight.hohli.com/ который придумал antonshevchuk



Что дальше?


Дальше будет поиск и исправление ошибок, рефакторинг кода, написание более подробных статей о использовании библиотеки и идеологии работы Яндек.Фоток, возможно, создание плагинов для нескольких CMS. Да, собственно, все, что будет нужно и интересно мне и вам.
Но для того что бы дальше было хоть что то мне нужно знать, что моя работа кому то нужна. Если вам библиотека может быть полезна — напишите об этом. Не молчите.

P.S. Если вам понравилась библиотека и вы думаете об участии DEVCONF — проголосуйте за мой доклад на сайте конференции: www.devconf.ru/phpconf/offers
+24
23 марта 2010, 21:50
79

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

+1
SamDark #
Если CURL сейчас штука довольно стандартная, то GMP поставить будет на виртуальном хостинге проблемно.
+1
SilentImp #
Тестовый пример именно на виртуальном хостинге.
По первому требованию доставили.
Без этой библиотеки мне нужно садится и писать дополнительно библиотеку для работы с большими числами.
Если проблема с GMP будет распространена — я так и сделаю.
Но пока это не самый важный пункт в todo листе.
Впрочем: скоро узнаю по отзывам важно это или нет.
0
Vamp #
BCmath хорошо работает с большими числами.
А ещё есть PEAR::Math_BigInteger.
–1
SilentImp #
Разве BCmath более распространена? Я не этого не замечал. По моему что одно что другое доставлять.
Или это не так?
+2
Vamp #
BCmath ещё с 4 версии встроен в ядро.
Да и по опыту могу сказать, что BCmath встречается намного чаще GMP. Мне встречался только один хостинг без BCmath (впрочем, GMP там тоже не оказалось). Пришлось выкручиваться с помощью PEAR::Math_BigInteger.
0
SilentImp #
В таком случае подумаю о том, что бы переписать функцию RSA шифрования с использованием BCmath
+8
SamDark #
Не нравится именование методов. Например, методы photo_collection, token, annulment, authentication, delete_ns класса yandex_fotki_user заставляют лезть в документацию. Если бы они соответственно назывались, например, getPhotoCollection, getToken, removeToken, authentificate и deleteNameSpace, лезть в код не пришлось бы.
–3
Ar2r #
+1
0
baibaratsky #
authenticate
0
SamDark #
То же можно сказать про именование классов. Все исключения у вас стандартно с буквы в верхнем регистре, остальные классы очень нестандартно буквами в нижнем регистре.
0
SamDark #
Не используется PHPDoc — всех прелестей дополнения по нему в современных IDE мы не получим.
0
SilentImp #
Я использовал dOxygen.
А о каких прелестях речь? Можно поподробнее?
+2
SamDark #
0
SilentImp #
Спасибо, сейчас посмотрю.
+1
SamDark #
Несмотря на приведённую выше критику, стоит похвалить за наличие документации как таковой, замечательной демонстрации, ну и собственно за решённую проблему.
+1
SilentImp #
Спасибо.
А что касается документации… если библиотека будет востребована, то документация будет не генерирована а написана мной.
Как и статьи, которые полностью проиллюстрируют ее работу.
0
SamDark #
Готов использовать, если дадите помочь с API, именованием методов и PHPDoc.
0
SilentImp #
Буду только рад.
+1
Ar2r #
Молодец! Осталось дождаться когда кто-то начннет его использовать.

Исходники посмотрю, что бы подпосмотреть как альбомы создаются и привязываются фотки к ним =)))

Думаю как проставлять теги, т.к. в стандартном их апи нет такой функци.
0
SilentImp #
Если нужны теги — придется хранить их у себя на сервере.
Если это действительно интересно, то я могу дописать эту возможность.
А привязка по идентификатору альбома или фотографии, естественно.
+2
syno #
Отличная работа. Спасибо за библиотеку.
Не знаю, существенно это или нет, но глаз зацепился:
$extension = explode(".",$_FILES[«photo»][«name»]);
$extension = $extension[1];
Так как меня, в свое время, задолбали пользователи, которые усиленно пытались загрузить нечто вроде moya.fotka.jpg, тем самым приучив меня использовать только последний (а не второй) элемент массива.
0
SilentImp #
Спасибо, сейчас поправлю.
Вы абсолютно правы.
0
SilentImp #
Теперь: $extension = $extension[count($extension)-1];
Спасибо.
0
Ar2r #
а если фотка без разрешения? =)))
+1
syno #
Без разрешения даже конфеты брать нельзя, не то что фотки загружать )
–1
Ar2r #
лол. я про расширение =)))))))))))))))))))

молодец, подколол!
0
SilentImp #
Для нормального фото-хостинга надо было бы вообще не смотреть на разрешения, а использовать библиотеку типа getid3.sourceforge.net/ и определять содержимое файла по mime-типу и мета-информации, содержащейся в файле.
Но это только пример, призванный проиллюстрировать работу библиотеки.
0
Vamp #
Уж лучше strrchr()
+2
crocodile2u #
0
iexx #
А мне нравится API Google picasa =) я с ней все интегрировал
+2
SilentImp #
По-моему, это очень хорошо, когда есть выбор инструментов, с которыми можно работать, верно?
0
Bonch #
Не планируете ли сделать эту библиотеку частью пакета Service в Zend Framework? Это было бы архиполезно!
0
SilentImp #
Я никогда не пользовался Zend Framework.
Так что пока не планирую.
Но если это действительно будет полезно — разберусь что это и с чем его едят и сделаю.
Спасибо за комментарий — записал себе памятку по этому поводу.

Любые пожелания очень даже приветствуются.

0
xqz_me #
Здорово! Если сделаете интеграцию в Wordpress — будет просто супер.
0
SilentImp #
А какие именно возможности вы хотели бы увидеть в плагине для WP?
0
xqz_me #
Хотелось бы, чтобы при вставке фотографий в пост (как при выборе «Загрузка с компьютера») выбранный файл автоматический загружался на Яндекс.Фотки, а уже оттуда вставлялся в пост. Только чтобы при этом альтернативный текст при наведении мыши отображался и можно было название файл на читаемое поменять.
0
Ar2r #
Для вывода фотографий из яндекс.фоток уже есть написанный плагин. пользуемся яндексом.

adw0rd.ru/2009/yandex-fotki-wp-plugin/
0
SilentImp #
Ar2r Я так понял, что человек хочет с вохможностью загрузки на аккаунт.
+1
tebuchet #
Насчет плагина под WP: Хочу, чтобы создавалась дополнительная страницу с название «Галерея» или «Портфолио» (название можно было бы менять в админке), на которой выводилось бы перечисление всех фотографий с названием, тегами, описанием, тп. Фотографии были бы разбиты по альбомам. Название альбома, под ним все фотографии из этого альбома. Вывод осуществлялся бы отдельным файлом-шаблоном, который можно было бы редактировать, чтобы убрать ненужную информацию, управлять видом и тп. По возможности можно было бы добавить функции-теги, типа «все_фотографии(разбивать_по_альбомам=1&исключить_альбомы_с_ид=4,6,9)» или «Фотографии_альбома(ид=6&указывать_название_альбома=0)» или «вывести_ссылки_на_фотографии(ид_альбома=6&использовать_нумерованный_список=1)»
В принципе добавления тегов было бы достаточно, создатели темы сами сделают с ними то, чего захотят. Мне было бы очень полезно.
Если надумаете такое или что угодно еще, связанное с WP — помогу с удовольствие. Могу подумать, какие функции нужно было бы минимум, какие желательно
0
SilentImp #
Хорошо, постараюсь реализовать.
Плагин для WP в todo-листе есть и будет сделан.
Но до того, как я возьмусь за плагины, мне еще предстоит немало порефакторить саму библиотеку.
0
Ar2r #
Что бы потом не пришлось рефакторить плагины и другие штуки — нужно создать класс интерфейс, через который будет происходить вызов нужных функций из класса работы с яндекс.фотками.

PS: Мой плагин до сих пор не одобрили на addons.mozilla.org :-))
0
SilentImp #
Интерфейс imo имеет смысл создавать, если его методы, хотя бы в перспективе, будут реализовывать несколько классов.
В принципе значительную часть нужных изменений я внес.
Сейчас пишутся тесты на phpUnit.

P.S. Мой вот вообще оказался кроме меня толком никому не нужным :) Не разочаровывайся. В мозилла просто в этом плане оооочень неповоротливая, насколько я знаю. Одобрят. Он у тебя получился здоровский.
+1
Ar2r #
надо бы его доделать =) а то много всего хочу реализовать… реинжиниринг кода много времени отнимает.
0
SilentImp #
Похвальное начинание. Удачи!
+1
Arceny #
У вас в example.php в исходниках, выложенных на сайте спалены логин/пароль от аккаунта SilentImp на яндексе
0
SilentImp #
omg. спасибо. кстати надо новые примеры выкладывать уже. API уже успел обновится с того момента >_<
+1
Arceny #
Ага, API кажется изменился. У меня не получилось заставить ваши классы работать вчера.
Например после логина вызов $user->addAlbumCollection() возвращает пустой массив.

Кроме того у меня почему-то в упор не проходит аутентификация для одного из пользователей, у которого в логине содержится дефис. Получаю ошибку Malformed credentials data, что судя по API соответствует неверно сформированному запросу.
Но, на сколько я понимаю, аутентификация вообще не обязательна, если будут использоваться только публичные альбомы и запросы на чтение.

Если обновится — дайте знать.
0
SilentImp #
промазал с ответом.
habrahabr.ru/blogs/php/88666/#comment_3504432
0
SilentImp #
Да, если чтение, то авторизация не нужна.
API «внезапно» поменяли с месяц назад. Можете посмотреть в их блоге.
Часть изменений я внес, но из за работки никак не могу все завершить и выложить.
Сейчас с текучкой разберусь и попробую добить, раз им кто то пользуется. )

Только зарегистрированные пользователи могут оставлять комментарии. Войдите, пожалуйста.