[Модуль] YaDevices (yadevices)
Модератор: immortal
Re: [Модуль] YaDevices (yadevices)
Пока поддерживается только Яндекс.Станция, интеграция с младшими устройствами будет возможна, если ими будет поддерживаться Яндекс.Музыка, голосуйте за поддержку https://yaboard.com/task/5e1d3c964930d2408498e979
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.
Re: [Модуль] YaDevices (yadevices)
Пытаюсь починить модуль
Проблема с авторизацией под Windows в файле yadevices.class.php с функцией apiRequest($url, $method = 'GET', $params = 0, $repeating = 0)
Она вызывает это:
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
Делаем авто-замену.
Ищем:
Заменяем везде на:
Не сохранялись куки из-за проблемы в путях для 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:
После строки:
Добавляем строку:
После строки:
Удаляем или комментируем строку:
Теперь функция возвращает массивы.
В функцию getDeviceToken
После:
Добавляем строки:
Все работает!
Скачать:
Проблема с авторизацией под 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'
После этого пробуем авторизироватся и должно получиться:
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);
Скачать:
- Вложения
-
- Снимок.PNG (131.16 КБ) 6198 просмотров
Re: [Модуль] YaDevices (yadevices)
Алилуя, S_Nick ты супер, заработало. Теперь буду разбираться как Станцию использовать.
Спасибо за исправления
Спасибо за исправления
Re: [Модуль] YaDevices (yadevices)
S_Nick - ОГРОМНОЕ СПАСИБО за труды !!!
Re: [Модуль] YaDevices (yadevices)
S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
Re: [Модуль] YaDevices (yadevices)
Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.London писал(а): Пн апр 20, 2020 3:59 pm S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
Re: [Модуль] YaDevices (yadevices)
извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
dexp например
Re: [Модуль] YaDevices (yadevices)
И врядли будет. На стороне яндекса такой функционал ими не поддерживается, проблема не в модулеwebms писал(а): Пн апр 20, 2020 5:45 pm извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
Re: [Модуль] YaDevices (yadevices)
Автор тоже не вездесущ ) Для этого и есть пулреквесты. Я б закинул, да мдм не под виндой, не потестирую.S_Nick писал(а): Пн апр 20, 2020 5:18 pm Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.
Re: [Модуль] YaDevices (yadevices)
S_Nick нужна помощь. Поставил модуль, внес изменения по инструкции Auth status: OK, но при отправке команды повтори за мной .... выдает Found. Redirecting to https://passport.yandex.ru/auth/update?retpath=https%.... и ничего Я. станция не говорит. Что делать?