Пытаюсь починить модуль
Проблема с авторизацией
под 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
Делаем авто-замену.
Ищем:
Заменяем везде на:
Не сохранялись куки из-за проблемы в путях для 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);
После строки:
Удаляем или комментируем строку:
Теперь функция возвращает массивы.
В функцию getDeviceToken
После:
Добавляем строки:
Код: Выделить всё
curl_setopt($YaCurl, CURLOPT_SSL_VERIFYPEER, false);
Все работает!
Скачать: