[Сценарий] Парсер для водителей Яндекс.Такси v2

Не требует установки программ или изменения файлов

Модераторы: immortal, newz20

Ответить
Аватара пользователя
S_Nick
Сообщения: 67
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 55 раз
Контактная информация:

[Сценарий] Парсер для водителей Яндекс.Такси v2

Сообщение S_Nick » Вт окт 29, 2019 1:12 am

Представляю вашему вниманию парсер для водителей Яндекс.Такси версии 2

Актуально для драйверов Яндекс.Такси. Может кому-то будет полезно.
Умный дом получает и сообщает баланс на счету водителя в Таксометре, сколько заработано за сегодня, за неделю/месяц (как настроите). А также, если выполнять в 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
Код сценария yandexTaximeter_v2

Код: Выделить всё

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;
}
UPDATE 29.10.2019 - Побеждена Яшкина авторизация средствами PHP!

Код для Cron:
Crontab */5 * * * *

Код: Выделить всё

runScript("yandexTaximeter_v2", array("change"=>"1"));
Пример выполнения:
Работа в Яндекс Такси. Сейчас водитель: Offline. На счету: 2035 р.. Сегодня ничего не заработано. За неделю: 337 р..
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
Ответить