Драйвер для Media Source для работы с Яндекс.Диск

1 500
Рад представить вам на суд весьма полезное, по моему мнению, дополнение для MODX Revolution.

Всем известно, что для доступак файлам в MODX Revo используются так называемые медиа ресурсы, предоставляющие доступ к файлам размещенным как в файловой системе так и на других сторонних сервисах. Из коробки MODX умеет работать только с обычными файлами на диске и файлами в Amazon S3. Но ничего не мешает написать собственный провайдер, предоставляющий доступ к любому другому сервису.

Где-то год назад разработчик из Гонконга сделал подобный провайдер для работы с Dropbox, Марк Хамстра писал об этом. Именно тогда у меня появилась желание реализовать подобный провайдер для работы с Яндекс.Диском, но за год продвинуться сильно не удалось из-за особенностей работы с протоколом webdav и отсутствием нормальных библиотек на php для работы с этим протоколом. Но перед новым годом наткнулся на официальный SDK для работы с сервисами Яндекса от компании NIX Solutions из Харькова и решил возобновить работу над проектом.

И вот буквально вчера я закончил версию 0.5.0-alpha. В ней реализованы базовые функции для работы с файлами в Яндекс.Диске, а именно: создание, удаление, перемещение файлов и каталогов, создание и редактирование текстовых файлов из MODX. Генерация превью выполняется на стороне Яндекса, но для ускорения работы сгенерированные превью кешируются в самом MODX.

У альфа-версии скорее всего найдется еще куча багов и проблем, но у самого у меня не хватит ресурсов протестировать пакет в различных ситуациях. Поэтому я прошу вашей помощи в тестировании. Ниже инструкции, как установить, настроить и использовать компонент.

Ну и для скорейшего выпуска стабильной версии объявляется сбор денег (5000 рублей) для повышения мотивации меня, как разработчика.

Webmoney
Z203304231268
R140312479061

ЯД:
41001878021446

Уже собрано 1500

На этой неделе начну активно исправлять описанные баги.


Использование Yandex Disk Media Source

В ПЕРВУЮ ОЧЕРЕДЬ СДЕЛАЙТЕ БЕКАП СВОИХ ДАННЫХ НА ДИСКЕ. ЕЩЕ РАЗ ОБРАЩАЮ ВНИМАНИЕ, СДЕЛАЙТЕ БЕКАП!

Работает только на PHP 5.4+

Для начала нужно скачать сам пакет и загрузить его в папку
/core/packages
Затем в управлении пакетами нажать кнопку «Искать пакеты локально» и установить появившийся yandexdisk пакет. В версии 2.2.14 есть возможность загрузить пакет прямо из раздела управлениями пакетами.

После установки нужно создать новый медиа-ресурс, где в качестве типа выбрать Яндекс.Диск.



После создания необходимо кликнуть правой клавишей мыши и нажать «Редактировать ресурс», где в настройках нужно прописать токен для вашего приложения и не забыть сохранить изменения.




Как получить токен

Задача не самая простая на первый взгляд, но пока нет идей по ее улучшению. В целом все написано в инструкции для разработчиков самого Диска, но опишу по шагам порядок действий:

1. Если нет аккаунта в Яндексе, то заводим его, тут все понятно
2. Идем сюда oauth.yandex.ru/client/new и создаем приложение для работы с Диском
3. Название и описание пишете какое душе угодно
4. В правах выбираем Яндекс.Диск и в раскрывшемся списке отмечаем единственную галку «Доступ к Яндекс.Диску для приложений»
5. В самом низу отмечаем галку «Клиент для разработки» (это важно)
6. Сохраняем приложение
7. Составляем ссылку вида oauth.yandex.ru/authorize?response_type=token&client_id=<client_id>, где заменяем <client_id> на id вашего приложения и переходим по ней.
8. Нажимаем кнопку «Подтвердить»
9. Находим в адресной строке браузера параметр access_token, именно он нам и нужен
10. Вставляем его в параметр token в настройках медиа-ресурса.

Куда писать о проблемах?

Код пакета размещается на GitHub, соответственно все сообщения об ошибках лучше писать туда в issues, либо по почте ivan@klimchuk.com, или если совсем хочется живого общения — в скайп Alroniks.

О том, как устроены сами провайдеры и как велась разработка, будет отдельная заметка позже.
Іван Клімчук
09 апреля 2014, 12:26
modx.pro
9
5 200
+10

Комментарии: 36

Володя
09 апреля 2014, 18:15
0
видел на гитхабе когда ты только задумал его написать… очень рад что дело сдвинулось! С удовольствием затестю и отпишу! Спасибо!!!
    Наумов Алексей
    09 апреля 2014, 21:27
    0
    Иван, добрый день! Очень здорово, что ведется такая разработка! Вы молодец! Можно узнать, какие практические задачи решает этот компонент на ваших сайтах? Мне пока не попадались задачи, где бы требовалось стороннее (в смысле не на сайте, а в вне его) файловое хранилище, ну пожалуй кроме видео с ютуба.
      Іван Клімчук
      10 апреля 2014, 00:38
      0
      Учитывая, что компонент только-только сделан, а компонент для dropbox не выложен в репозиториях, то люди им не пользовались только потому, что подобных кмпонентов попросту не было. А решает очень простую задачу. Работать с файловым менеджером в админке — ад, загрузка по 1 файлу и все такое. В яндекс диске можно работать через клиент как с обычной папкой. Можно к одному сайту подключить несколько дисков и использовать файлы из них. Ситуаций использования можно придумать очень много.
        Виталий Батушев
        10 апреля 2014, 00:49
        +1
        У меня этот дропбоксовый компонент так и не завелся. Может, я тупил.
        А так — очень даже польза, могу влить денег, но чуть позже — вывел вчера все виртуальные деньги на карту.
          Andrey Grachov
          10 апреля 2014, 02:40
          +1
          Компонент для Dropbox выложен только в виде готового пакета (DropSource), но поскольку Github упразднил раздел Downloads, так просто его сейчас не найти :)
          Я занимался его разработкой и насчет токена думаю можно применить ту же схему: если указаны API key и API secret, то в описании параметра Auth token выводится ссылка на авторизацию. После перехода по ней и подтверждения пользователь возвращается обратно на страницу настройки Media Source и токен автоматически сохраняется в настройки.
          Поскольку для Яндекс redirect_url должен задаваться в настройках приложения, можно на странице редактирования Media Source выводить ссылку на текущую страницу, отметив что ее необходимо указать в настройках приложения. А в остальном использовать тот же принцип для авторизации пользователя.
            Іван Клімчук
            10 апреля 2014, 10:54
            0
            Приятно познакомиться :)

            У меня вопрос — почему код не выложен на github? Там есть пару спорных мест и не все части реализованы, например нет создания и обновления файла из админки MODX. Можно было бы доработать. Брать код и переписывать под своим именем не комильфо, а пуллриквест заслал бы.
              Andrey Grachov
              10 апреля 2014, 11:19
              0
              Раз такое дело, то скоро появится :)
            Виталий Серый
            10 апреля 2014, 10:55
            0
            Есть компонент для мультиаплоада modx.com/extras/package/multiuploaddialog
            Добавлю еще пару причин пользоваться подобными файлохранилищами.
            Распределенная нагрузка и меньшая стоимость дополнительного места.
              Іван Клімчук
              10 апреля 2014, 11:11
              +2
              Мультиаплоад решает задачу частично, но согласитесь, куда приятнее разложить, допустим картинки для каталога, по папочкам на своем компьютере, без тормозов и даже без интернета, а потом после синхронизации в админке просто повыбирать нужные.
          Илья Ершов
          10 апреля 2014, 09:50
          0
          Айда Google Диск! ;)
            Іван Клімчук
            10 апреля 2014, 11:12
            0
            Нужно изучить их API. Теоретически ничего сложного, но тесты и еще раз тесты. Ибо файлы можно запросто потерять.
            Володя
            10 апреля 2014, 21:18
            0
            решил попробовать и вот такая бяка
            [2014-04-10 21:15:28] (ERROR @ phar:///var/www/reg33/www/core/components/yandexdisk/model/yandexdisk/yandex-sdk-0.1.1.phar/vendor/guzzle/http/Guzzle/Http/Client.php : 348) PHP warning: file_exists(): open_basedir restriction in effect. File(/tmp/guzzle-cacert.pem) is not within the allowed path(s): (/var/www/reg33/)
            [2014-04-10 21:15:28] (ERROR @ phar:///var/www/reg33/www/core/components/yandexdisk/model/yandexdisk/yandex-sdk-0.1.1.phar/vendor/guzzle/http/Guzzle/Http/Client.php : 348) PHP warning: copy(): open_basedir restriction in effect. File(/tmp/guzzle-cacert.pem) is not within the allowed path(s): (/var/www/reg33/)
            [2014-04-10 21:15:28] (ERROR @ phar:///var/www/reg33/www/core/components/yandexdisk/model/yandexdisk/yandex-sdk-0.1.1.phar/vendor/guzzle/http/Guzzle/Http/Client.php : 348) PHP warning: copy(/tmp/guzzle-cacert.pem): failed to open stream: Operation not permitted
            посмотрел лог приложения на яндекс, обращений не было…
            в чем дело может быть?
            p.s. PHP 5.4.19
              Василий Наумкин
              11 апреля 2014, 07:51
              +1
              SDK яндекса пытается сохранить сертификат в директорию /tmp, к которой у сайта нет доступа.
                Володя
                11 апреля 2014, 09:34
                0
                ну сессии он туда успешно же сохраняет…
                  Василий Наумкин
                  11 апреля 2014, 09:36
                  0
                  MODX хранит сессии в БД, по умолчанию. Ты менял настройки хранения сессий?

                  В любом случае, у тебя всё понятно написано:
                  File(/tmp/guzzle-cacert.pem) is not within the allowed path(s): (/var/www/reg33/)
                    Володя
                    11 апреля 2014, 10:13
                    0
                    поставил modx c нуля… ошибка та же.
                    и вообще почему он за пределы папки www смотрит?
                    Modx находится по пути /var/www/reg33/www/
                      Іван Клімчук
                      11 апреля 2014, 10:56
                      0
                      Он смотрит туда согласно настройке open_basedir. Можно узнать ее содержимое? Она в php.ini должна быть определена. Это по сути та же папка, куда сохраняет php временные файлы и вроде как файлы сессий (по умолчанию).
                        Володя
                        11 апреля 2014, 11:03
                        0
                        php_admin_value[open_basedir] = /var/www/reg33/
                          Володя
                          11 апреля 2014, 11:27
                          0
                          попробовал вообще выставить php_admin_value[open_basedir] = none
                          это же должно снять ограничение?
                          но тогда получил
                          [2014-04-11 11:24:28] (ERROR @ phar:///var/www/reg33/www/core/components/yandexdisk/model/yandexdisk/yandex-sdk-0.1.1.phar/vendor/guzzle/http/Guzzle/Http/Curl/CurlMulti.php : 225) PHP warning: curl_multi_exec() has been disabled for security reasons
                            Володя
                            11 апреля 2014, 11:30
                            0
                            снял ограничения на curl_multi_exec и наконец то увидел свои файлы на яндекс)))
                            значит дело в правах точно…
                            че ж ему зараза не нравится
                        Василий Наумкин
                        11 апреля 2014, 16:08
                        +1
                        Он ломится в указанную системную временную директорию.

                        В моих конфигах, например, указано так:
                        php_admin_value[open_basedir] = /var/www/site/
                        php_admin_value[upload_tmp_dir] = /var/www/site/tmp
                        Если и у тебя так же, то это косяк SDK, что он не смотрит в настройку.

                        Ну а open_basedir запрещает обращаться к любым файлам выше указанной директории. Защита на случай взлома или других гадостей.
                          Володя
                          11 апреля 2014, 16:17
                          0
                          Василий, ну у меня так же. По твоим же статьям все осваивал)))
                          я просто пока прописал так
                          php_admin_value[open_basedir] = /var/www/site/:/tmp/
                          ну и соответственно он распаковывает файлы во временной директории /tmp/
                          ругаться перестал, все нормально…
                          p.s. но по сути я его выпустил выше, в плане защиты не есть хорошо да?
                            Василий Наумкин
                            11 апреля 2014, 16:18
                            0
                            Конечно, всё должно работать внутри директории сайта и не лазить выше.

                            Осталось понять, это косяу конфигурации сайта, или используемой библиотеки для работы с ЯД?
                Володя
                11 апреля 2014, 09:34
                0
                при установке пакета ругань на
                Could not get table name for class: xPDOObject
                xPDOObject::fromJSON() -- Could not convert jsonSource to a PHP array.
                  Іван Клімчук
                  11 апреля 2014, 10:54
                  0
                  Это нормально. Ну т.е. ни на что не влияет, просто чтобы создать vehicle, нужно взять и создать какую-то реальную сущность, в частности какой-нибудь объект xPDO. Я использую пустой, а потому он ругается, что для него нет таблицы и он не знает откуда брать информацию. Создавать абы что не хочется, а как обойтись без vehicle тоже пока не понятно. Но буду исправлять, однозначно
                Алексей Федоров
                31 января 2016, 17:58
                0
                Не работает с modx 2.4.2 После установки при создании медиаисточника, выдает предупреждение ошибка 500 и список источников вообще не раскрывается.
                  Іван Клімчук
                  01 февраля 2016, 11:12
                  0
                  Версия PHP ниже 5.4? Пакет давно не обновлялся, поэтому все может быть. На данный момент не поддерживается, так как есть другие решения.
                    Алексей Федоров
                    01 февраля 2016, 20:41
                    0
                    PHP 5.4. Из аналогов, как понимаю WebDav? Если бы была хоть какая-то инструкция к этому дополнению, то наверное им можно было бы пользоваться) Пока отсутствие примера водит меня в тупик, думал с Yandex Disk Media Source выгорит. При сборке с гита в modx ругнулось, что не может выполнить сценарий. Возможно в php отключен какой-то пакет, а может дело в том, что поменяны пути к ядру, переименованы менеджер и ассетс.
                      Василий Наумкин
                      01 февраля 2016, 21:05
                      +1
                      В чём смысл использования Яндекс.Диск, Google.Drive или другого подобного сервиса для сайта, который не даёт вставлять прямые ссылки на файлы?

                      Это ж при показе картинки её нужно выгружать с сервиса и кэшировать у себя, а потом показывать. При очистке кэша — повторять. В чём экономия, где скорость?

                      Имеет смысл использовать только Amazon S3, Selectel Cloud Storage или подобные решения. Загрузил файлы, сохранил прямые ссылки и народ их грузит по CDN быстро-быстро, а ты еще место на сайте экономишь.

                      Любые другие удалённые источники мне непонятны. Только приватные документы владельца сайта хранить, что ли?
                        Алексей Федоров
                        01 февраля 2016, 23:38
                        0
                        Вот этого, честно говоря, не знал. Свято верил, что подгрузка будет проходить напрямую с ЯД'а без допкеширования на сайте. Спасибо, пойду регистрироваться на Amazon
                          Іван Клімчук
                          01 февраля 2016, 23:41
                          0
                          Да, у ЯД есть механизм расшарвания файлов, но он все равно ссылку отдает на свою страницы, а не на сам файл. Потому да, имеет смысл только S3 использовать и подобные. Вроде еще у dropbox есть возможность шарить прямые ссылки (по крайней мере у меня скриншотилка так работает), но там они вроде с timeout и хешем, а настощие прямые линки только в папке public.
                              Алексей Федоров
                              02 февраля 2016, 08:18
                              0
                              О! Инструкция это хорошо) Да и на родном языке интерфейс выглядит куда лучше)
                  Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                  36