Актуально для драйверов Яндекс.Такси. Может кому-то будет полезно.
Умный дом получает и сообщает баланс на счету водителя в Таксометре, сколько заработано за сегодня, за неделю/месяц (как настроите). А также, если выполнять в Cron, к примеру, каждые 5 минут (чаще не рекомендую), с параметром "change=1", будет сообщать сколько денег было только что заработано/списано.
Данные получает из Яндекс.Таксометра с сайта lk.taximeter.yandex.ru
Версия сырая, могут быть ошибки.
Первая версия представлена в ветке viewtopic.php?f=23&t=6771
Работала через костыль в виде демона (программы висящей в фоне на сервере) для Windows. Недостатком которого было трата ресурсов сервера и периодической ручной авторизацией, раз в 2-4 дня. Причиной этому была сложная многоуровневая система авторизации Яндекса, которую на то время я не мог победить.
Новая версия лишена этих недостатков. Работает полностью автономно и только на PHP.
Старую версию я решил не удалять с форума, т.к. она тоже рабочая и считаю имеет право на жизнь, возможно будет кому-то полезной.
Предварительно нужно создать объект "toyota_prius" (можете переименовать по-своему в скрипте, если у вас другой авто). В свойствах объекта можно хранить историю, затем строить графики дохода.
Переменные для авторизации в системе Яндекса
Код: Выделить всё
$login = "***************"; //логин Яндекс аккаунта
$password = "***************"; //пароль Яндекс аккаунта
$driver_id = "c858b200e95a01b73d06824a2bb23471"; //идентификатор водителя в системе Яндекс.Таксометр
//получить его можно из URL https://lk.taximeter.yandex.ru/driver/c858b200e95a01b73d06824a2bb23471
Код: Выделить всё
if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];
$login = "***************"; //логин Яндекс аккаунта
$password = "***************"; //пароль Яндекс аккаунта
$driver_id = "c858b200e95a01b73d06824a2bb23471"; //идентификатор водителя в системе Яндекс.Таксометр
//получить его можно из URL https://lk.taximeter.yandex.ru/driver/c858b200e95a01b73d06824a2bb23471
function browser_get_contents($url) {
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_taximeter_by.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_taximeter_by.txt');
curl_setopt($ch, CURLOPT_REFERER, 'https://passport.yandex.ru/auth/');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$html = curl_exec($ch);
$info_arr = curl_getinfo($ch);
//print_r($info_arr);
if ($info_arr['redirect_url']) {
$html = $info_arr['redirect_url'];
}
curl_close($ch);
return $html;
}
function browser_post_contents($url, $param) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_taximeter_by.txt');
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_taximeter_by.txt');
curl_setopt($ch, CURLOPT_REFERER, 'https://passport.yandex.ru/auth/');
curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
//print_r(curl_getinfo($ch));
$html = curl_exec($ch);
$info_arr = curl_getinfo($ch);
//print_r($info_arr);
if ($info_arr['redirect_url']) {
$html = $info_arr['redirect_url'];
}
curl_close($ch);
return $html;
}
function parse_form($page_cont) {
if ($page_cont) {
$page_cont = str_replace("\r" , "", $page_cont);
$page_cont = str_replace("\n" , "", $page_cont);
//print_r($page_cont);
preg_match_all("/<FORM(.*?)<\/FORM>/i", $page_cont, $matchForm);
//print_r($matchForm);
//$page_cont = $matchForm[0][0];
preg_match_all("/<INPUT(.*?)>/i", $page_cont, $matchInput);
//print_r($matchInput[1]);
foreach($matchInput[1] as $key => $value) {
preg_match_all("/NAME=\"(.*?)\"/i", $value, $matchName);
//print_r($matchName[1][0]);
preg_match_all("/VALUE=\"(.*?)\"/i", $value, $matchValue);
//print_r($matchValue[1][0]);
$param_arr[$matchName[1][0]] = $matchValue[1][0];
}
//$param_arr = array_filter($param_arr);
unset($param_arr['']);
//print_r($param_arr);
}
return $param_arr;
}
//----------------- BEGIN: НАЧАЛО ЯШКИНОЙ АВТОРИЗАЦИИ!
@unlink('../cookie_taximeter_by.txt'); //удаляем куки
//делаем до 3 запросов, т.к. сайт иногда не отвечает с первого раза
for ($i = 0; $i <= 3; $i++) {
if (!$page_cont) {
$url = "https://passport.yandex.ru/auth?";
$page_cont = browser_get_contents($url);
//print_r($page_cont);
$param_arr = parse_form($page_cont);
//print_r($param_arr);
$param_arr['login'] = $login;
$param_arr['hidden-password'] = $password;
//print_r($param_arr);
$url = "https://passport.yandex.ru/auth?retpath=https%3A%2F%2Flk.taximeter.yandex.ru%2F?";
foreach($param_arr as $key => $value) {
$param .= "&" . $key . "=" . $value;
}
//print_r($param);
$page_cont = browser_post_contents($url, $param);
//print_r($page_cont);
$param_arr = parse_form($page_cont);
//print_r($param_arr);
$param_arr['login'] = $login;
$param_arr['passwd'] = $password;
//print_r($param_arr);
$url = "https://passport.yandex.ru/auth?retpath=https%3A%2F%2Flk.taximeter.yandex.ru%2F?";
foreach($param_arr as $key => $value) {
$param .= "&" . $key . "=" . $value;
}
$page_cont = browser_post_contents($url, $param);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
$url = "https://lk.taximeter.yandex.ru/driver/" . $driver_id;
$page_cont = browser_get_contents($url);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);
}
}
//----------------- END: ПОБЕДА ЯШКИНОЙ АВТОРИЗАЦИИ!
$ret = "Работа в Яндекс Такси. ";
if ($page_cont) {
preg_match_all("/<div><input type=\"text\" value=\"(.*?)\"/ui", $page_cont, $match);
//print_r($match);
$status = $match[1][0];
if ($status == "Working an order") $status = "Выполняет заказ";
if ($status == "Available") $status = "Ожидает заказ";
if ($status == "Busy") $status = "В системе, но не на линии";
if ($status == "Offline") $status = "Не работает";
if ($status) {
$ret .= "Сейчас водитель: " . $status . ". ";
} else {
$ret .= "Данные не получены. ";
}
preg_match_all("/<a href=\"\/driver\/" . $driver_id . "\/balance\">(.*?)<\/a>/ui", $page_cont, $match);
$balance = $match[1][0];
$balance = str_replace(',', '', $balance);
$balance = str_replace(' ', '', $balance);
$balance = intval($balance);
if ($balance) {
$ret .= "На счету: " . $balance . " р.. ";
/*
$fuel = round($balance * 22 / 100);
$ret .= "Оплата топлива: " . $fuel . " р.. ";
$nalog = round($balance * 5 / 100);
$ret .= "Налог МНС: " . $nalog . " р.. ";
$bank = round($balance * 1.5 / 100);
$ret .= "Комиссия банка: " . $bank . " р.. ";
$driver = round(($balance - $fuel - $nalog - $bank) * 70 / 100);
$ret .= "Зароботок водителя: " . $driver . " р.. ";
$morja = round(($balance - $fuel - $nalog - $bank) * 30 / 100);
$ret .= "Прибыль: " . $morja . " р.. ";
*/
$rate_min = getHistoryMin("toyota_prius.TaximeterBalance", strtotime('now 00:00:00'));
$rate_now = $balance - $rate_min;
if ($rate_now < 0) {
$ret .= "Сегодня списано: " . $rate_now . " р.. ";
}
if ($rate_now > 0) {
$ret .= "Сегодня заработано: " . $rate_now . " р.. ";
}
if ($rate_now == 0) {
$ret .= "Сегодня ничего не заработано. ";
}
$rate_min = getHistoryMin("toyota_prius.TaximeterBalance", strtotime("-7 day"));
$rate_now = $balance - $rate_min;
if ($rate_now < 0) {
$ret .= "За неделю списано: " . $rate_now . " р.. ";
}
if ($rate_now > 0) {
$ret .= "За неделю: " . $rate_now . " р.. ";
}
if ($rate_now == 0) {
$ret .= "За неделю ничего не заработано. ";
}
}
if ($change && $status && $balance) {
$ret = "";
if ($status && gg("toyota_prius.TaximeterStatus") !== $status) {
$ret .= "Водитель Yandex Такси изменил статус на: " . $status;
sg("toyota_prius.TaximeterStatus", $status);
}
if ($balance && gg("toyota_prius.TaximeterBalance") !== $balance) {
$now_balance = $balance - gg("toyota_prius.TaximeterBalance");
if ($now_balance > 0) {
$ret = "Только что в Yandex Такси заработано: " . $now_balance . " р.! Итого: ". $balance . " р.. ";
}
if ($now_balance < 0) {
$ret = "Только что в Yandex Такси списано: " . $now_balance . " р.. Остаток баланса: ". $balance . " р.. ";
}
sg("toyota_prius.TaximeterBalance", $balance);
}
if (gg("toyota_prius.TaximeterCoordinates") !== $сoordinates) {
sg("toyota_prius.TaximeterCoordinates", $сoordinates);
}
}
} else {
$ret .= "Данные не получены. ";
}
$ret = trim($ret);
if ($ret) {
say($ret, $level);
echo "<br>" . $ret;
}
Код для Cron:
Crontab */5 * * * *
Код: Выделить всё
runScript("yandexTaximeter_v2", array("change"=>"1"));
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.Работа в Яндекс Такси. Сейчас водитель: Offline. На счету: 2035 р.. Сегодня ничего не заработано. За неделю: 337 р..