[Сценарий] Парсер балансов услуг Белтелеком РБ

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

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

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

[Сценарий] Парсер балансов услуг Белтелеком РБ

Сообщение S_Nick » Вс окт 27, 2019 5:35 pm

Умный дом получает и сообщает балансы услуг РУП Белтелеком РБ.

Данные получает из старой версии issaold.beltelecom.by личного кабинета работа которого будет прекращена в ближайшее время, но на данное время еще работает и его проще парсить.
Новая версия my.beltelecom.by уже более наворочена и с ней не все так просто.

Предварительно нужно создать объект Balance.

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

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

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["oper_user"])) $oper_user = $params["oper_user"];
if (isset($params["passwd"])) $passwd = $params["passwd"];

if (!$oper_user) $oper_user = "000000000000000"; //номер договора 15 цифр
if (!$passwd) $passwd = "**********"; //пароль

function browser_get_contents($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_beltelecom_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_beltelecom_by.txt');
	curl_setopt($ch, CURLOPT_REFERER, 'http://wmtransfer.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);
	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_beltelecom_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_beltelecom_by.txt');
	curl_setopt($ch, CURLOPT_REFERER, 'http://wmtransfer.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);
	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;
}

$ret = "Белтелеком. ";

//делаем до 3 запросов, т.к. сайт иногда не отвечает с первого раза
for ($i = 0; $i <= 3; $i++) {
	if (!$matchBalance[1][0]) {
        $url = "https://issaold.beltelecom.by/main.html";
        $page_cont = browser_get_contents($url);
        //print_r($page_cont);

        $param_arr = parse_form($page_cont);
        //print_r($param_arr);

        $param_arr['oper_user'] = $oper_user;
        $param_arr['passwd'] = $passwd;

        $url = "https://issaold.beltelecom.by/?";
        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://issaold.beltelecom.by/choice.html";
        $page_cont = browser_get_contents($url);
        //print_r($page_cont);

        preg_match_all("/Баланс (.*?) р./", $page_cont, $matchBalance);
        //print_r($matchBalance);

        preg_match_all("/&nbsp;\((.*?)\)<\/strong>/", $page_cont, $matchName);
        //print_r($matchName);
    }
}

if ($matchBalance[1][0]) {
	for ($i=0; $i<=count($matchBalance); $i++) {
     	$tarif = $matchName[1][$i];
     	$balance = number_format(round($matchBalance[1][$i], 2), 2);
     	sg("Balance.BTKNameTarif" . $i, $tarif);
        sg("Balance.BTKBalanceTarif" . $i, $balance);
		$ret .= "Тариф " . $tarif . ", баланс " . $balance . "р.. ";
	}
} else {
	$ret .= "Данные не получены. ";
 	//runScript("getBalanceBTK");
}

$ret = trim($ret);
if ($ret) {
	say($ret, $level);
	echo "<br>" . $ret;
}
Если есть мысли как оптимизировать улучшить код, пишите в теме.

Результат выполнения:
Белтелеком. Тариф Ясна 75, баланс 32.10р.. Тариф Телефон IMS в составе пакета, баланс 0.00р.. Тариф Умный дом, баланс 0.00р.
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
За это сообщение автора S_Nick поблагодарил:
nightwind (Пт янв 24, 2020 7:43 pm)
Рейтинг: 1.18%
Аватара пользователя
S_Nick
Сообщения: 65
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 51 раз
Контактная информация:

Re: [Сценарий] Парсер балансов услуг Белтелеком РБ

Сообщение S_Nick » Пт янв 24, 2020 8:14 pm

Парсер потерял актуальность, Белтелеком установил капчу на свой кабинет https://issaold.beltelecom.by/main.html :(
Аватара пользователя
nightwind
Сообщения: 329
Зарегистрирован: Вс июн 26, 2016 4:42 pm
Откуда: Барановичи
Благодарил (а): 27 раз
Поблагодарили: 51 раз
Контактная информация:

Re: [Сценарий] Парсер балансов услуг Белтелеком РБ

Сообщение nightwind » Сб янв 25, 2020 10:26 am

На основе вот этого сделал демона, шлет в mqtt, до сих пор работает, капча не мешает
За это сообщение автора nightwind поблагодарил:
S_Nick (Пн фев 03, 2020 8:07 pm)
Рейтинг: 1.18%
Аватара пользователя
S_Nick
Сообщения: 65
Зарегистрирован: Сб сен 30, 2017 7:44 pm
Откуда: Минск
Благодарил (а): 9 раз
Поблагодарили: 51 раз
Контактная информация:

Re: [Сценарий] Парсер балансов услуг Белтелеком РБ

Сообщение S_Nick » Пн фев 03, 2020 8:41 pm

Посмотрел исходники, данные вытягиваются из того же https://issaold.beltelecom.by

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

 
URL_LOGIN_PAGE = 'https://issaold.beltelecom.by/main.html'
URL_ACCOUNT_PAGE = 'https://issaold.beltelecom.by/main.html'
URL_STATISTIC_PAGE = 'https://issaold.beltelecom.by/statact.html'
URL_PAYMENTS_PAGE = 'https://issaold.beltelecom.by/payact.html'
Как-то странно, что у вас до сих пор работает :?:
Возможно не для всех IP капча выдается, у меня статика и капча постоянная.

Может быть уже кто-то написал парсер под новый кабинет my.beltelecom.by ?
Ответить