[Модуль] YaDevices (yadevices)

Разработка дополнительных модулей, подключение различных приложений.

Модератор: immortal

Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

Re: [Модуль] YaDevices (yadevices)

Сообщение S_Nick » Вс апр 12, 2020 3:08 pm

Пока поддерживается только Яндекс.Станция, интеграция с младшими устройствами будет возможна, если ими будет поддерживаться Яндекс.Музыка, голосуйте за поддержку https://yaboard.com/task/5e1d3c964930d2408498e979
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

Re: [Модуль] YaDevices (yadevices)

Сообщение S_Nick » Ср апр 15, 2020 8:03 pm

Пытаюсь починить модуль
Проблема с авторизацией под Windows в файле yadevices.class.php с функцией apiRequest($url, $method = 'GET', $params = 0, $repeating = 0)

Код: Выделить всё

    function apiRequest($url, $method = 'GET', $params = 0, $repeating = 0) {
        $this->getConfig();
        $token = $this->getToken();
        $YaCurl = curl_init();
        curl_setopt($YaCurl, CURLOPT_URL, $url);
        curl_setopt($YaCurl, CURLOPT_COOKIEJAR, ROOT . 'cms/cached/yandex_cookie.txt');
        curl_setopt($YaCurl, CURLOPT_COOKIEFILE, ROOT . 'cms/cached/yandex_cookie.txt');

        if (preg_match('/devices\/(.+)\/actions/',$url,$m)) {
            $referer = "https://quasar.yandex.ru/skills/iot/device/".$m[1]."?app_id=unknown&app_platform=unknown&app_version_name=unknown&dp=2&lang=ru&model=unknown&os_version=unknown&size=1080x1920//Referer: https://quasar.yandex.ru/skills/iot/device/8f5ccea3-d631-4cfb-9fea-5cc36abba92e?app_id=unknown&app_platform=unknown&app_version_name=unknown&dp=2&lang=ru&model=unknown&os_version=unknown&size=1080x1920";
            dprint($referer);
            curl_setopt($YaCurl,CURLOPT_REFERER,$referer);
        }

        if ($method != 'POST') {
            curl_setopt($YaCurl, CURLOPT_POST, false);
        } else {
            curl_setopt($YaCurl, CURLOPT_POST, true);
            curl_setopt($YaCurl, CURLOPT_POSTFIELDS, json_encode($params), JSON_UNESCAPED_SLASHES);
            curl_setopt($YaCurl, CURLOPT_HTTPHEADER, array('x-csrf-token:'.$token));
        }
        curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($YaCurl);
        dprint($result,false); <<-- вот этот дебаг вызывает: Headers already sent in on line Cannot redirect instead
        $data = json_decode($result, true);
        if (!$repeating && (!is_array($data) || $data['status']=='error')) {
            $token = $this->getToken();
            if ($token) {
                $data = $this->apiRequest($url, $method, $params, 1);
            } else {
                return false;
            }
        }
        return $data;
    }

Код: Выделить всё

....
        $result = curl_exec($YaCurl);
        dprint($result,false); <<-- вот этот дебаг вызывает: Headers already sent in on line Cannot redirect instead
        $data = json_decode($result, true);
....
Она вызывает это:
Headers already sent in on line
Cannot redirect instead

И как следствие функция getToken() не может вернуть token с https://frontend.vh.yandex.ru/csrf_token
Поэтому не происходит авторизация. Как исправить пока не знаю, в чужом коде сложно разбираться.

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

UPD.
Проблема авторизации в Яндексе решается так:
В файле C:\_majordomo\htdocs\modules\yadevices\yadevices.class.php
Делаем авто-замену.
Ищем:

Код: Выделить всё

ROOT . 'cms/cached/yandex_cookie.txt'
Заменяем везде на:

Код: Выделить всё

'cookie_yadevice.txt'
Не сохранялись куки из-за проблемы в путях для Windows.
После этого пробуем авторизироватся и должно получиться:

Auth status: OK

getToken() теперь возвращает $token и авторизация происходит нормально.
НО...
Это еще не все, устройства по-прежнему модуль не находит.

Функция apiRequest($url, $method = 'GET', $params = 0, $repeating = 0) с замененными путями для куки, по прежнему на все запросы ничего не возвращает и вызывает ошибку в дебаге "Headers already sent in on line Cannot redirect instead"

UPD.
Разобрался.
Исправляем функцию apiRequest:
После строки:

Код: Выделить всё

curl_setopt($YaCurl, CURLOPT_RETURNTRANSFER, true);
Добавляем строку:

Код: Выделить всё

curl_setopt($YaCurl, CURLOPT_SSL_VERIFYPEER, false);
После строки:

Код: Выделить всё

$result = curl_exec($YaCurl);
Удаляем или комментируем строку:

Код: Выделить всё

dprint($result,false);
Теперь функция возвращает массивы.

В функцию getDeviceToken
После:

Код: Выделить всё

curl_setopt($YaCurl, CURLOPT_POST, false);
Добавляем строки:

Код: Выделить всё

curl_setopt($YaCurl, CURLOPT_SSL_VERIFYPEER, false);
Все работает!

Скачать:
yadevices.class.zip
yadevices.class.php исправленный для Windows
(5.55 КБ) 175 скачиваний
Вложения
Снимок.PNG
Снимок.PNG (131.16 КБ) 4850 просмотров
За это сообщение автора S_Nick поблагодарили (всего 7):
astotskiy (Чт апр 16, 2020 2:18 pm) • Plug (Чт апр 16, 2020 2:46 pm) • dengi.76 (Чт апр 16, 2020 4:00 pm) • serenkyby (Вс апр 26, 2020 6:45 pm) • Keen Lizard (Сб май 02, 2020 7:25 pm) • London (Чт май 07, 2020 12:31 pm) • Valvet (Пн июн 29, 2020 9:04 pm)
Рейтинг: 8.14%
astotskiy
Сообщения: 45
Зарегистрирован: Вт июл 15, 2014 4:28 pm
Благодарил (а): 79 раз
Поблагодарили: 5 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение astotskiy » Чт апр 16, 2020 2:20 pm

Алилуя, S_Nick ты супер, заработало. Теперь буду разбираться как Станцию использовать.
Спасибо за исправления
dengi.76
Сообщения: 222
Зарегистрирован: Вт фев 06, 2018 9:40 pm
Откуда: Пермь
Благодарил (а): 117 раз
Поблагодарили: 7 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение dengi.76 » Чт апр 16, 2020 4:01 pm

S_Nick - ОГРОМНОЕ СПАСИБО за труды !!!
London
Сообщения: 76
Зарегистрирован: Чт фев 07, 2019 12:17 pm
Благодарил (а): 14 раз
Поблагодарили: 45 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение London » Пн апр 20, 2020 3:59 pm

S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

Re: [Модуль] YaDevices (yadevices)

Сообщение S_Nick » Пн апр 20, 2020 5:18 pm

London писал(а):
Пн апр 20, 2020 3:59 pm
S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.
Аватара пользователя
webms
Сообщения: 498
Зарегистрирован: Чт дек 15, 2016 3:13 am
Благодарил (а): 221 раз
Поблагодарили: 88 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение webms » Пн апр 20, 2020 5:45 pm

извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
London
Сообщения: 76
Зарегистрирован: Чт фев 07, 2019 12:17 pm
Благодарил (а): 14 раз
Поблагодарили: 45 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение London » Пн апр 20, 2020 5:50 pm

webms писал(а):
Пн апр 20, 2020 5:45 pm
извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
И врядли будет. На стороне яндекса такой функционал ими не поддерживается, проблема не в модуле
За это сообщение автора London поблагодарил:
webms (Пн апр 20, 2020 5:51 pm)
Рейтинг: 1.16%
London
Сообщения: 76
Зарегистрирован: Чт фев 07, 2019 12:17 pm
Благодарил (а): 14 раз
Поблагодарили: 45 раз

Re: [Модуль] YaDevices (yadevices)

Сообщение London » Пн апр 20, 2020 5:51 pm

S_Nick писал(а):
Пн апр 20, 2020 5:18 pm
Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.
Автор тоже не вездесущ ) Для этого и есть пулреквесты. Я б закинул, да мдм не под виндой, не потестирую.
N.Star
Сообщения: 25
Зарегистрирован: Сб май 02, 2020 9:05 pm
Благодарил (а): 7 раз
Поблагодарили: 2 раза

Re: [Модуль] YaDevices (yadevices)

Сообщение N.Star » Сб май 02, 2020 9:16 pm

S_Nick нужна помощь. Поставил модуль, внес изменения по инструкции Auth status: OK, но при отправке команды повтори за мной .... выдает Found. Redirecting to https://passport.yandex.ru/auth/update?retpath=https%.... и ничего Я. станция не говорит. Что делать?
Ответить