К созданию этой службы меня подтолкнул пост Скрипт Automator, загружающий изображения на Habrastorage, а точнее, вот этот комментарий.
Итак, в чем же сложность написания подобной службы? В том, что для загрузки изображений требуется OAuth токен, т.е. необходимо как-то его получить (и сохранить для последующего использования). Конечно же, можно создать собственное OAuth приложение и получить токен вручную. Но это не наш метод.
Вспомним, как же происходит OAuth авторизация приложения на Яндекс.Фотках:
3. OAuth-сервер осуществляет редирект на указанный разработчиком URI, добавив к нему в качестве параметра токен или код подтверждения, дающий право на последующее получение токена.
Как раз то, что нам надо. Остался один вопрос: как же нам получить этот токен? А очень просто. Нам необходимо указать в настройках приложения такой Callback URL, который будет приводить к открытию нашего приложения, а уже оно и будет получать и сохранять токен.
Для этого мы воспользуемся возможностью OS X приложений объявлять себя обработчиками URL схем. Например, приложение может указать, что оно является обработчиком URL-ов вида ypu-oauth://...
, и при любой попытке «открыть» такой URL — будет запущено приложение, которому будет передан исходный URL для обработки.
Итак, поехали. Для начала создадим наше приложение. Нет-нет, не спешите запускать Xcode, он нам совершенно не понадобится. Мы напишем приложение на чистейшем AppleScript.
Открываем Редактор AppleScript, создаем новый файл и сохраняем его как Программу.
Код нашего приложения довольно простой:
on open location theUrl
# переменная theUrl — строка с исходным "перехваченным" URL
# Пример: ypu-oauth://do#access_token=...&token_type=bearer&state=&expires_in=31536000
# получаем access_token из theUrl
# сохраняем access_token для будущего использования
# получаем и сохраняем информацию о пользователе Яндекс.Фоток
# создаем альбом для загрузки изображений и сохраняем его идентификатор
end open location
Теперь нам необходимо подправить Info.plist
нашего приложения, добавив информацию о типе обрабатываемых им URL-ов.
Кликаем правой кнопкой на сохраненной приложении, выбираем Показать содержимое пакета и переходим в папку Contents
. Редактируем файл Info.plist
вашим любимым текстовым редактором и добавляем следующие строки:
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>YPU OAuth Authorizer</string>
<key>CFBundleURLSchemes</key>
<array>
<string>ypu-oauth</string>
</array>
</dict>
</array>
Итоговый вид содержимого должен стать примерно таким:
Не забудьте сохранить измененный файл!
Финальный шаг. Изменяем настройки нашего OAuth приложения на Яндекс.Фотках:
Реализация службы тоже довольно проста и подробно описана в указанной выше блогозаписи. Добавлю лишь свои пять копеек. Служба уже получает список выбранных файлов, поэтому нет нужды дополнительно запрашивать этот список у Finder'а.
Готовые службу, приложение-авторизатор и их установщик можно взять здесь. Протестировано на 10.7 и 10.9. Должно работать и на 10.8. Лицензия стандартная — WTFPL.
Автор: iStyx