По ходу построения дэшборда для своего умного дома, мне захотелось вытащить данные по балансу в кабинете поставщика электроэнергии. К сожалению, договориться по-хорошему с представителями данной конторы не получилось, а народного 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;
}
?>
Вот собственно и весь парсер. Иногда срабатывает не с первого раза, уж такой у них там кабинет.
Если вам понравилась статья и пригодился мой код, подкиньте админу на пиво ;)