Пока получилось программно сделать сделующее:
* Залогинится с именем пользователя/паролем + получить token для общения с API
* Получить по API информацию о пользователе (/api/user_data/)
* Получить список устройств пользователя (/api/device/user)
* Загрузить общий каталог устройств (/api/device/catalog/)
* Загрузить общий каталог возможных программ для устройств (/api/program/catalog/)
Из менее важного:
* Справочник языков (/api/language/catalog/)
* Список ингридиентов для приготовления (/api/ingredient_mode/catalog/ru/0/)
* Непонятное (/api/commit/last)
Собственно пока всё. Если у кого есть устройства или кто умеет "расковыривать" протоколы связи, то милости прошу продолжить работу или помочь советом. Мне не удалось перехватить команды общения между клиентским приложением и облаком -- всё по SSL идёт и что-то навыков не хватает Я использовал Mikrotik в режиме сниффинга с переадресацией пакетов на ноут, на котором через Wireshark смотрел чего происходит.
Для полноценной интеграции (и потом создания модуля) нужно две основные штуки:
* Возможность получать текущие данные устройства
* Возможность запускать определённую программу на устройстве
Под спойлером текущие наработки в виде файла r4s.php -- ложится в корень файлов majordomo (там где config.php), правится имя пользователя и пароль в коде ($r4s_username, $r4s_password) и запускается в браузере. На нём можно всячески экспериментировать.
Код: Выделить всё
<?php
include_once("./config.php");
include_once("./lib/loader.php");
// connecting to database
$db = new mysql(DB_HOST, '', DB_USER, DB_PASSWORD, DB_NAME);
include_once("./load_settings.php");
$r4s_username = ''; // ИМЯ ПОЛЬЗОВАТЕЛЯ R4S
$r4s_password = ''; // ПАРОЛЬ
echo "<h1>Login page</h1>";
$url = 'http://content.readyforsky.com/login';
$ch = curl_init();
$tmpfname = ROOT . 'cms/cached/r4s.txt';
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);
if (!preg_match('/Logged in as/', $server_output)) {
if (preg_match('/_csrf_token" value="(.+?)"/is', $server_output, $m)) {
$csrf_token = $m[1];
}
echo "<h1>Submit login</h1>";
$postFields = array(
'_csrf_token' => $csrf_token,
'_username' => $r4s_username,
'_password' => $r4s_password,
'_remember_me' => 'on',
'_submit' => 'Log in',
);
$url = 'http://content.readyforsky.com/app.php/login_check';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_REFERER, 'http://content.readyforsky.com/login');
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);
if (!preg_match('/content.readyforsky.com\/app.php\//is', $server_output)) {
echo "Failed to login";
exit;
}
}
echo "<h1>OAuth 1</h1>";
$url = 'http://content.readyforsky.com/oauth/v2/auth?client_id=r4s&redirect_uri=http%3A%2F%2Fclient.android&response_type=code&scope=user';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postFields);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);
$token_data = array();
if (preg_match('/client.android\?code=([\w]+)/is', $server_output, $m)) {
echo "<h1>OAuth2</h1>";
$code = $m[1];
$url = 'http://content.readyforsky.com/oauth/v2/token?redirect_uri='.urlencode('http://client.android').'&response_type=code&grant_type=authorization_code&code=' . $code . '&client_secret=123&client_id=r4s';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // bad style, I know...
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
curl_close($ch);
$token_data=json_decode($server_output,true);
if (!$token_data['access_token']) {
echo "Failed to login";
exit;
}
}
$data=r4s_api_request('/api/user/current',$token_data); // информация о текущем пользователе
print_r($data);
//$data=r4s_api_request('/api/user_data/',$token_data); // ???
//$data=r4s_api_request('/api/device/user',$token_data); // список устройств пользователя
//$data=r4s_api_request('/api/device/catalog/',$token_data); // каталог устройств
//$data=r4s_api_request('/api/program/catalog/',$token_data); // Список программ готовки?
//$data=r4s_api_request('/api/language/catalog/',$token_data); // Список языков
//$data=r4s_api_request('/api/commit/last',$token_data); // ???
//$data=r4s_api_request('/api/ingredient_mode/catalog/ru/0/',$token_data); // Список ингридиентов?
function r4s_api_request($request,$token_data,$method = 'GET', $params = 0) {
if (!$token_data['access_token']) {
//cannot get data. relogin?
}
$url = 'http://content.readyforsky.com'.$request;
//echo "<h4>$method $url </h4>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
$authorization = "Authorization: Bearer ".$token_data['access_token'];
$headers=array('Accept: application/json' , $authorization );
if ($method == 'POST') {
curl_setopt($ch, CURLOPT_POST, 1);
$data_string = json_encode($params);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
$headers[]='Content-Type: application/json, charset=utf-8';
$headers[]='Content-Length: ' . mb_strlen($data_string,'utf8');
}
/*
if (is_array($headers)) {
echo "<h4>".print_r($headers)."<hr>$data_string</h4>";
}
*/
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
curl_setopt($ch, CURLOPT_COOKIEJAR, $tmpfname);
curl_setopt($ch, CURLOPT_COOKIEFILE, $tmpfname);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // bad style, I know...
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
//curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$server_output = curl_exec($ch);
if (curl_errno($ch)) {
$errorInfo = curl_error($ch);
$info = curl_getinfo($ch);
echo "Curl error $info";
}
curl_close($ch);
//dprint($server_output);
$data=json_decode($server_output,true);
return $data;
}
// closing database connection
$db->Disconnect();