[Модуль] YaDevices (yadevices)
Модератор: immortal
- S_Nick
- Сообщения: 67
- Зарегистрирован: Сб сен 30, 2017 7:44 pm
- Откуда: Минск
- Благодарил (а): 9 раз
- Поблагодарили: 55 раз
- Контактная информация:
Re: [Модуль] YaDevices (yadevices)
Пока поддерживается только Яндекс.Станция, интеграция с младшими устройствами будет возможна, если ими будет поддерживаться Яндекс.Музыка, голосуйте за поддержку https://yaboard.com/task/5e1d3c964930d2408498e979
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.
Нужно понимать, всё это работает пока не официально, в любой момент Яндекс внесет какое-то изменение в код и все пропало.
- S_Nick
- Сообщения: 67
- Зарегистрирован: Сб сен 30, 2017 7:44 pm
- Откуда: Минск
- Благодарил (а): 9 раз
- Поблагодарили: 55 раз
- Контактная информация:
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 КБ) 4853 просмотра
- За это сообщение автора 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%
-
- Сообщения: 45
- Зарегистрирован: Вт июл 15, 2014 4:28 pm
- Благодарил (а): 79 раз
- Поблагодарили: 5 раз
Re: [Модуль] YaDevices (yadevices)
Алилуя, S_Nick ты супер, заработало. Теперь буду разбираться как Станцию использовать.
Спасибо за исправления
Спасибо за исправления
-
- Сообщения: 76
- Зарегистрирован: Чт фев 07, 2019 12:17 pm
- Благодарил (а): 14 раз
- Поблагодарили: 45 раз
Re: [Модуль] YaDevices (yadevices)
S_Nick, это бы адаптировать, чтоб универсально было под Win/nix и на гитхаб автору закинуть, было бы совсем хорошо)
- S_Nick
- Сообщения: 67
- Зарегистрирован: Сб сен 30, 2017 7:44 pm
- Откуда: Минск
- Благодарил (а): 9 раз
- Поблагодарили: 55 раз
- Контактная информация:
Re: [Модуль] YaDevices (yadevices)
Нужно несколько строчек подправить и модуль станет кроссплатформенным. Но пусть этим занимается автор.
- webms
- Сообщения: 498
- Зарегистрирован: Чт дек 15, 2016 3:13 am
- Благодарил (а): 221 раз
- Поблагодарили: 88 раз
Re: [Модуль] YaDevices (yadevices)
извините, не читал всю ветку, я так понимаю до сих пор еще с мини колонками не работает?
dexp например
dexp например
-
- Сообщения: 76
- Зарегистрирован: Чт фев 07, 2019 12:17 pm
- Благодарил (а): 14 раз
- Поблагодарили: 45 раз
Re: [Модуль] YaDevices (yadevices)
И врядли будет. На стороне яндекса такой функционал ими не поддерживается, проблема не в модуле
- Рейтинг: 1.16%
-
- Сообщения: 76
- Зарегистрирован: Чт фев 07, 2019 12:17 pm
- Благодарил (а): 14 раз
- Поблагодарили: 45 раз
Re: [Модуль] YaDevices (yadevices)
Автор тоже не вездесущ ) Для этого и есть пулреквесты. Я б закинул, да мдм не под виндой, не потестирую.
-
- Сообщения: 25
- Зарегистрирован: Сб май 02, 2020 9:05 pm
- Благодарил (а): 7 раз
- Поблагодарили: 2 раза
Re: [Модуль] YaDevices (yadevices)
S_Nick нужна помощь. Поставил модуль, внес изменения по инструкции Auth status: OK, но при отправке команды повтори за мной .... выдает Found. Redirecting to https://passport.yandex.ru/auth/update?retpath=https%.... и ничего Я. станция не говорит. Что делать?