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

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

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

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

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

Сообщение S_Nick » Пт окт 25, 2019 7:43 pm

Внимание! Версия устарела, новая версия viewtopic.php?f=23&t=6789

Актуально для драйверов Яндекс.Такси. Может кому-то будет полезно.
Умный дом получает и сообщает баланс на счету водителя в Таксометре, сколько заработано за сегодня, за неделю/месяц (как настроете). А также, если выполнять в Cron, к примеру, каждые 5 минут (чаще не рекомендую), с параметром "change=1", будет сообщать сколько денег было только что заработано/списано.
Данные получает из Яндекс.Таксометра с сайта lk.taximeter.yandex.ru
Версия сырая, могут быть ошибки.

Внимание!
Пока работает через костыль, потому как не могу решить вопрос с OAuth авторизацией в Яндексе средствами PHP.
Костыль самописная программа Yandex.taximeter (прикреплена к теме) под Windows работающая в фоне на сервере, в каталоге "C:\_majordomo\htdocs\taximeter\taximeter.exe", в которой сначала нужно авторизироваться ручками, авторизация держится несколько дней (2-4 дня), затем нужно повторить процедуру.
Изображение
Если Алиса начала говорить: "Работа в Яндекс Такси. Данные не получены.", вероятно нужна повторная авторизация.
Предварительно в файле settings.ini нужно отредактировать параметр url = "https://lk.taximeter.yandex.ru/driver/?????????????????????????????" на ID водителя в системе.
Программа получает страницу https://lk.taximeter.yandex.ru/driver/????????????????????????????? каждые 5 минут и записывает содержимое в файл C:\_majordomo\htdocs\taximeter\driver.html ничего более она не делает, не вирус не волнуйтесь.
Изображение
Затем сценарий yandexTaximeter занимается дальнейшей обработкой этого файла.

Если есть мысли как оптимизировать улучшить код, пишите в теме.
Особенно, если знаете как авторизироваться в Яндексе средствами PHP, без костыля.

Предварительно нужно создать объект "toyota_prius" (можете переименовать по-своему в скрипте, если у вас другой авто). В свойствах объекта можно хранить историю, затем строить графики дохода.

Код сценария yandexTaximeter:

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

if (isset($params["level"])) $level = $params["level"]; else $level = 1;
if (!isOnline('Internet')) { say("Нет доступа в Интернет!", $level); return; }
if (isset($params["change"])) $change = $params["change"];

$page_url = "https://lk.taximeter.yandex.ru/driver/?????????????????????????????";
$page_url = "c:/_majordomo/htdocs/taximeter/driver.html"; //КОСТЫЛЬ!
$page_cont = file_get_contents($page_url);

$ret = "Работа в Яндекс Такси. ";

if ($page_cont) {
	
	//<div><input type="text" readonly="readonly" value="(.*?)"></div>
	preg_match_all("/<div><input type=\"text\" readonly=\"readonly\" value=\"(.*?)\"><\/div>/ui", $page_cont, $match);
	$status = $match[1][0];
	if ($status) {
 		$ret .= "Сейчас водитель: " . $status . ". ";
	} else {
     	$ret .= "Данные не получены.";
    }
	
 	//<input type="text" readonly="readonly" value="(.*?)" data-placement="left" data-original-title="Формат LAT, LON" rel="tooltip">
	preg_match_all("/<input type=\"text\" readonly=\"readonly\" value=\"(.*?)\" data-placement=\"left\"/ui", $page_cont, $match);
	$сoordinates = $match[1][0];
 
	//<a href="/driver/c858b200e95a01b73d06824a2bb23471/balance">(.*?)</a>
	preg_match_all("/<a href=\"\/driver\/c858b200e95a01b73d06824a2bb23471\/balance\">(.*?)<\/a>/ui", $page_cont, $match);
	$balance = $match[1][0];
 	$balance = str_replace('&nbsp;', '', $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 .= "Данные не получены.";
}

if ($ret) {
	say($ret, $level);
	say2s0($ret, $level);
	echo "<br>" . $ret;
}

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

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

runScript("yandexTaximeter", array("change"=>"1"));
Пример выполнения:
Работа в Яндекс Такси. Сейчас водитель: На заказе. На счету: 1868 р.. Сегодня заработано: 47 р.. За неделю: 260 р..
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
Вложения
taximeter.zip
taximeter
(11.14 КБ) 277 скачиваний
segor1982
Сообщения: 1
Зарегистрирован: Вт июл 18, 2023 3:16 pm
Благодарил (а): 0
Поблагодарили: 0

Re: [Сценарий] Парсер для водителей Яндекс.Такси (устарел)

Сообщение segor1982 » Вт июл 18, 2023 4:50 pm

А что служб такси предлагающих готовые подобные решения сейчас нету? А то я в подобном кодинге не силен от слова "совсем" и не хочу сам туда лезть.
Ответить