/si', trim($tags), $tags); $tags = array_unique($tags[1]); if(is_array($tags) AND count($tags) > 0) { if($invert == FALSE) { return preg_replace('@<(?!(?:'. implode('|', $tags) .')\b)(\w+)\b.*?>.*?@si', '', $text); } else { return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?@si', '', $text); } } elseif($invert == FALSE) { return preg_replace('@<(\w+)\b.*?>.*?@si', '', $text); } return $text; } function is_domDocument($object) { if($object instanceof DOMDocument) { return true; } else { return false; } } function DOMinnerHTML($element) { try { $innerHTML = ""; $children = $element->childNodes; foreach ($children as $child) { $innerHTML .= $element->ownerDocument->saveHTML($child); } return $innerHTML; } catch(Exception $e) { echo "EXCEPTION IN DOMinnerHTML: ", $e->getMessage(); } } function endsWith($haystack, $needle) { $length = strlen($needle); if ($length == 0) { return true; } return (substr($haystack, -$length) === $needle); } function startsWith ($string, $startString) { $len = strlen($startString); return (substr($string, 0, $len) === $startString); } function get_string_between($string, $start, $end){ $string = ' ' . $string; $ini = strpos($string, $start); if ($ini == 0) return ''; $ini += strlen($start); $len = strpos($string, $end, $ini) - $ini; return substr($string, $ini, $len); } /* Errors: -1 username or password not specified (aj blin dis a mast sou dej hev jor informejšon) -2 you are not logged in (aj blin trms of srvis bi neseseri) -3 bad username and/or password (diplomatski odgovor ;-) -4 not written yet (suka bljet) -5 session exists in another system (sucky) -6 error in fetched data */ class itisClient { private $username; private $password; public $version = array(0, 1, 2); private $programname = "itisclient"; private $programdomain = 'itisclient.sijanec.tk'; private $cookiedir; // set at runtime, ker je get_curerent_user, v login() private $mainpage = "https://www.itis.si/"; private $mainpageaction = "https://www.itis.si/?rw=1"; private $iskanjestran = "https://www.itis.si/iskanje/stran-"; public function setusername($value) { $this->username = $value; } public function setpassword($value) { $this->password = $value; } private function get($property) { return $this->$property; } public function getversion() { return $this->version; } private function login() { if (empty($this->username) || empty($this->password)) { return -1; } $this->cookiedir = '/tmp/'.posix_getuid().'/'.$this->programdomain.'/cookiedir/'; if (!is_dir($this->cookiedir.$this->username)) { if (!mkdir($this->cookiedir.$this->username, 0700, true)) { // x permišn mora bit', da lahko dela poddirektorije, hence true, hence 0700; group in others pa je 0, da ne morejo brati piškotkov!!! zeloo pomembno! return -5; } } $ch = curl_init(); // curl_setopt($ch, CURLOPT_SSLVERSION, CURL_SSLVERSION_TLSv1_0); curl_setopt($ch, CURLOPT_COOKIESESSION, true ); curl_setopt($ch, CURLOPT_COOKIEJAR, $this->cookiedir.$this->username."/cookie.txt" ); // cookiejar curl_setopt($ch, CURLOPT_COOKIEFILE, $this->cookiedir.$this->username."/cookie.txt" ); // coolie file // this scuks // curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); // curl_setopt($ch, CURLOPT_HEADER, 1); // return headers? curl_setopt($ch, CURLOPT_VERBOSE, TRUE); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // return transfer? curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1); // follow 3xx redirects? curl_setopt($ch, CURLOPT_MAXREDIRS, 10); // max 3xx redirectas? curl_setopt($ch, CURLOPT_USERAGENT, $this->programdomain."/".implode(".", $this->version)); curl_setopt($ch, CURLOPT_AUTOREFERER, 1); // auto send refereres? curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); // timeout for tcp connection curl_setopt($ch, CURLOPT_TIMEOUT, 10); // timeout for http response curl_setopt($ch, CURLOPT_URL, $this->mainpage); curl_setopt($ch, CURLOPT_POST, 0); $login_page = curl_exec($ch); $xmlDoc = new DOMDocument(); $xmlDoc->loadHTML( $login_page ); $formNode = $xmlDoc->getElementsByTagName( "form" )[0]; // only one form $searchNode = $formNode->getElementsByTagName("input"); foreach( $searchNode as $sn ) { if($sn->getAttribute('name') != 'ctl00$navigationLogin$tbUsername' && $sn->getAttribute('name') != 'ctl00$navigationLogin$tbPassword' && $sn->getAttribute("type") != "submit") $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&"; } curl_setopt($ch, CURLOPT_URL, $this->mainpageaction); curl_setopt($ch, CURLOPT_POST, 1); $postbody = $postvars.urlencode('ctl00$navigationLogin$tbUsername')."=".urlencode($this->username)."&". urlencode('ctl00$navigationLogin$tbPassword')."=".urlencode($this->password)."&".urlencode('ctl00$navigationLogin$btnLogin')."=". urlencode("PRIJAVA"); curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody); $login_output = curl_exec($ch); $xmlDoc = new DOMDocument(); $xmlDoc->loadHTML( $login_output ); $searchNode = $xmlDoc->getElementsByTagName( "div" ); foreach( $searchNode as $sn ) { if($sn->getAttribute('id') == 'navigationLogin_divNapaka') { if (DOMinnerHTML($sn) == 'Napačno uporabniško ime in/ali geslo.') { return -3; } else if(DOMinnerHTML($sn) == 'To uporabniško ime je v že v uporabi na drugem računalniku. Odjavite se iz drugega računalnika ali počakajte, da vam poteče seja.') { return -5; // holy shit u fukkin kill.d her, TSMedia! } } } return $ch; } public function fetchregije() { $ch = $this->login(); if(!curl_getinfo($ch)) { if(!empty($ch)){return $ch;}else{return -2;} } curl_setopt($ch, CURLOPT_URL, $this->mainpage); curl_setopt($ch, CURLOPT_POST, 0); $request_output = curl_exec($ch); $xmlDoc = new DOMDocument(); $xmlDoc->loadHTML( $request_output ); $searchNode = $xmlDoc->getElementById( "search_ddlRegion" )->getElementsByTagName("option"); $regije=array(); foreach( $searchNode as $sn ) { if(!empty($sn->getAttribute("value"))) $regije[] = $sn->getAttribute("value"); } return $regije; } public function fetchkontakti($kajsplohiscemo = 0, $regija = "GORENJSKA") { // kajsplohiscemo-bool=[0-osebe]/1-podjetja regija-string=[GORENJSKA]/... $ch = $this->login(); if(!curl_getinfo($ch)) { if(!empty($ch)){return $ch;}else{return -2;} } if($kajsplohiscemo) { $barva = "yellow"; // wtf, Adacta return -4; } else {$barva = "white";} curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, $this->mainpage); $request_init_output = curl_exec($ch); $xmlDoc = new DOMDocument($request_init_output); $xmlDoc->loadHTML( $request_init_output ); $searchNode = $xmlDoc->getElementsByTagName("form")[0]->getElementsByTagName( "input" ); foreach( $searchNode as $sn ) { if($sn->getAttribute("name") != 'ctl00$search$hfSearchMode' && $sn->getAttribute("name") != 'ctl00$search$ddlRegion') { $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value')).'&'; } } curl_setopt($ch, CURLOPT_POST, 1); // curl_setopt($ch, CURLOPT_HEADER, array('array("Content-Type: multipart/form-data")')); curl_setopt($ch, CURLOPT_URL, $this->mainpageaction); $postbody=$postvars.urlencode('ctl00$search$hfSearchMode').'='.urlencode($barva).'&'.urlencode('ctl00$search$ddlRegion').'='. urlencode($regija).'&__EVENTTARGET=&__EVENTARGUMENT=&ctl00%24search%24hfSearchFormMode=2&ctl00%24search%24ddlAreaCode=&ctl00%24search%24ddlWorkingHoursDay=&ctl00%24search%24ddlWorkingHoursFrom=&ctl00%24search%24ddlWorkingHoursTo=&ctl00%24search%24ddlAdditionalOptions=&hiddenInputToUpdateATBuffer_CommonToolkitScripts=1'; // (-; if($kajsplohiscemo){ $postbody .= '&'.urlencode('ctl00$search$btnSearchAlt').'='.urlencode('NAJDI');} // THIS FINNALY WORKS BUT ONLY FOR else {$postbody .= '&'.urlencode('ctl00$search$btnSearch').'='.urlencode('IŠČI');} // LOGGED IN USERS! DON'T TOUCH curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody); // THE ANCIENT CODE! $request_output = curl_exec($ch); // https://www.reddit.com/r/ProgrammerHumor/comments/9xat04/the_ancient_code/ curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, $this->iskanjestran."064176345"); // just a big intager $request_after_output = curl_exec($ch); $xmlDoc = new DOMDocument($request_after_output); $xmlDoc->loadHTML($request_after_output); $zadnjastran = explode("-", $xmlDoc->getElementById("CPH_bodyMain_SearchResultsStatic1_ResultsPagerStatic1_aLastPage")->getAttribute("href"))[1]; $kontakti = array(); for($i = 1; $i <= $zadnjastran; $i++) { curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, $this->iskanjestran.$i); // just a bing intager $request_loop_output = curl_exec($ch); $xmlDoc = new DOMDocument($request_loop_output); $xmlDoc->loadHTML($request_loop_output); $searchNode = $xmlDoc->getElementById('CPH_bodyMain_SearchResultsStatic1_UpdatePanelSearchResults')->getElementsByTagName("a"); foreach($searchNode as $sn) { if(startsWith($sn->getAttribute("href"), "/oseba/")) $kontakti[] = preg_replace_callback('/[^\x20-\x7f]/', function($match) { return urlencode($match[0]); }, "https://www.itis.si".$sn->getAttribute("href")); // just don't change your domain } } return $kontakti; } public function fetchoseba($personlink) { // personlink, začenjši z https://www.itis.si/oseba/ $ch = $this->login(); if(!curl_getinfo($ch)) { if(!empty($ch)){return $ch;}else{return -2;} } curl_setopt($ch, CURLOPT_URL, $personlink); curl_setopt($ch, CURLOPT_POST, 0); $request_output = curl_exec($ch); if ($request_output == null) return -6; $xmlDoc = new DOMDocument($request_output); $xmlDoc->loadHTML($request_output); $oseba = array(); $oseba['name'] = DOMinnerHTML($xmlDoc->getElementsByTagName("h1")[0]); foreach ($xmlDoc->getElementsByTagName('a') as $ej) { if (endsWith($ej->getAttribute("id"), "hlMapAddress")) { $addresstext = $ej; } } $oseba['address'] = explode('
', str_replace("\n", null, str_replace("\r", null, str_replace(" ", null, DOMinnerHTML($addresstext))))); $oseba['nr'] = array(); foreach($xmlDoc->getElementsByTagName("div") as $sn) { if($sn->getAttribute("class") == "nr") $oseba['nr'][] = str_replace(" ", null, strip_tags_content(DOMinnerHTML($sn))); } $oseba['nr'] = array_unique($oseba['nr']); // $oseba['gps'] = get_string_between($ej->getAttribute("href"), 'javascript:openMap(',",'".$oseba['name']); $oseba['gps']['y'] = get_string_between($request_output, '&Y=', '&n='); $oseba['gps']['x'] = get_string_between($request_output, '/zemljevid/X=', '&Y='); return $oseba; } public function posljisms($telefonska = "064176345", $prefix = "(poslal itisclient) ", $telo = "itisclient") { // kajsplohiscemo-bool=[0-osebe]/1-podjetja regija-string=[GORENJSKA]/... $ch = $this->login(); if(!curl_getinfo($ch)) { if(!empty($ch)){return $ch;}else{return -2;} } curl_setopt($ch, CURLOPT_POST, 0); curl_setopt($ch, CURLOPT_URL, $this->mainpage); $request_init_output = curl_exec($ch); $xmlDoc = new DOMDocument($request_init_output); $xmlDoc->loadHTML( $request_init_output ); $searchNode = $xmlDoc->getElementsByTagName("form")[0]->getElementsByTagName( "input" ); foreach( $searchNode as $sn ) { if($sn->getAttribute("name") != 'ctl00$CPH_bodyMain$SendSMS$Sender1$btnSend' && $sn->getAttribute("name") != 'ctl00$CPH_bodyMain$SendSMS$Sender1$hfMessage' && $sn->getAttribute("name") != 'ctl00$CPH_bodyMain$SendSMS$Sender1$tbNumber' && $sn->getAttribute("name") != 'ctl00$CPH_bodyMain$SendSMS$Sender1$tbMessage' && $sn->getAttribute("name") != 'ctl00$search$btnSearchAlt' && $sn->getAttribute("name") != 'ctl00$search$btnSearch') { $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value')).'&'; } } curl_setopt($ch, CURLOPT_POST, 1); // curl_setopt($ch, CURLOPT_HEADER, array('array("Content-Type: multipart/form-data")')); curl_setopt($ch, CURLOPT_URL, $this->mainpageaction); $postbody='__EVENTARGUMENT=&__EVENTTARGET=&'.$postvars.urlencode('ctl00$CPH_bodyMain$SendSMS$Sender1$btnSend').'='.urlencode("Pošlji").'&'. urlencode('ctl00$CPH_bodyMain$SendSMS$Sender1$hfMessage').'='.urlencode($prefix).'&'. urlencode('ctl00$CPH_bodyMain$SendSMS$Sender1$tbNumber').'='.urlencode($telefonska).'&'. urlencode('ctl00$CPH_bodyMain$SendSMS$Sender1$tbMessage').'='.urlencode($telo). '&ctl00%24CPH_bodyMain%24SendSMS%24Sender1%24hfSponsorMessage=a&hiddenInputToUpdateATBuffer_CommonToolkitScripts=1'; // (-; curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody); // THE ANCIENT CODE! $request_output = curl_exec($ch); // https://www.reddit.com/r/ProgrammerHumor/comments/9xat04/the_ancient_code/ if(curl_getinfo(CURLINFO_RESPONSE_CODE) == 200) { return true; } else { return false; } } } ?>