Страница 5 из 29

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

Добавлено: Вс апр 12, 2020 3:08 pm
S_Nick
Пока поддерживается только Яндекс.Станция, интеграция с младшими устройствами будет возможна, если ими будет поддерживаться Яндекс.Музыка, голосуйте за поддержку https://yaboard.com/task/5e1d3c964930d2408498e979
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.

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

Добавлено: Ср апр 15, 2020 8:03 pm
S_Nick
Пытаюсь починить модуль
Проблема с авторизацией под 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 КБ) 267 скачиваний

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

Добавлено: Чт апр 16, 2020 2:20 pm
astotskiy
Алилуя, S_Nick ты супер, заработало. Теперь буду разбираться как Станцию использовать.
Спасибо за исправления

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

Добавлено: Чт апр 16, 2020 4:01 pm
dengi.76
S_Nick - ОГРОМНОЕ СПАСИБО за труды !!!

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

Добавлено: Пн апр 20, 2020 3:59 pm
London
S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)

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

Добавлено: Пн апр 20, 2020 5:18 pm
S_Nick
London писал(а): Пн апр 20, 2020 3:59 pm S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.

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

Добавлено: Пн апр 20, 2020 5:45 pm
webms
извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например

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

Добавлено: Пн апр 20, 2020 5:50 pm
London
webms писал(а): Пн апр 20, 2020 5:45 pm извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
И врядли будет. На стороне яндекса такой функционал ими не поддерживается, проблема не в модуле

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

Добавлено: Пн апр 20, 2020 5:51 pm
London
S_Nick писал(а): Пн апр 20, 2020 5:18 pm Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.
Автор тоже не вездесущ ) Для этого и есть пулреквесты. Я б закинул, да мдм не под виндой, не потестирую.

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

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