Парсим данные из личного кабинета het.uz

По ходу построения дэшборда для своего умного дома, мне захотелось вытащить данные по балансу в кабинете поставщика электроэнергии. К сожалению, договориться по-хорошему с представителями данной конторы не получилось, а народного API у них совсем не предусмотрено. Пришлось работать с тем, что есть.

UPD: Устарело! Актуальная информация тут.

Следует отметить, что помимо отсутствия API для простого юзера (процессинговые центры всё-же имеют какой-то интерфейс) сам кабинет пользователя ещё и защищается от парсинга, проверяя в заголовке идентификатор юзер агента. Зачем? Фиг их знает! Спасибо, что хотя бы капчу не воткнули…

Далее, представляю небольшой код на php для парсинга данных из кабинета.

<?php
	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, 'https://mu.het.uz:7004/pcabinet/ru/logon.jsp');
	curl_setopt($ch, CURLOPT_USERAGENT,'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/44.0.2403.89 Safari/537.36');
	curl_setopt($ch, CURLOPT_POST, true);
	curl_setopt($ch, CURLOPT_POSTFIELDS, "login=Номер счёта&password=пароль");
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
	curl_setopt($ch, CURLOPT_HTTP09_ALLOWED, true);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
	$headers = array(
	   "Connection: keep-alive",
	   "Keep-Alive: timeout=5, max=100",
	);
	curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
	curl_setopt($ch, CURLOPT_COOKIESESSION, true);
	curl_setopt($ch, CURLOPT_COOKIEJAR, '/tmp/getel');  //could be empty, but cause problems on some hosts
	curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp/getel');  //could be empty, but cause problems on some hosts

	$answer = curl_exec($ch);
	if (curl_error($ch)) {
		echo curl_error($ch);
	}
	sleep(1);

	curl_setopt($ch, CURLOPT_URL, 'https://mu.het.uz:7004/pcabinet/ru/physical/current_calc.jsp');
	curl_setopt($ch, CURLOPT_POST, false);
	$answer = mb_convert_encoding(curl_exec($ch),"utf-8", "windows-1251");

	if (curl_error($ch)) {
		echo curl_error($ch);
	}
	curl_close($ch);

	$answer = findin('<table class=table>','</table>',$answer);
	$answer = explode('<tr>', $answer);
	$ttd = str_replace(' nowrap', '', $answer[3]);
	$td = explode('<td class=td>', $ttd);
	foreach($td as $sum){
		$out[] = str_replace(' ', '', $sum);
	}
	
	if($out[10] > 0){
		$account = round($out[10]);
	} elseif ($out[9] > 0) {
		$account = "-".round($out[9]);
	}
	echo $account;
	// Кешируем результат в текстовый файлик на всякий случай ;)
	file_put_contents('eldump.txt',$account);
	function findin($arg1,$arg2,$text){
		$text = stristr($text, $arg1);
		$text = stristr($text, $arg2, true);
		$text = str_replace($arg1,"",$text);
		return $text;
	}
?>

Вот собственно и весь парсер. Иногда срабатывает не с первого раза, уж такой у них там кабинет.

Если вам понравилась статья и пригодился мой код, подкиньте админу на пиво ;)