summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorĆargova <cargova@a4l.space>2019-10-21 19:38:06 +0200
committerĆargova <cargova@a4l.space>2019-10-21 19:38:06 +0200
commita03d4cbfdc65565fb602dd3e13f252e333563b79 (patch)
treea30ad92a15fc7cf764260673738f3d7b75548da5
downloadgimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar.gz
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar.bz2
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar.lz
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar.xz
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.tar.zst
gimsisextclient-a03d4cbfdc65565fb602dd3e13f252e333563b79.zip
-rw-r--r--main.php687
-rwxr-xr-xtest.php8
2 files changed, 695 insertions, 0 deletions
diff --git a/main.php b/main.php
new file mode 100644
index 0000000..c8cc4d0
--- /dev/null
+++ b/main.php
@@ -0,0 +1,687 @@
+<?php
+function strip_tags_content($text, $tags = '', $invert = FALSE) {
+ preg_match_all('/<(.+?)[\s]*\/?[\s]*>/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.*?>.*?</\1>@si', '', $text);
+ }
+ else {
+ return preg_replace('@<('. implode('|', $tags) .')\b.*?>.*?</\1>@si', '', $text);
+ }
+ }
+ elseif($invert == FALSE) {
+ return preg_replace('@<(\w+)\b.*?>.*?</\1>@si', '', $text);
+ }
+ return $text;
+}
+function DOMinnerHTML(DOMNode $element) {
+ $innerHTML = "";
+ $children = $element->childNodes;
+ foreach ($children as $child) {
+ $innerHTML .= $element->ownerDocument->saveHTML($child);
+ }
+ return $innerHTML;
+}
+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 no login info
+ -2 not logged in
+ -3 bad username or password
+ -4 not written yet
+ -5 unable to create cookie dir
+*/
+ class gimsisextClient {
+ private $username;
+ private $password;
+ public $version = array(0, 5, 11);
+ private $programname = "gimsisextclient";
+ private $programdomain = 'gimsisextclient.gimb.tk';
+ private $cookiedir; // set at runtime, ker je get_curerent_user, v login()
+ private $gimsisextlogin = "https://zgimsis.gimb.org/gse/Logon.aspx";
+ private $gimsisexturnik = "https://zgimsis.gimb.org/gse/Page_Gim/Ucenec/DnevnikUcenec.aspx";
+ private $gimsisextocenjevanja = "https://zgimsis.gimb.org/gse/Page_Gim/Ucenec/IzpitiUcenec.aspx";
+ private $gimsisextocene = "https://zgimsis.gimb.org/gse/Page_Gim/Ucenec/OceneUcenec.aspx";
+ private $gimsisextprofesorji = "https://zgimsis.gimb.org/gse/Page_Gim/Ucenec/UciteljskiZbor.aspx";
+ private $gimsisextprofil = "https://zgimsis.gimb.org/gse/Page_Gim/Uporabnik/Profil.aspx";
+ private $gimsisextshraniprofil = "https://zgimsis.gimb.org/gse/WS_Gim/wsGimSisUtils.asmx/ShraniUporabnikPodatki";
+ private $gimsisextabout = "https://zgimsis.gimb.org/gse/About.aspx";
+ private $gimsisextdefault = "https://zgimsis.gimb.org/gse/Default.aspx";
+ private $gimsisextsporocila = "https://zgimsis.gimb.org/gse/Page_Gim/Uporabnik/Sporocila.aspx";
+ private $gimsisextposljisporocilo = "https://zgimsis.gimb.org/gse/Page_Gim/Uporabnik/modSporocilo.aspx?params=";
+ private $gimsisextsetgeslo = "https://zgimsis.gimb.org/gse/WS_Gim/wsGimSisUtils.asmx/ShraniUporabnikGeslo";
+ private $gimsisextizbrisisporocilo = "https://zgimsis.gimb.org/gse/Page_Gim/Uporabnik/Sporocila.aspx/DeleteMessage";
+ private $gimsisextizostanki = "https://zgimsis.gimb.org/gse/Page_Gim/Ucenec/IzostankiUcenec.aspx";
+ 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->gimsisextlogin);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $login_page = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $login_page );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('name') != "edtGSEUserPassword" && $sn->getAttribute('name') != "edtGSEUserId")
+ $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&";
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextlogin);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ $postbody = $postvars."edtGSEUserId=".$this->username."&edtGSEUserPassword=".$this->password;
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $login_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $login_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "span" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('id') == "lblMsg") {
+ if (DOMinnerHTML($sn) == "Napačno uporabniško ime ali geslo!") {
+ return -3;
+ }
+ if (startsWith(DOMinnerHTML($sn), "Uporabnik je začasno zaklenjen")) {
+ return array(-5, end(explode(" ", DOMinnerHTML($sn))));
+ }
+ }
+ }
+ return $ch;
+ }
+ public function fetchurnik($date = null) { // date ponedeljka v formatu 22.10.2019
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisexturnik);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $urnik_init_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $urnik_init_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('name') != 'ctl00$ContentPlaceHolder1$wkgDnevnik_edtGridSelectDate') {
+ $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&";
+ } else {
+ if(empty($date)) {
+ $date = $sn->getAttribute('value');
+ }
+ }
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisexturnik);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ $postbody = $postvars . urlencode('ctl00$ContentPlaceHolder1$wkgDnevnik_edtGridSelectDate') . '=' . $date;
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $urnik_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $urnik_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "span" );
+ foreach( $searchNode as $sn ) {
+ if(startsWith($sn->getAttribute("id"), "ctl00_ContentPlaceHolder1_wkgDnevnik_btnCell_")) {
+ $krneki = explode("_", $sn->getAttribute("id"));
+ $ura = $krneki[4];
+ $dan = $krneki[5];
+ $desc = str_replace("\r", null, $sn->getAttribute("title"));
+ $desc = explode("\n", $desc);
+ $predmet = get_string_between($desc[1], "(", ")"); // 0 je prazen string!!1
+ $kratica = explode(" (", $desc[1])[0];
+ $razred = $desc[2];
+ $profa = $desc[3];
+ $mesto = $desc[4];
+ $urnik[$dan][$ura] = array(
+ "predmet" => $predmet,
+ "kratica" => $kratica,
+ "razred" => $razred,
+ "profesor" => $profa,
+ "ucilinca" => $mesto
+ );
+ }
+ }
+ return $urnik;
+ }
+ public function fetchocenjevanja() {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextocenjevanja);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $ocenjevanja_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $ocenjevanja_output );
+ $tabelaNode = $xmlDoc->getElementsByTagName( "table" );
+ $tbodyNode = $tabelaNode[0]->getElementsByTagName( "tbody" );
+ $rowNodes = $tbodyNode[0]->getElementsByTagName("tr");
+ $ocenjevanja = array();
+ foreach ($rowNodes as $rn) {
+ $tdnode = $rn->getElementsByTagName("td");
+ $datum = DOMinnerHTML($tdnode[0]);
+ $tdspannode = $tdnode[1]->getElementsByTagName("span");
+ if ($tdspannode != null) $kratica = DOMinnerHTML($tdspannode[0]);
+ $predmet = explode(" (", strip_tags_content(DOMinnerHTML($tdnode[1])))[0];
+ $opis = get_string_between(strip_tags_content(DOMinnerHTML($tdnode[1])), "(", ")");
+ $ocenjevanja[] = array(
+ "datum" => str_replace("\n", null, str_replace("\r", null, str_replace(" ", null, $datum))),
+ "kratica" => str_replace("\n", null, str_replace("\r", null, str_replace(" ", null, $kratica))),
+ "predmet" => substr(str_replace("\n", null, str_replace("\r", null, str_replace(" ", null, $predmet))), 0, -2),
+ "opis" => str_replace("\n", null, str_replace("\r", null, str_replace(" ", null, $opis)))
+ );
+ }
+ return $ocenjevanja;
+ }
+ public function fetchprofesorji() {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextprofesorji);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $profesorji_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $profesorji_output );
+ $tabelaNode = $xmlDoc->getElementsByTagName( "table" );
+ $tbodyNode = $tabelaNode[0]->getElementsByTagName( "tbody" );
+ $rowNodes = $tbodyNode[0]->getElementsByTagName("tr");
+ $profesorji = array();
+ foreach ($rowNodes as $rn) {
+ $tdnode = $rn->getElementsByTagName("td");
+ $ime = strip_tags(DOMinnerHTML($tdnode[0]));
+ $predmetistrings = explode("<br />", DOMinnerHTML($tdnode[2]));
+ $predmeti = array();
+ foreach ($predmetistrings as $predmet) {
+ $predmetime = strip_tags(get_string_between(strip_tags($predmet), "(", ")"));
+ $predmetkratica = strip_tags(explode(" (", strip_tags($predmet))[0]);
+ if(empty($predmetime)) { $predmetime = $predmetkratica; $predmetkratica = null; }
+ if(empty($predmetkratica)) $predmetkratica = substr($predmetime, 0, 3);
+ $predmeti[] = array( "ime" => $predmetime, "kratica" => $predmetkratica);
+ }
+ $govorilneurestring = DOMinnerHTML($tdnode[3]);
+ $dan = explode(", ", $govorilneurestring)[0];
+ if($dan == "ponedeljek") {
+ $govorilneuredan = 0;
+ } elseif ($dan == "torek") {
+ $govorilneuredan = 1;
+ } elseif ($dan == "sreda") {
+ $govorilneuredan = 2;
+ } elseif (endsWith($dan, "etrtek")) { // because č can be tricky
+ $govorilneuredan = 3;
+ } elseif ($dan == "petek") {
+ $govorilneuredan = 4;
+ }
+ $solskaura = intval(get_string_between($govorilneurestring, ", ", ". ura"));
+ $uraod = explode(" - ", get_string_between($govorilneurestring, "(", ")"))[0];
+ $urado = explode(" - ", get_string_between($govorilneurestring, "(", ")"))[0];
+ $profesorji[] = array(
+ "ime" => $ime,
+ "predmeti" => $predmeti,
+ "govorilneure" => array("dan" => $govorilneuredan, "solskaura" => $solskaura, "uraod" => $uraod, "urado" => $urado)
+ );
+ }
+ return $profesorji;
+ }
+ public function fetchprofil() {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextprofil);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $profil_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $profil_output );
+ $spanNodes = $xmlDoc->getElementsByTagName( "span" );
+ $inputNodes = $xmlDoc->getElementsByTagName( "input" );
+ foreach ($spanNodes as $sn) {
+ switch($sn->getAttribute("id")) {
+ case "ctl00_ContentPlaceHolder1_lblVrstaUporabnik":
+ $vrsta = DOMinnerHTML($sn);
+ break;
+ case "ctl00_ContentPlaceHolder1_lblIme":
+ $ime = DOMinnerHTML($sn);
+ break;
+ case "ctl00_ContentPlaceHolder1_lblPriimek":
+ $priimek = DOMinnerHTML($sn);
+ break;
+ case "ctl00_ContentPlaceHolder1_lblSpol":
+ $spol = DOMinnerHTML($sn);
+ break;
+ case "ctl00_ContentPlaceHolder1_lblEPosta":
+ $eposta = DOMinnerHTML($sn);
+ break;
+ case "ctl00_ContentPlaceHolder1_lblTelefon":
+ $telefon = DOMinnerHTML($sn);
+ break;
+ }
+ }
+ foreach ($inputNodes as $in) {
+ switch($in->getAttribute("id")) {
+ case "ctl00_ContentPlaceHolder1_chbEPosta":
+ $checked = $in->getAttribute("checked");
+ break;
+ }
+ }
+ $obvestila = 0;
+ if($checked == "checked") $obvestila = 1;
+ return array("ime" => $ime, "priimek" => $priimek, "spol" => $spol, "vrsta" => $vrsta, "eposta" => $eposta, "obvestila" => $obvestila, "telefon" => $telefon);
+ }
+ public function setprofil($ime, $priimek, $spol, $eposta, $obvestila, $telefon) { // spol: "M"/"Ž" obvestila:"true"/"false" telefon: +tccpndddddd (npr. +38664176345)
+ // PATCH! od verzije 1.0.7226.34224 dalje je blokirano spreminjanje osebnih podatkov dijakom
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ $podatki = 'IdUporabnik='.$this->username.'|edtIme='.$ime.'|edtPriimek='.$priimek.'|edtSpol='.$spol.'|edtEPosta='.$eposta.'|edtIndObvEPosta='.$obvestila.'|edtTelefon='.$telefon.'|edtIndObvSMS=undefined|';
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextshraniprofil);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Content-Type: application/json',
+ 'X-Requested-With: XMLHttpRequest',
+ 'Referer: https://zgimsis.gimb.org/gse/Page_Gim/Uporabnik/modVnosPodatki.aspx?params='.base64_encode("Id=".$this->username."|Type=")
+ ));
+ $postbody = '{ "aPodatki": "'.base64_encode($podatki).'" }';
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $setprofil_output = curl_exec($ch);
+ if(json_decode($setprofil_output)['d']['success'] == true) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function fetchabout() {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextabout);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $profil_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $profil_output );
+ $spanNodes = $xmlDoc->getElementsByTagName( "span" );
+ foreach ($spanNodes as $sn) {
+ switch($sn->getAttribute("id")) {
+ case "ctl00_ContentPlaceHolder1_lblCopyright":
+ $copyright = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ case "ctl00_ContentPlaceHolder1_lblTitle":
+ $ime = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ case "ctl00_ContentPlaceHolder1_lblDescription":
+ $opis = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ case "ctl00_ContentPlaceHolder1_lblVersion":
+ $ver = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ case "ctl00_ContentPlaceHolder1_lblCompany":
+ $podjetje = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ case "ctl00_ContentPlaceHolder1_lblConfiguration":
+ $konfiguracija = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ }
+ }
+ return array("ime" => $ime, "opis" => $opis, "ver" => $ver, "copyright" => $copyright, "podjetje" => $podjetje, "konfiguracija" => $konfiguracija);
+ }
+ public function fetchneprebrana() {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextdefault);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $prebrana_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $prebrana_output );
+ $spanNodes = $xmlDoc->getElementsByTagName( "span" );
+ foreach ($spanNodes as $sn) {
+ switch($sn->getAttribute("class")) {
+ case "titleRed":
+ $unread = html_entity_decode(DOMinnerHTML($sn));
+ break;
+ }
+ }
+ return intval($unread);
+
+ }
+ public function fetchsporocilaseznam($katera = 0) { // katera sporočila? 0=prejeta 1=poslana 2=izbrisana
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextsporocila);
+ switch($katera) {
+ case 0:
+ $kategorija = "msgReceived";
+ $slokat = "prejeta";
+ break;
+ case 1:
+ $kategorija = "msgSent";
+ $slokat = "poslana";
+ break;
+ case 2:
+ $kategorija = "msgDeleted";
+ $slokat = "izbrisana";
+ break;
+ }
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $sporocilaseznam_init_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument($sporocilaseznam_init_output);
+ $xmlDoc->loadHTML( $sporocilaseznam_init_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('name') != 'ctl00$ContentPlaceHolder1$ddlPrikaz' && $sn->getAttribute('name') != '__EVENTARGUMENT') {
+ $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&";
+ }
+ }
+ curl_setopt($ch, CURLOPT_POST, 1);
+ $msgkat = array();
+ $zadnjastran = 1;
+ for ($stran = 1; $stran <= $zadnjastran; $stran++) {
+ $postbody = $postvars . urlencode('ctl00$ContentPlaceHolder1$ddlPrikaz') . '=' . $kategorija . '&' . '__EVENTARGUMENT=Page%24' . $stran . '&' .
+ '__EVENTTARGET=ctl00%24ContentPlaceHolder1%24gvwSporocila';
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $sporocilaseznam_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $sporocilaseznam_output );
+ if ($stran == 1) {
+ foreach ($xmlDoc->getElementsByTagName("tr") as $rn) {
+ if ($rn->getAttribute("class") == "pager") {
+ ;
+ $zadnjastran = sizeof($rn->getElementsByTagName("td")[0]->getElementsByTagName("table")[0]->getElementsByTagName("tr")[0]->getElementsByTagName("td"));
+ }
+ }
+ if ($zadnjastran < 1) {
+ $zadnjastran = 1;
+ }
+ }
+ $tabelaNode = $xmlDoc->getElementsByTagName( "table" );
+ foreach($tabelaNode as $tn) {
+ if ($tn->getAttribute("id") == "ctl00_ContentPlaceHolder1_gvwSporocila") {
+ $msg = array();
+ foreach ($tn->getElementsByTagName("tbody")[0]->getElementsByTagName("td") as $dn) {
+ foreach($dn->getElementsByTagName('span') as $sn) {
+ $kles = $sn->getAttribute("class");
+ if ( $kles == "msgSubDate") {
+ $datum = null;
+ $dan = null;
+ $mesec = null;
+ $leto = null;
+ $datetime = DOMinnerHTML($sn);
+ $datum = explode(" ", $datetime)[0];
+ $ura = explode(" ", $datetime)[1];
+ if (empty($ura)) {
+ $ura = $datum;
+ $datum = date("d.m.Y");
+ }
+ $dan = intval(explode(".", $datum)[0]);
+ $mesec = intval(explode(".", $datum)[1]);
+ $leto = intval(explode(".", $datum)[2]);
+ if (empty($leto)) {
+ $leto = intval(date("Y"));
+ }
+ $msg['datum'] = array( "dan" => $dan, "mesec" => $mesec, "leto" => $leto );
+ $msg['cas'] = array("ura" => intval(explode(":", $ura)[0]), "minuta" => intval(explode(":", $ura)[1]));
+ } elseif ( $kles == "msgDir") {
+ $msg['posiljatelj'] = DOMinnerHTML($sn);
+ } elseif (startsWith($kles, "msgSubject")) {
+ $msg['zadeva'] = DOMinnerHTML($sn);
+ }
+ }
+ $msg['id'] = $dn->getElementsByTagName("input")[0]->getAttribute("value");
+ $msgkat[] = $msg;
+ }
+ }
+ }
+ // file_put_contents("/tmp/m".$stran.".json", json_encode($msgkat)); // debug
+ // file_put_contents("/tmp/krneki".$stran.".txt", $postbody); // debug
+ // file_put_contents("/tmp/o".$stran.".txt", $sporocilaseznam_output); // debug
+ }
+ return $msgkat;
+ }
+ public function fetchsporocilo($id) { // id formata ddddd|ddddd|d
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextsporocila);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $sporocilo_init_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument($sporocilo_init_output);
+ $xmlDoc->loadHTML( $sporocilo_init_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('name') != 'ctl00$ContentPlaceHolder1$hfIdSporocilo') {
+ $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&";
+ }
+ }
+ curl_setopt($ch, CURLOPT_POST, 1);
+ $postbody = $postvars . urlencode('ctl00$ContentPlaceHolder1$hfIdSporocilo') . '=' . urlencode($id);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $sporocilo_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $sporocilo_output );
+ $tabelaNode = $xmlDoc->getElementsByTagName( "table" );
+ foreach($tabelaNode as $tn) {
+ if ($tn->getAttribute("id") == "ctl00_ContentPlaceHolder1_gvwSporociloVrsta") {
+ $msg = array();
+ foreach ($tn->getElementsByTagName("tbody")[0]->getElementsByTagName("td") as $dn) {
+ foreach($dn->getElementsByTagName('span') as $sn) {
+ switch($sn->getAttribute("class")) {
+ case "msgSubjectS":
+ $msg['zadeva'] = DOMinnerHTML($sn);
+ break;
+ }
+ }
+ $msg['id'] = $id;
+ foreach($dn->getElementsByTagName('div') as $divn) {
+ if ($divn->getAttribute("class") == "msgInfo") {
+ $msg['posiljatelj'] = explode(" (", DOMinnerHTML($divn->getElementsByTagName('span')[0]))[0];
+ $msg['datum'] = explode(" ", get_string_between(DOMinnerHTML($divn->getElementsByTagName('span')[0]), "(", ")"))[0];
+ $msg['ura'] = explode(" ", get_string_between(DOMinnerHTML($divn->getElementsByTagName('span')[0]), "(", ")"))[1];
+ $msg['prejemnik'] = DOMinnerHTML($divn->getElementsByTagName('span')[1]);
+ } elseif ($divn->getAttribute("class") == "gCursorAuto") {
+ $msg['telo'] = explode("<hr>", DOMinnerHTML($divn))[0];
+ }
+ }
+ }
+ }
+ }
+ return $msg;
+ }
+ public function posljisporocilo($prejemnikst, $zadeva, $telo) { // prejemnikst je zajeban dobit (za zdej)
+ $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->gimsisextposljisporocilo);
+ $posljisporocilo_init_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument($posljisporocilo_init_output);
+ $xmlDoc->loadHTML( $posljisporocilo_init_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute("name") != 'ctl00$ModalMasterBody$edtPrejemniki' && $sn->getAttribute("name") != 'ctl00$ModalMasterBody$edtZadeva' && $sn->getAttribute("name") != 'ctl00$ModalMasterBody$edtBesediloExt' && $sn->getAttribute("name") != 'ctl00$ModalMasterBody$hfPrejemniki') {
+ $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->gimsisextposljisporocilo);
+ $postbody=$postvars.'&'.urlencode('ctl00$ModalMasterBody$edtZadeva').'='.urlencode($zadeva).'&'.urlencode('ctl00$ModalMasterBody$edtBesediloExt').'='.urlencode($telo).'&__EVENTTARGET=ctl00%24ModalMasterBody%24btnDogodekShrani&__EVENTARGUMENT=&'.urlencode('ctl00$ModalMasterBody$hfPrejemniki').'='.urlencode($prejemnikst);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $posljisporocilo_output = curl_exec($ch);
+ // file_put_contents("/tmp/psio.html", $posljisporocilo_init_output); // debug
+ // file_put_contents("/tmp/pso.html", $posljisporocilo_output); // debug
+ // file_put_contents("/tmp/pb.html", $postbody); // debug
+ // file_put_contents("/tmp/p.html", $prejemnikst); // debug
+ return;
+ }
+ public function setgeslo($geslo, $spremenigeslovobjektu = true) { // geslo
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ $podatki = 'IdUporabnik='.$this->username.'|edtStaroGeslo='.$this->password.'|edtGeslo='.$geslo.'|edtGeslo2='.$geslo.'|';
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextsetgeslo);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Content-Type: application/json',
+ 'X-Requested-With: XMLHttpRequest',
+ 'Referer: '.$this->gimsisextsetgeslo.'?params='.base64_encode("Id=".$this->username."|Type=")));
+ $postbody = '{ "aPodatki": "'.base64_encode($podatki).'" }';
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $setgeslo_output = curl_exec($ch);
+ if(json_decode($setgeslo_output, true)['d']['success'] == true) {
+ if($spremenigeslovobjektu) {
+ $this->password = $geslo;
+ }
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function izbrisisporocilo($id) {
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextizbrisisporocilo);
+ curl_setopt($ch, CURLOPT_POST, 1);
+ curl_setopt($ch, CURLOPT_HTTPHEADER, array(
+ 'Content-Type: application/json',
+ 'X-Requested-With: XMLHttpRequest',
+ 'Referer: '.$this->gimsisextsporocila));
+ $postbody = '{"aIdSporocilo":'.explode("|", $id)[0].',"aIdZapis":'.explode("|", $id)[1].'}';
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $izbrisisporocilo_output = curl_exec($ch);
+ if(json_decode($izbrisisporocilo_output, true)['d'] == true) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+ public function fetchizostanki($datzacetka = "01.01.0001", $datkonca = "31.12.9999") { // ali pa arraya(dan, mesec, leto)
+ $ch = $this->login();
+ if(!curl_getinfo($ch)) {
+ if(!empty($ch)){return $ch;}else{return -2;}
+ }
+ $datkategorije = array("datzacetka", "datkonca");
+ foreach($datkategorije as $datkat) {
+ if ( is_array($$datkat) ) {
+ $$datkat = implode(".", $$datkat);
+ }
+ }
+ curl_setopt($ch, CURLOPT_URL, $this->gimsisextizostanki);
+ curl_setopt($ch, CURLOPT_POST, 0);
+ $izostanki_init_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $izostanki_init_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "input" );
+ foreach( $searchNode as $sn ) {
+ if($sn->getAttribute('name') != 'ctl00$ContentPlaceHolder1$edtDatZacetka' && $sn->getAttribute('name') != 'ctl00$ContentPlaceHolder1$edtDatKonca') {
+ $postvars .= urlencode($sn->getAttribute('name'))."=".urlencode($sn->getAttribute('value'))."&";
+ } else {
+ if(empty($date)) {
+ $date = $sn->getAttribute('value');
+ }
+ }
+ }
+ curl_setopt($ch, CURLOPT_POST, 1);
+ $postbody = $postvars . urlencode('ctl00$ContentPlaceHolder1$edtDatZacetka') . '=' . urlencode($datzacetka) . '&' . urlencode('ctl00$ContentPlaceHolder1$edtDatKonca') . '=' . urlencode($datkonca);
+ curl_setopt($ch, CURLOPT_POSTFIELDS, $postbody);
+ $izostanki_output = curl_exec($ch);
+ $xmlDoc = new DOMDocument();
+ $xmlDoc->loadHTML( $izostanki_output );
+ $searchNode = $xmlDoc->getElementsByTagName( "table" );
+ foreach( $searchNode as $sn ) {
+ if(startsWith($sn->getAttribute("id"), "ctl00_ContentPlaceHolder1_gvwIzostankiGroup")) {
+ $izostanki = array();
+ foreach($sn->getElementsByTagName('tbody')[0]->getElementsByTagName('tr') as $rn) {
+ $datum = DOMinnerHTML($rn->getElementsByTagName('td')[0]);
+ $dat['dan'] = intval(explode(".", $datum)[0]);
+ $dat['mesec'] = intval(explode(".", $datum)[1]);
+ $dat['leto'] = intval(explode(".", $datum)[2]);
+ $predmeti = DOMinnerHTML($rn->getElementsByTagName('td')[2]);
+ $predmet = explode(", ", $predmeti);
+ $predm = array();
+ foreach($predmet as $pr) {
+ $ime = explode(" (", $pr)[0];
+ switch(get_string_between($pr, '(<span class="opr', '">')) {
+ case "0":
+ $opravicenoopis = "ni obdelano";
+ break;
+ case "1":
+ $opravicenoopis = "opravičeno";
+ break;
+ case "2":
+ $opravicenoopis = "neopravičeno";
+ break;
+ case "3":
+ $opravicenoopis = "ne šteje";
+ break;
+
+ }
+ $opravicenostatus = intval(get_string_between($pr, '(<span class="opr', '">'));
+ $ura = intval(get_string_between($pr, '">', '</span>'));
+ $predm[] = array("ime" => $ime, "opraviceno" => array( "status" => $opravicenostatus, "opis" => $opravicenoopis), "ura" => $ura);
+ }
+ $stevilo = intval(DOMinnerHTML($rn->getElementsByTagName('td')[1]));
+ $izostanki[] = array("datum" => $dat, "stevilo" => $stevilo, "predmeti" => $predm);
+ }
+ }
+ }
+ return $izostanki;
+ }
+ }
+?> \ No newline at end of file
diff --git a/test.php b/test.php
new file mode 100755
index 0000000..6c75526
--- /dev/null
+++ b/test.php
@@ -0,0 +1,8 @@
+#!/usr/bin/env php
+<?php
+ require "main.php";
+ $g = new gimsisextClient();
+ $g->setusername("anton.sijanec");
+ $g->setpassword("A4l200stirig");
+ var_dump($g->fetchurnik());
+?>