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

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

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

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

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

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

Актуально для пользователей из РБ обладателям карты "Статускаты" (на ней тестировалось) Статусбанка . Может кому-то будет полезно.
Умный дом говорит баланс карты. А также, если выполнять в Cron, к примеру, каждые 15 минут (чаще не рекомендую, могут быть претензии от банка), с параметром "change=1", будет сообщать сколько денег было потрачено/пополнено.
Данные получает из Интернет-банка с сайта stb24.by
Версия сырая, могут быть ошибки. Возможно не будет работать, если у вас несколько карт в этом банкинге, либо у вас какая-то другая карта, тестировалось на "Статускарте", других у меня нет от этого банка.
Если есть мысли как оптимизировать улучшить код, пишите в теме.

Предварительно нужно создать объект Balance. В свойствах объекта можно хранить историю, затем строить графики ваших расходов.

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

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

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 = "**********"; //ваш пароль

function browser_get_contents($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_stb24_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_stb24_by.txt');
	curl_setopt($ch, CURLOPT_REFERER, 'https://stb24.by');
	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;
}

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

//делаем до 3 запросов, т.к. сайт иногда не отвечает с первого раза
for ($i = 0; $i <= 3; $i++) {
	if (!$page_cont) {
		$url = "https://stb24.by/ipwd/!iSOU.Authentication?aMode=A&sso_p_Login=" . $login . "&sso_p_Password=" . $password . "&auth_login_type=PWD&btn_submit101=ok";
		browser_get_contents($url);
		$url = "https://stb24.by/ipwd/!iSOU.ShowPage";
		browser_get_contents($url);
		$url = "https://stb24.by/ipwd/!iSOU.AccActionParam?acc_type=1&acc_idx=1&act_idx=3&amp;aMode=A&opt=1";
		$page_cont = browser_get_contents($url);
    }
}

if ($page_cont) {
	preg_match_all("/<br>(.*?)BYN/", $page_cont, $match);
 	//print_r($match);
	$balance = $match[1][0];
	$balance = preg_replace('/[^0-9,]/', '', $balance);
 	$balance = str_replace(',', '.', $balance);
}

$ret = "Статускарта. ";
if ($balance) {
 	if ($change) {
     	if (gg("Balance.StatusbankBalance") !== $balance) {
     		$now_balance = round($balance - gg("Balance.StatusbankBalance"), 2);
     		if ($now_balance > 0) {
         		$ret .= "Только что пополнено: " . abs($now_balance) . " р.! Итого: ". $balance . " р.. ";
            }
        	if ($now_balance < 0) {
         		$ret .= "Только что потрачено: " . abs($now_balance) . " р.. Остаток баланса: ". $balance . " р.. ";
        	}
        } else {
         	$ret = "";
        }
     	sg("Balance.StatusbankBalance", $balance);
	} else {
 		sg("Balance.StatusbankBalance", $balance);
		$ret .= "На счету: " . $balance . " р.. ";
		
 		$rate_min = getHistoryMax("Balance.StatusbankBalance", strtotime('now 00:00:00'));
 		$rate_now =  round($balance - $rate_min, 2);
 		if ($rate_now < 0) {
 			$ret .= "Сегодня потрачено: " . abs($rate_now) . " р.. ";
		}
 		if ($rate_now > 0) {
     		$ret .= "Сегодня пополнено: " . $rate_now . " р.. ";
    	}
    	if ($rate_now == 0) {
 			$ret .= "Сегодня не было расходов. ";
		}
    }
} else {
 	$ret .= "Баланс не получен. ";
  	$ret .= "Повторный запрос. ";
 	runScript("getBalanceStatusBank");
}

$ret = trim($ret);
if ($ret) {
	say($ret, $level);
	echo "<br>" . $ret;
}
UPDATE 28.10.2019 - Повышена стабильность получения данных

Код для Cron (Рекомендую выполнять не чаще 15 минут):
Crontab: */15 * * * *

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

runScript("getBalanceStatusBank", array("change"=>"1"));
Пример выполнения:
Статускарта. На счету: 1372.32 р.. Сегодня потрачено: 43.21 р..
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
Ответить