[Сценарий] Парсер для получения суммы покупок в Евроопт РБ

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

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

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

[Сценарий] Парсер для получения суммы покупок в Евроопт РБ

Сообщение S_Nick » Сб окт 26, 2019 4:14 pm

Умный дом получает и сообщает сумму всех ваших покупок в сети "Евроопт" РБ в текущем месяце, а также сообщает дату и сумму крайней покупки.

Если нужно проверить несколько дисконтных карт, можно вызывать скрипт с параметром $cardNumber - номер дисконтной карты (17 цифр)

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

/objects/?script=getBalanceEvroopt&cardNumber=*****************
Предварительно нужно создать объект Balance. В свойствах объекта можно хранить историю, затем строить графики ваших расходов.

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

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

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

//создать аккаунт можно здесь https://e-account.by/account/ru/enter/
$username = "375*********"; //логин личного кабинета (номер телефона с кодом 375290000000)
$password = "*********"; //пароль личного кабинета
$cardNumber = "*****************"; //номер дисконтной карты (17 цифр)

function browser_get_contents($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_evroopt_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_evroopt_by.txt');
	curl_setopt($ch, CURLOPT_REFERER, 'https://e-account.by/account/ru/enter/');
	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_evroopt_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_evroopt_by.txt');
	curl_setopt($ch, CURLOPT_REFERER, 'https://e-plus.by/cabinet/history/?cardNumber=23400100062186413');
	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;
}

function get_diff_days($old_date) {
	if ($old_date == null) return 0;
	//разница между датами
 	$date1 = explode(".", $old_date);
	$date2 = explode(".", date("d.m.Y"));
	$date1 = mktime(0,0,0,$date1[1],$date1[0],$date1[2]);
	$date2 = mktime(0,0,0,$date2[1],$date2[0],$date2[2]);
	$diff_days = floor(($date2 - $date1) / 86400);
 	if ($diff_days == 0) $diff_days = "сегодня";
 	if ($diff_days == 1) $diff_days = "вчера";
 	if ($diff_days == 2) $diff_days = "позавчера";
 	if ($diff_days == 3) $diff_days = "3 дня назад";
 	if ($diff_days == 4) $diff_days = "4 дня назад";
 	if ($diff_days == 5) $diff_days = "5 дней назад";
 	if ($diff_days == 6) $diff_days = "6 дней назад";
 	if ($diff_days == 7) $diff_days = "неделю назад";
	if ($diff_days > 7) $diff_days = $old_date;
	return $diff_days;
}

@unlink('../cookie_evroopt_by.txt'); //удаляем куки

$ret = "Евро-опт. ";
$url = "https://e-account.by/account/ru/enter/";
$page_cont = browser_get_contents($url);
$param_arr = parse_form($page_cont);
$param_arr['username'] = $username;
$param_arr['password'] = $password;
$param_arr['form_name'] = 'form-login';
unset($param_arr['username_j']);
unset($param_arr['password_j']);
unset($param_arr['submit_j']);
//print_r($param_arr);

$url = "https://e-account.by/account/ru/enter/userlogin/?";
foreach($param_arr as $key => $value) {
	$param .= "&" . $key . "=" . $value;
}
//print_r($url);
//print_r($param);

$page_cont = browser_post_contents($url, $param);
//print_r($page_cont);

$url = "https://e-account.by/account/";
$page_cont = browser_get_contents($url);
//print_r($page_cont);

$url = "https://e-plus.by/cabinet/history/?cardNumber=" . $cardNumber;
$page_cont = browser_get_contents($url);
//print_r($page_cont);

$page_cont = browser_get_contents($page_cont);
//print_r($page_cont);

$url = "https://e-account.by/account/ru/select/back/";
$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);

if ($page_cont) {
	preg_match_all("/<strong>(.*?)<\/strong>/", $page_cont, $match);
	//print_r($match);
 	
	$balance = number_format(round($match[1][1], 2), 2);
	if ($balance) {
     	sg("Balance.EvrooptBalance" , $balance);
		$ret .= "В текущем месяце " . $match[1][0] . " " . $balance . " р.. ";
	}
 	
	preg_match_all("/<div class=\"info\">(.*?)<\/div>/", $page_cont, $match);
	//print_r($match);
 	$math_count = count($match[1]);
 	$last_bay_date = $match[1][$math_count-6];
	sg("Balance.EvrooptLastBayDate" , $last_bay_date);
 	$last_bay_date_diff = get_diff_days($last_bay_date);
 	
 	$last_bay_summa = $match[1][$math_count-4];
 	$last_bay_summa = number_format(round($last_bay_summa, 2), 2);
 	sg("Balance.EvrooptLastBaySumma" , $last_bay_summa);
 	
 	if ($last_bay_date && $last_bay_summa) {
 		$ret .= "Крайняя покупка была " . $last_bay_date_diff . ", на сумму " . $last_bay_summa . " р.. ";
	}
} else {
 	$ret .= "Данные не получены. ";
 	//runScript("getBalanceEvroopt");
}

$ret = trim($ret);
if ($ret) {
 	say($ret, $level);
	echo "<br>" . $ret;
}
UPDATE 28.10.2019 - Решена проблема с мудреной авторизацией

Если есть мысли как оптимизировать улучшить код, пишите в теме.

Пример выполнения:
Евро-опт. В текущем месяце Общая сумма покупок: 702.70 р.. Крайняя покупка была вчера, на сумму 22.69 р.
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
Ответить