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

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

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

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

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

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

Умный дом получает и сообщает суммы по счетам за домашний телефон РУП Белтелеком РБ.
Актуально для пользователей из РБ. Может кому-то будет полезно.

Да, уже архаичность, но Белтелеком в РБ пока навязывает его в нагрузку к интернету и другим услугам.
C параметром "change=1", будет сообщать только в случае если счет уже выставлен в текущем месяце.
Данные получает из ЕРИП с сайта wmtransfer.by Версия сырая, могут быть ошибки. Тестировалось только на Витебской области.

Нужна небольшая адаптация под вашу область, изменением переменной $n

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

$n = 10111 //Минск
$n = 10092 //Брестская обл.
$n = 10193 //Витебская обл.
$n = 10214 //Гомельская обл.
$n = 10145 //Гродненская обл.
$n = 10141 //Минская обл.
$n = 10016 //Могилевская обл.
Если нужно проверить несколько номеров, можно вызывать скрипт с параметром &account - номер телефона с кодом

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

/objects/?script=getBalanceA1&account=000000000
Предварительно нужно создать объект Balance. В свойствах объекта можно хранить историю, затем строить графики расхода по месяцам.

Код скрипта getBalanceBTKTel:

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

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["account"])) $account = $params["account"];

if (!$account) $account = "********"; //телефон с кодом
$n = 10193; //код раздела в ЕРИП
/*
$n = 10111 //Минск
$n = 10092 //Брестская обл.
$n = 10193 //Витебская обл.
$n = 10214 //Гомельская обл.
$n = 10145 //Гродненская обл.
$n = 10141 //Минская обл.
$n = 10016 //Могилевская обл.
*/

function browser_get_contents($url) {
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie_wmtransfer_by.txt');
	curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie_wmtransfer_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;
}

// ------------------------ BEGIN: ТЕЛО ПАРСЕРА ------------------------ 
$url = "http://wmtransfer.by/pay.asp?n=" . $n; //ссылка на платеж
$page_cont = browser_get_contents($url);
//print_r($page_cont);

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

$url = "https://pay.wmtransfer.by/pls/iSOU/!iSOU.Authentication?";
foreach($param_arr as $key => $value) {
	$url .= "&" . $key . "=" . urlencode($value);
}
//print_r($url);

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

$url = "https://pay.wmtransfer.by/pls/iSOU/!iSOU.PaymentPrepare?service_no=" . $n . "&ExtraInfoText=&ParamCount=&Amount=&AmountCurr=&ServiceInfoId=";
$page_cont = browser_get_contents($url);
//print_r($page_cont);

$param_arr = parse_form($page_cont);
$param_arr["param1"] = $account;
//print_r($param_arr);

$url = "https://pay.wmtransfer.by/pls/iSOU/!iSOU.PaymentPrepare?";
foreach($param_arr as $key => $value) {
	$url .= "&" . $key . "=" . urlencode($value);
}
//print_r($url);

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

$param_arr = parse_form($page_cont);
//print_r($param_arr);
// ------------------------ END: ТЕЛО ПАРСЕРА ------------------------ 

$balance = $param_arr['Amount'];
$balance = str_replace(",", ".", $balance);
$balance = trim($balance);

$page_cont = str_replace("\r" , "", $page_cont);
$page_cont = str_replace("\n" , "", $page_cont);
preg_match_all("/<PRE>(.*?)<\/PRE>/i", $page_cont, $match);
$page_cont = $match[1][0];
$page_cont = preg_replace("/[^0-9.,:;]/", "", $page_cont);
preg_match_all("/:(.*?);/", $page_cont, $match);
$param_arr = $match;
//print_r($param_arr);
$balance_abon = $param_arr[1][0];
$balance_apus = $param_arr[1][1];
$balance_mts = $param_arr[1][2];
$balance_pay = $param_arr[1][3];
$balance_dolg = $param_arr[1][4];

if ($balance <> 0) {
	sg("Balance.HouseTelephoneBalance", $balance);
	$ret .= "Выставлен счет за Дом+ашний Телефон " . $balance . " р.. ";
 	if ($balance_abon <> 0) $ret .= "Абонплата: " . $balance_abon . " р.. ";
	if ($balance_apus <> 0) $ret .= "Наговорили: " . $balance_apus . " р.. ";
	if ($balance_mts <> 0) $ret .= "За межгород: " . $balance_mts . " р.. ";
 	if ($balance_pay <> 0) $ret .= "Итого к оплате: " . $balance_pay . " р.. ";
 	if ($balance_dolg <> 0) $ret .= "Задолженность: " . $balance_dolg . " р.. ";
} else {
	if (!$change) {
     	$ret .= "В текущем месяце Дом+ашний Телефон уже оплачен, " . $balance_pay . " р.. ";
     	if ($balance_dolg == 0) $ret .= "Задолженности нет. ";
    }
}

$ret = trim($ret);
if ($ret) {
 	say($ret, $level);
	echo "<br>" . $ret;
}
UPDATE: 12.11.2019 - Исправлены логические ошибки

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

Код для Cron (Рекомендую выполнять не чаще 2 раз в дневное время):

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

runScript("getBalanceBTKTel", array("change"=>"1"));
Результат выполнения:
В текущем месяце Дом+ашний Телефон уже оплачен 7,51 р.. Задолженности нет.
P/S. Модераторы. Если я опубликовал не в тот раздел тему, пожалуйста перенесите, поправьте.
Ответить