Журнал LinuxFormat - перейти на главную

LXF132:libferris

Материал из Linuxformat
Перейти к: навигация, поиск
libferris Управляем содержимым web-сайтов через интерфейс файловой системы

Содержание

libferris: Опыты с Web 2.0

Хотите выгрузить изображение на Flickr или видеоролик на YouTube, не запуская браузер? С libferris и знаниями Бена Мартина это возможно.


В последних версиях виртуальной файловой системы libferris сфера ее применения расширилась, включив сайты современных социальных сетей. Чтобы выгрузить свежий видеоролик на YouTube или снимок с мобильного телефона на Flickr, больше не нужен браузер. Ваша любимая программа для просмотра изображений также сможет загружать изображения с этих сайтов.

Сайты социальных сетей, фото- и видеохостинги в данной серии из двух статей я буду называть «web-сервисами», хотя это и термин из области распределенных вычислений: термин «социальная сеть», который теснее связан с Flickr, YouTube, Facebook и т. д., изрядно обвешан другими ассоциациями.

Есть масса программ, помогающих выгрузить контент на тот или иной web-сервис. Некоторые программы-просмотрщики так же позволяют публиковать изображения на популярных онлайн-ресурсах. Однако реализация поддержки на уровне приложения имеет тот недостаток, что в каждой программе должна быть явная поддержка каждого web-сервиса. Вы неизбежно наткнетесь на утилиту, которая не сможет сохранить данные на очередном сайте. А вот бы, например, ваш сайт фотохостинга был просто файловой системой! Тогда можно было бы просмотреть его в любом редакторе, открыть в GIMP, изменить и снова сохранить в сети.

Понятие файловой системы может быть расширено от настольного компьютера до встраиваемых устройств – через сеть. Существует множество мелких утилит для мобильных телефонов, позволяющих публиковать фотографии онлайн. Будет это учетной записью Flickr или статусом Facebook, зависит от того, что позволяет программа. Производители телефонов стараются создавать партнерства с сайтами, таким образом вынуждая вас выбирать одного из их хостинг-провайдеров. Но будь эти сайты файловыми системами, вы бы просто копировали (командой cp) свежий ролик с вашего телефона через Bluetooth прямиком в Vimeo. Во всяком случае, выбор web-сервиса всегда должен оставаться за вами.

Армия разработчиков

К сожалению для пользователей этих web-сервисов, большинство провайдеров не облегчает разработчикам свободного ПО создание приложений для взаимодействия со своими службами, предоставляя только API Representational State Transfer (Rest), через который разработчик может получить список изображений, постов, видеороликов, комментариев и т. д. и выгрузить новое содержимое. Проблема обычно не в самом API, а в том, что web-сервис ожидает, что приложение аутентифицирует себя.

Для разных сайтов этот процесс немного отличается, но суть его в том, что для получения разрешения действовать от имени пользователя (выгружать данные и т. д.) программа должна пройти авторизацию на сайте. У каждого приложения есть ключ и некий общий с web-сервисом «секрет». Он требуется только на начальной фазе, когда приложение спрашивает сайт и пользователя, можно ли работать с вашим содержимым.

Проблема в том, что «секрет» должен оставаться секретом, а в приложении с открытым исходным кодом спрятать его негде. По сути, то же справедливо и для проприетарных программ – если кто-то захочет узнать пароль, используемый исполняемым файлом утилиты для выгрузки фотографий во Flickr, он сможет извлечь его уймой способов. Хотя пароль не передается по сети, он весьма предсказуемым образом используется перед тем, как у строки берется MD5. Так как приложение скорее всего применяет существующую реализацию MD5, легко прервать выполнение файла и вытащить из него пароль сразу после появления (известного) кода для вычисления хэша. Процесс аутентификации приложения у web-сервиса приведен в документации разработчика Flickr.

К сожалению, в условиях использования web-сервисов обычно указывается, что разработчику нельзя раскрывать «секрет». Но не все потеряно. Приложение с открытым исходным кодом все еще прекрасно может пользоваться Flickr или YouTube, нужно только дать ему ключ приложения и пароль. Это как автомобиль без ключа зажигания – когда вы добудете ключ, он заведется.

Так каждый пользователь открытого ПО становится и «разработчиком». Он заходит на нужный web-сервис, регистрируется в системе как разработчик и получает ключ приложения и «секрет». Поместив их в файл, он может авторизовать созданное приложение (фактически – открытую утилиту, которую он скомпилировал и установил) у web-сервиса и начать им пользоваться. Условия использования сервиса для разработчика в этом случае могут приниматься или отвергаться каждым пользователем по его желанию. Конечно, для пользователя это лишнее неудобство, но это единственный способ распространения открытой программы, при котором условия использования сервиса не будут нарушены путем разглашения секретной информации.

Обычно для коммерческих и бесплатных приложений предусмотрены различные условия использования web-сервисов. Так как файловую систему легко применить в коммерческих целях, выбирать условия использования сервиса должен пользователь.

Входим на сайт

Для Flickr получите ключ API и «секрет» по адресу http://www.flickr.com/services/api/keys/apply и запишите их в файлы ~/.ferris/flickr-api-key.txt и ~/.ferris/flickr-api-secret.txt соответственно. Ключи и «секреты» для всех web-сервисов хранятся в каталоге ~/.ferris в отдельных файлах.

Для фотохостинга 23hq вы можете создать свои ключ и «пароль» самостоятельно. Их следует сохранить в файлах 23hq-api-key.txt и 23hq-api-secret.txt, соответственно. Эта политика может измениться в будущем, но поскольку 23hq использует Flickr API, для его ключа и «секрета» применяются те же самые файлы.

Чтобы настроить доступ к Facebook, зарегистрируйте «приложение» и поместите ключ API и «секрет» в файлы facebook-api-key.txt и facebook-api-secret.txt. Настройка доступа к Facebook – один из наиболее трудоемких процессов, потому что вместо простого получения ключа и «секрета» она напоминает написание небольшого web-приложения.


Чтобы получить разрешение на выгрузку в Vimeo, нам понадобилось около недели – все может измениться, но по крайней мере готовьтесь подождать. Из раздела Ресурсы в конце урока вы узнаете, где добыть ключ и «секрет» для Vimeo; поместите их в файлы vimeoapi-key.txt и vimeo-api-secret.txt соответственно. Обратите внимание, что нужно явно отправить запрос на получение ключа через web-интерфейс.

Получение ключа и «секрета» – только полпути к монтированию сайтов. Далее запустите приложение ferris-capplet-auth (см. рисунок), выберите web-сервис, в котором вы хотите авторизоваться с помощью libferris, и нажмите на кнопку Authenticate [Аутентификация]. Если ключ API в порядке, появится диалог с URL-адресом и кнопкой, позволяющей открыть его в Firefox. Сделав это, вы сможете сообщить web-сервису, что авторизуете взаимодействие с libferris (с вашими ключом API и паролем). Затем вернитесь в диалог ferris-capplet-auth и нажмите на кнопку OK, так что libferris свяжется с web-сервисом для завершения аутентификации.


После исчезнования диалога интерфейс ferris-capplet-auth должен показать вам статус ‘authentication OK’ для этого web-сервиса. Теперь мы готовы его смонтировать.

Для Google на данный момент libferris поддерживает только клиентский вход (Client Login). Пока libferris не получил поддержку дополнительного API аутентификации Google, нужно передавать ему имя пользователя и пароль напрямую.

Не только для суперкомпов

Так как libferris поддерживает монтирование множества файловых систем, она может показаться новичкам, особенно тем, кто захочет скомпилировать ее из исходников, немного громоздкой. Libferris доступна в двоичных пакетах для последних версий Fedora, а также для устройств Maemo Diablo (N8x0). Часть из предлагаемых libferris вещей лучше всего выполняется на быстром процессоре с не менее чем 4 ГБ ОЗУ, а часть сработает и на более скромной системе с процессором ARM частотой 400 МГц и 128 МБ ОЗУ.

Эти забавные файлы

Итак, теперь мы готовы порезвиться с некоторыми сайтами. Ура! Libferris – виртуальная файловая система адресного пространства пользователя. Она во многом похожа на gnome-vfs (или gio) или KIO slaves в KDE. Можно либо пользоваться клонами coreutils, типа переделок cpferriscp и gfcp, либо смонтировать саму libferris с помощью Fuse и применять утилиты для работы с обычными файловыми системами.

Команда ferriscp работает в консоли как cp, а gfcp открывает графическое окно GTK. Обе имеют одинаковый набор ключей командной строки, хотя ferriscp молча игнорирует опции, относящиеся к графическому интерфейсу. Также существуют команды ferrisls, ftouch, fcat, fmkdir и т. д. – это клоны известных утилит командной строки с небольшими расширениями тут и там.

Видеофайл загружается на сайт таким образом:

$ gfcp ~/my-video.avi youtube://upload/

А как насчет видео, которое вы сняли на свой смартфон? Если вы можете смонтировать телефон через Bluetooth с помощью obexfs, загрузка видеофайла на сайт делается так:

$ gfcp ~/fuse/my-phone/.../latest.mp4 youtube://upload/

Хотите загрузить изображение на 23hq (или другой сайт, который использует Flickr API)? Вот вам набор команд:

$ alias 23hqu=”ferriscp --target-directory 23hq://me/upload”
$ 23hqu /tmp/foo.jpg


Команда ferris-redirect работает так же, как оператор перенаправления bash >. Зная, что последовательность | ferrisredirect эквивалентна >, вы сможете перенаправлять данные в любую файловую систему libferris. Укажите имя файла, в который нужно записать данные, и стандартный поток ввода ferris-redirect будет выведен в этот файл.

$ ftouch google://docs/datefileA.txt
$ date | ferris-redirect google://docs/datefileA.txt
$ fcat google://docs/datefileA.txt
Thu Aug 20 22:19:49 EST 2009

API Flickr

Учтите, что API Flickr поддерживается множеством сайтов, и любой из них должен быть доступен вам через libferris. Если интересный вам сайт с API Flickr «не дружит» с libferris, потребуется лишь создать производный класс от WebPhotos в libferriswebphotos_shared.cpp и возвратить URL-адрес вашего сайта и пути к ключу приложения и «секрету». Вы наверняка захотите расширить ferris-capplet-auth, чтобы аутентифицировать пользователей через графический интерфейс.

Реализация API Flickr началась в середине 2008 года с поддержки выгрузки фотографий. Это подразумевает возможность установки прав доступа по умолчанию через расширенные атрибуты (Extended Attributes), которые передаются посредством Flickr API вместе со снимком. Интерфейс Extended Attribute (EA) файловой системы позволяет связывать с файлами произвольные метаданные в формате «ключ–значение».


В libferris концепция расширенных атрибутов виртуализирована, и они могут сохраняться на диске и считываться с него или получаться другими способами. Например, чтение атрибута MD5 заставит libferris вычислить MD5‑хэш содержимого файла и вернуть его вам. Libferris может также перекрывать метаданные приложений; например, тэги, назначенные в F-Spot, являются для libferris такими же расширенными атрибутами.

Так как libferris поддерживает метаданные через расширенные атрибуты, можно заставить его скопировать некоторые из них на Flickr вместе с вашей фотографией. Как видно на экранном снимке, я включил размер, хэш MD5 и все метаданные из программы F-Spot во все выгрузки на 23hq. Опубликовав фотографию, libferris записывает некоторые новые атрибуты в локальный файл изображения. Имя сайта, на который был выгружен снимок, сохраняется в webphotoservice, а идентификатор фотографии – в webphoto-photo-id. Таким образом, легко увидеть, выгружено ли изображение, и если да – получить его адрес на сайте.

Экономим время на команды

Набирать ferris-redirect каждый раз при записи данных в файлы довольно нудно, но можно заставить Bash заменить это на более удобные команды перенаправления в libferris-совместимом тексте.

Для ввода Bash использует утилиту readline, у которой есть файл настройки, позволяющий заменить одну текстовую строку другой. Чтобы это заработало, добавьте следующие ниже строки в ~/.inputrc. После этого в новых сеансах Bash для перенаправления данных в ferris-redirect вы сможете набрать только знак ‘больше’.

Эти команды имитируют стандартные «дописать» и «усечь» и позволят перенаправить данные в любую файловую систему libferris.

$include /etc/inputrc
“>>>”: “| ferris-redirect “
“>>|”: “| ferris-redirect -T “

gfcp

Команды, приведенные в листинге ниже, могут это прояснить. Gfcp копирует файл изображения в мою учетную запись Flickr. Поскольку я задал Default Include EA And Value Regex [Включать атрибуты по умолчанию] как ‘(size|md5)’, я увижу тэги, показывающие размер и хэш MD5 исходного изображения на flickr.com. Вторая команда выводит некоторые метаданные локального файла изображения; как видите, libferris автоматически сохраняет идентификатор фотографии и имя web-сервиса в исходном файле фотографии. С помощью этих двух атрибутов мы получаем адрес изображения на Flickr – www.flickr.com/photos/monkeyiq/3857255129. Так что при просмотре локального файла изображения легко узнать, куда вы его загрузили.

Вот как изображение копируется на Flickr:

$ gfcp small-test-image.jpg flickr://me/upload
$ fls -lh --show-ea=name,size,webphoto-service,webphotophoto-id  small-test-image.jpg 
small-test-image.jpg   683   flickr 3857255129

В выпадающем списке изменения размера по умолчанию в ferris-capplet-auth можно задать способ масштабирования снимка перед его выгрузкой на сайт web-сервиса. Это удобно, если вы работаете с фотографиями с разрешением больше 10 Мпикс и хотите загрузить на сайт образец шириной 1280 пикселей вместо исходного файла размером 5 МБ. В ferris-capplet-auth можно задать только одно измерение, и оно определит ширину или высоту в зависимости от того, что больше у выгружаемого изображения. Например, если это значение равно 1024 и ширина больше, то высота автоматически изменится так, что соотношение сторон останется прежним, и загрузится файл с шириной 1024.

Me — это я!

Корень вашей файловой системы Flickr появится в подкаталоге с вашим именем пользователя. Чтобы обеспечить работу универсальных скриптов, директория me ссылается на каталог вашего пользователя, так что flickr://me и flickr://monkeyiq для моей учетной записи одинаковы. Содержимое каталога me показано ниже.

Каталог upload передает все записанные в него файлы изображений Flickr API, и в результате они появляются на сайте. Каталог contacts позволяет вам увидеть своих друзей по учетной записи Flickr. В каталогах photosets и not-in-any-photosets находятся все ваши изображения, причем в последнем – снимки, не относящиеся ни к одной из категорий. В каталоге recent находятся недавно загруженные изображения, а в каталоге favs – изображения, которые вы пометили как избранные.

$ fls -0 flickr://me
by-id
contacts
favs
not-in-any-photosets
photosets
recent
upload

Каталог by-id позволяет найти изображение по его числовому идентификатору ID. Это последняя часть адреса, который вы видите в браузере. Например, в адресе www.flickr.com/photos/gromgull/3831809948 ID фотографии – 3831809948. В файле с именем, соответствующим идентификатору фотографии, в каталоге by-id можно найти метаданные снимка. Если прочесть этот файл, например, командой cat, вы получите версию изображения в самом большем доступном размере. Например, две следующие команды скачивают изображение и отображают его локально.


# This is us getting metadata and an image off Flickr through the filesystem:
$ fls --xml flickr://me/by-id/3831809948
<?xml version=”1.0” encoding=”UTF-8” standalone=”no” ?>
<ferrisls>
<ferrisls mtime-display=”70 Jan 1 10:00”
name=”3831809948” title=””
url=”webphotos:///flickr/.../3831809948”
webphoto-id=”3831809948”/>
...
</ferrisls>
$ fcat flickr://me/by-id/3831809948 >| /tmp/out.jpg
$ gimp /tmp/out.jpg
$ fcat flickr://me/by-id/3831809948 | okular -

Просмотрев содержимое каталогов favs, not-in-any-photosets или photosets, вы увидите метаданные всех фотографий, которые вы пометили как избранные или поместили в фотоальбомы.

Опять же, как и в случае с каталогом by-id, при чтении файла из каталога favs с web-сервиса будет загружена фотография с наибольшим из доступных разрешений. В своих фотоальбомах вы можете заметить, что у каждой фотографии есть каталог <ID>_comments. Комментариям к фотографии соответствуют виртуальные файлы в нем, как показано ниже. Для создания нового комментария просто запишите новый файл в каталог комментариев. Об имени файла не беспокойтесь, так как вы вряд ли сможете угадать нужное – libferris позволяет задать любое имя файла, не используемое в данный момент, и переименует файл, когда он получит корректное имя от API Flickr. Также можно записать данные в существующий файл с комментарием, как показано в последней команде. Это удобнее, если вы пользуетесь файловым менеджером и не хотите возиться с именами файлов, чтобы изменить комментарий.

#Создание и обновление комментариев к изображениям на Flickr через файловую систему:
$ fls -0 flickr://me/not-in-any-photosets/443571910_comments
7213593-443571910-72157621814094035 …
monkeyiq 09 Aug 4 11:48  four more
7213593-443571910-72157621814721241 …
monkeyiq 09 Aug 4 13:06
7213593-443571910-72157621814771773 …
monkeyiq 09 Aug 4 13:  test9
7213593-443571910-72157621888320960 ... monkeyiq 09 Jul
30 12:00 water dragon
$ echo what you looking at | ferris-redirect -T   flickr://me/not-in-any-photosets/443571910_comments/new
$ echo test10 | ferris-redirect -T flickr://me/not-in-any-photosets/443571910_comments/7213593-443571910-72157621814771773

Если создать расширенный атрибут (EA) tag:foo у изображения в файловых системах flickr:// или 23hq://, libferris попытается задать тэг ‘foo’ для изображения спомощью API Flickr. Точно также, если записать ‘0’ в tag:foo, libferris попытается удалить тэг ‘foo’ у изображения через API Flickr.

Просмотр директории flickr://me/contacts немного озадачивает: у каждого друга здесь есть собственный каталог. В каталогах друзей находятся их фотоальбомы и избранные фотографии. Так можно узнать, какие снимки друзья считают интересными. Обратите внимание, что возможна загрузка видео с помощью API Flickr, если сервис позволяет это. Я смог загрузить на сайт Flickr несколько видеороликов.

В будущем планируется более плотная поддержка геотэггинга в libferris. Также было бы очень здорово запускать rsync, чтобы обновлять в API Flickr зеркало локальной файловой системы, но с этим пока есть проблемы.

Ресурсы

Персональные инструменты
купить
подписаться
Яндекс.Метрика