Pull to refresh

Ruby on Rails и Яндекс.Фотки API: показываем последние фотографии на домашней странице

Reading time 2 min
Views 1.8K
image
Уже пару лет пользуюсь сервисом Яндекс.Фотки для хранения всех своих фотографий, а недавно возникло желание на своей домашней страничке выводить последние n фотографий, загруженных на Яндекс.Фотки, тем самым убив сразу несколько зайцев:
  • домашняя страничка не требует администрирования;
  • не требуется хранение и управление изображениями;
  • не требуется заниматься ресайзингом изображений для превью и т.д.


Сказано — сделано. Оказалось, что Фотки предоставляют достаточно удобный API по протоколу AtomPub. Т.к. страничку планировал делать на платформе Ruby on Rails, после непродолжительных поисков нашел неплохую библиотеку для работы feedzirra. Устанавливалась библиотека совершенно стандартным образом:
  1. gem sources -a gems.github.com
  2. gem install pauldix-feedzirra

и далее в ruby достаточно прописать ее использование:
  1. require 'feedzirra'

Пришло время изучить предоставляемый API

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

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

Таким образом, я создал некий класс-оболочку для изображения
  1. class ImageBundle
  2.  attr_accessor :url, :album_link, :title, :xxl_url
  3. end

здесь 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


Вывод на 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}
Tags:
Hubs:
+4
Comments 6
Comments Comments 6

Articles