
По ходу построения дэшборда для своего умного дома, мне захотелось вытащить данные по балансу в кабинете поставщика электроэнергии. К сожалению, договориться по-хорошему с представителями данной конторы не получилось, а народного API у них совсем не предусмотрено. Пришлось работать с тем, что есть.
Следует отметить, что помимо отсутствия API для простого юзера (процессинговые центры всё-же имеют какой-то интерфейс) сам кабинет пользователя ещё и защищается от парсинга, проверяя в заголовке идентификатор юзер агента. Зачем? Фиг их знает! Спасибо, что хотя бы капчу не воткнули…
Далее, представляю небольшой код на php для парсинга данных из кабинета.
<?php $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, 'http://mu.het.uz:7003/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=XXXXXXXXXXXXX&password=XXXX"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_COOKIESESSION, true); curl_setopt($ch, CURLOPT_COOKIEJAR, ''); curl_setopt($ch, CURLOPT_COOKIEFILE, '/tmp'); $answer = curl_exec($ch); if (curl_error($ch)) { echo curl_error($ch); } sleep(3); curl_setopt($ch, CURLOPT_URL, 'http://mu.het.uz:7003/pcabinet/ru/physical/current_calc.jsp'); curl_setopt($ch, CURLOPT_POST, false); curl_setopt($ch, CURLOPT_POSTFIELDS, ""); $answer = mb_convert_encoding(curl_exec($ch),"utf-8", "windows-1251"); if (curl_error($ch)) { echo curl_error($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){ echo $out[10]; } elseif ($out[9] > 0) { echo "-".$out[9]; } function findin($arg1,$arg2,$text){ $text = stristr($text, $arg1); $text = stristr($text, $arg2, true); $text = str_replace($arg1,"",$text); return $text; } ?>
Вот собственно и весь парсер. Иногда срабатывает не с первого раза, уж такой у них там кабинет.
Если вам понравилась статья и пригодился мой код, подкиньте админу на пиво ;)