Служба Automator, загружающая изображения на Яндекс.Фотки

    К созданию этой службы меня подтолкнул пост Скрипт 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.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 17

      +1
      А я сделал всё на костылях, получил Oauth вручную вот по этой статье: api.yandex.ru/oauth/doc/dg/tasks/get-oauth-token.xml (так и не понял, где подводные камни). Загружаю изображения POST запросом на api-fotki.yandex.ru/post/?oauth_token=token. Для продакшена такое не подойдет, но для самописной утилиты вполне норм.

      Сделал 3 скрипта, один загружает изображения через контекстное меню, второй — загружает область экрана по command+shift+4 и третий — для лайтрума, чтобы загружать изображения через export.
        0
        Точно то же, что вы написали, только для Aperture bitbucket.org/ellersseer/apya
          0
          Неплохо, возьму на заметку. Но от использования Апертуры меня останавливает привычка с лайтрума — он при импорте с сд карты копирует фотки в папку вида 2013/05-12-2013/, в то время как Апертура копирует их себе в медиатеку, если не указать ей конкретную папку. А каждый раз сначала создавать, а потом указывать папку неудобно.

          Может, это как-то можно решить, но пока не разобрался.
            0
            Ну эту проблему я то же яблоскирптом решил)
        0
        А как выбирать альбом в который загружать фотки и есть ли у вас обработка ошибок загрузки? (вдруг одна из сотен фоток не загрузится)?
          0
          Альбом создается после успешной авторизации. Обработка ошибок загрузки есть, конечно же. Смотрите helper.scpt
          +1
          Кстати, добавьте ссылку на мой вариант с использованием Fimp-токена.

          1. Раньше, чтобы получить Fimp-токена, нужно было использовать скрипты (http://habrahabr.ru/post/207282/#comment_7147808), но чтобы упросить этот процесс, я за пол часа накидал приложение с использованием node-webkit. Исходники и само приложение доступны тут: github.com/NAlexandrov/yarsa (скачивайте zip-архив и запускайте yarsa.app).
          image
          2. Далее, когда у вас есть Fimp-токен, то необходимо скопировать этот скрипт в Automator, чтобы получилось как на картинке:

          Картинка + Исходник скрипта


          on run
              # заменить на свой токен
              set TOKEN to "2d1da421fdd3404318e81c0a0442105e"
          
              # адрес альбома куда загружать фотографии
              set ALBUM to "http://api-fotki.yandex.ru/api/users/mylogin/photos/"
              
              tell application "Finder"
                  set selectedFiles to (get selection)
                  
                  if (count of selectedFiles) > 0 then
                      repeat with i from 1 to the count of selectedFiles
                          set filePath to POSIX path of (item i of selectedFiles as alias)
                          set responseCode to do shell script "curl -sL -w %{http_code} --header \"Authorization: FimpToken realm=\"fotki.yandex.ru\", token=" & TOKEN & "\" -F \"image=@" & filePath & "\" --request POST " & ALBUM & " -o /dev/null"
                          if (responseCode is not "201") then
                              display alert "Произошла ошибка:" message "Не удалось загрузить: " & filePath
                          end if
                          
                      end repeat
                      
                      display notification "Загрузка картинок завершена" with title "fotki.yandex.ru"
                  end if
                  
              end tell
          end run
          


          3. Для тех, кто не хочет загружать фотографии в корень Яндекс.Фоток, а хочет загружать в свой приватный альбом, то открывайте на сайте Яндекс.Фотки этот приватный альбом и смотрите в адресную строку. В ней есть цифровой идентификатор альбома, например у меня: fotki.yandex.ru/users/mylogin/album/200491/ Из этого адреса нас интересуют только цифры 200491. Чтобы загружать фотки именно в этот альбом, в скрипте, который вы скопировали в Automator, замените адрес в переменной ALBUM на http://api-fotki.yandex.ru/api/users/mylogin/album/200491/photos/
            +1
            Ждем аналогичные скрипты для Windows на PowerShell)
              0
              Для windows есть отличная программа Image Uploader, которая умеет всё это делать. zenden.ws/imageuploader
              0
              Еще немного — и кто-нибудь напишет службу для автоматической запаковки выбранных папок в zip с паролем и его загрузки на Яндекс.Диск. Вот тогда я буду счастлив :).
                0
                ну это легче.
                запаковать папку в зип, подключиться к я.диску через WebDAV, залить архив.
                  0
                  AppleScript умеет с WebDAV работать?
                    0
                    Ну можно вот так

                    try
                    mount volume «webdav.host.domain»
                    end try
                      0
                      Не похоже, что все так просто — toster.ru/q/62740
                        0
                        Хм. Точнее так — через AppleScript удается выполнить
                        mount volume "https://webdav.yandex.ru:443"
                        

                        при этом логин и пароль отдельно запрашиваются, их можно сохранить в связке ключей.
                        Через bash — как сохранить логин и пароль — непонятно.
              0
              А вот кстати вопрос. Кто как работает с JSON из Apple Script? Я сначала сделал свой парсер, но он жутко медленный, в итоге остановился на JSONHelper (http://itunes.apple.com/app/json-helper-for-applescript/id453114608?mt=12# Возможно кто-то использует другие способы.

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

              Самое читаемое