понедельник, 15 марта 2010 г.

Использование API Яндекс.Фотки в приложении Ruby on Rails

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

  • Неограниченный объем для хранения, нет никаких ограничений

  • Всегда можно получить доступ к оригинальному изображению

  • Удобно просматривать фотографии, группировать по альбомам, проводить поиск

  • Появилась возможность привязывать фотографии к картам

  • Видно, что сервис активно развивается



Недавно возникло желание на своей домашней страничке выводить последние n фотографий, загруженных на Яндекс.Фотки, тем самым убив сразу несколько зайцев:

  • домашняя страничка не требует администрирования

  • не требуется хранение и управление изображениями

  • не требуется заниматься ресайзингом изображений для превью и т.д.



Сказано -- сделано. Оказалось, что Фотки предоставляют достаточно удобный API по протоколу AtomPub.

Т.к. страничку планировал делать на платформе Ruby on Rails, после непродолжительных поисков нашел неплохую библиотеку для работы feedzirra. Устанавливалась библиотека совершенно стандартным образом:
  1. gem sources -a http://gems.github.com
  2. gem install pauldix-feedzirra
* This source code was highlighted with Source Code Highlighter.

и далее в ruby достаточно прописать ее использование:
  1. require 'feedzirra'
* This source code was highlighted with Source Code Highlighter.


Поизучав предоставляемый Яндексом API выяснилось, что список последних опубликованных пользователем фотографий можно получить по следующему URL:
http://api-fotki.yandex.ru/api/users/<ЛОГИН_ПОЛЬЗОВАТЕЛЯ>/photos/published/?limit=<КОЛИЧЕСТВО_ПОЛУЧАЕМЫХ_ИЗОБРАЖЕНИЙ>

* This source code was highlighted with Source Code Highlighter.

к тому же авторизация для этой операции не требуется. В документации был пример выходного XML, однако оказалось, что он не совсем соответствует действительности. Методом пристального дебага проблема была решена.

Таким образом, я создал некий класс-оболочку для изображения
  1. class ImageBundle
  2.  attr_accessor :url, :album_link, :title, :xxl_url
  3. end
* This source code was highlighted with Source Code Highlighter.

здесь url -- адрес превью картинки квадратной формы, album_link -- ссылка на альбом, title -- название картинки, xxl_url -- адрес картинки большого формата.

Далее в контроллере заполнил коллекцию полученных данных
  1. feed = Feedzirra::Feed.fetch_and_parse("http://api-fotki.yandex.ru/api/users/ligrimp/photos/published/?limit=35")
  2.   @images = Array.new
  3.   for image in feed.entries
  4.    image_url = image.links[3]
  5.  
  6.    i = ImageBundle.new
  7.    i.xxl_url= image_url.clone
  8.  
  9.    image_url["XL"] = "XXS"
  10.    i.url= image_url
  11.  
  12.    i.album_link = image.links[2]
  13.    i.title = image.title
  14.    @images << i
  15.   end
* This source code was highlighted with Source Code Highlighter.


Вывод на UI оказался делом техники, используя HAML для разметки и iLoad у меня получилось примерно следующее:

  1.  - for image in @images
  2.   %a{:href=>image.xxl_url, :target => "_blank", :rel=>"iLoad::Yandex.fotki", :title => image.title}
  3.    %img{:src=>image.url, :title => image.title}
* This source code was highlighted with Source Code Highlighter.

Итоговый результат можно увидеть на моей персональной страничке

1 комментарий:

  1. «Я не могу достаточно похвалить г-на Бенджамина за его помощь в получении ссуды на покупку нашего нового дома для нашей семьи. У Бенджамина было много информации, и он помог мне и моей семье понять, почему жилищный заем был лучшим вариантом в нашей конкретной ситуации. После переговоров с Бенджамином и нашим финансовым консультантом все согласились, что жилищный заем был идеальным решением. Если вы также ищете какой-либо кредит, вы можете связаться с г-ном Бенджамином по электронной почте / Whatsappemail: 247officedept@gmail.com Whatsapp: + 1-989- 394-3740

    ОтветитьУдалить