From b43d19de1e61ef3f295b706d9de70e62dadb90ea Mon Sep 17 00:00:00 2001 From: Fred Date: Wed, 22 Jan 2014 08:55:23 +0100 Subject: [PATCH] Create oebbApi_v0.2.php --- oebbApi_v0.2.php | 445 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 445 insertions(+) create mode 100644 oebbApi_v0.2.php diff --git a/oebbApi_v0.2.php b/oebbApi_v0.2.php new file mode 100644 index 0000000..c1b2618 --- /dev/null +++ b/oebbApi_v0.2.php @@ -0,0 +1,445 @@ +loadUrl($url); + + if (!$this->isValid($departure, $arrival)) { + return false; + } + + $i = 0; + + while ($amount > $this->i) { + $tempOkey = (pq('#trOverviewC0-' . $i)->getString()); + if (!empty($tempOkey)) { + $this->data[] = $this->getConnection($i); + $this->i++; + $i++; + } else { + $time = $this->getConnection($i - 1); + $time = strtotime($time["startTime"] . ' + 1 minute'); + $time = date("H:i", $time); + + $date = $this->getConnection($i - 1); + $date = $date["startDate"]; + $this->get($departure, $arrival, $amount, $date, $time); + } + } + $_SESSION["oebbApi"] = $this->data; + $_SESSION["oebbApi"]["get"] = true; + return $this->data; + } + + public function getCoords() { + if($_SESSION["oebbApi"]["getDetails"] == false) { + return false; + } + $details = $_SESSION["oebbApi"]["detail"]; + $returnArray = array(); + foreach ($details AS $detail) { + $url = $detail["data"]["productUrl"]; + + if ($url != null) { + $this->loadUrl($url); + $temp = (pq('.detailContainer')->HTML()); + + $temp = str_replace("zebracol-2", "zebracol", $temp); + $temp = str_replace("zebracol-1", "zebracol", $temp); + $temp = str_replace('title="Anfang Ihrer Verbindung -> Einstieg"', 'class="pqOkey"', $temp); + $temp = str_replace('title="Ende Ihrer Verbindung -> Ausstieg"', 'class="pqOkey"', $temp); + //$temp = $this->str_replace_once("center sepline", "ankunftPq", $temp); + + + $i = 0; + $j = 0; + $img = pq('.resultTable:ep(0) td')->html(); + $img = explode('", $stations); + $finalStations = ""; + foreach ($stations as $station) { + $tempStation = strip_tags($this->trim($station)); + $tempStation = preg_replace('/\([^)]*\)|[()]/', '', $tempStation); + $oneStation = json_decode(file_get_contents("http://www.oebb.at/__ressources/system/stationsHafas.jsp?q=" . urlencode($tempStation)), true); + + if (isset($oneStation[0]) && $oneStation[0] != null) { + if (strpos($img[$j], 'oc.gif') !== false) { + + $finalStations[] = array( + "name" => $oneStation[0]["value"], + "xcoord" => $oneStation[0]["xcoord"], + "ycoord" => $oneStation[0]["ycoord"], + "realName" => $tempStation, + ); + } + } + $j++; + } + if (pq('.zebracol:ep(' . $i + 1 . ')')->text() == "") { + break; + } + $i++; + } + $returnArray[] = $finalStations; + } + } + return $returnArray; + } + + public function validate($name) { + $temp = json_decode(file_get_contents("http://www.oebb.at/__ressources/system/stationsHafas.jsp?q=" . urlencode($name)), true); + $return = array(); + foreach($temp as $temp1) { + $return[] = array( + "value" => $temp1["value"], + "id" => $temp1["extId"], + ); + } + return $return; + } + + public function getDetails($index) { + if ($index > count($_SESSION["oebbApi"])) { + return false; + } + if($_SESSION["oebbApi"]["get"] == false) { + return false; + } + + $this->loadUrl($_SESSION["oebbApi"][$index]["changesLink"]); + + $temp = (pq('.detailContainer')->HTML()); + $temp = str_replace("conFirstSecFirstRow", "intermediateSection", $temp); + $temp = str_replace("conLastSecLastRow", "intermediateSection", $temp); + $temp = str_replace('title="Fahrtinformation"', 'id="connectionInfo"', $temp); + + phpQuery::newDocumentHTML($temp, $charset = 'utf-8'); + $changes = array(); + $i = 0; + $j = 0; + $fuss = 0; + $lastDate = ""; + while (1) { + $startDateTemp = + pq('.intermediateSection .date:eq(' . $i . ')')->text(); + $startDateTemp = $this->trim($startDateTemp); + if ($startDateTemp == "") { + $startDate = $lastDate; + } else { + $lastDate = $startDateTemp; + $startDate = $startDateTemp; + } + + $startStation = + pq('.intermediateSection .station:eq(' . $i . ')')->text(); + + $startTime = + pq('.intermediateSection .timeValue:eq(' . $i . ')')->text(); + + $startPlattform = + pq('.intermediateSection .platform:eq(' . $i . ')')->text(); + + $startPrognose = + pq('.intermediateSection .realTime:eq(' . $i . ')')->text(); + + $productName = + pq('.intermediateSection img.product:eq(' . $j . ')')->attr("alt"); + + $productImg = + "http://fahrplan.oebb.at" . + (pq('.intermediateSection img.product:eq(' . $j . ')')->attr("src")); + if ($productImg == "http://fahrplan.oebb.at/img/vs_oebb/fuss_pic.gif") { + $productUrl = null; + $fuss -= 1; + } else { + $productUrl = + (pq('#connectionInfo:eq(' . $fuss . ')')->attr("href")); + } + $i++; + + $endDateTemp = + pq('.intermediateSection .date:eq(' . $i . ')')->text(); + $endDateTemp = $this->trim($endDateTemp); + if ($endDateTemp == "") { + $endDate = $lastDate; + } else { + $lastDate = $endDateTemp; + $endDate = $endDateTemp; + } + + $endStation = + pq('.intermediateSection .station:eq(' . $i . ')')->text(); + + $endTime = + pq('.intermediateSection .timeValue:eq(' . $i . ')')->text(); + + $endPlattform = + pq('.intermediateSection .platform:eq(' . $i . ')')->text(); + + $endPrognose = + pq('.intermediateSection .realTime:eq(' . $i . ')')->text(); + + + $startStation = $this->trim($startStation); + $endStation = $this->trim($endStation); + + $startTime = substr($startTime, 3); + $endTime = substr($endTime, 3); + + $startTime = $this->trim($startTime); + $endTime = $this->trim($endTime); + + $startPrognose = $this->trim($startPrognose); + $endPrognose = $this->trim($endPrognose); + + $startPlattform = $this->trim($startPlattform); + $endPlattform = $this->trim($endPlattform); + + $startPlattform = $this->trim($startPlattform); + $endPlattform = $this->trim($endPlattform); + + $startPlattform = empty($startPlattform) ? "" : $startPlattform; + $endPlattform = empty($endPlattform) ? "" : $endPlattform; + + $sTime = strtotime($startTime . " " . $startDate); + $eTime = strtotime($endTime . " " . $endTime); + $dur = $eTime - $sTime; + $duration = date("H:m", $dur); + + if ($startStation != "") { + $changes[] = array( + "start" => array( + "station" => $startStation, + "time" => $startTime, + "plattform" => $startPlattform, + "date" => $startDate, + "prognose" => $startPrognose, + ), + "end" => array( + "station" => $endStation, + "time" => $endTime, + "plattform" => $endPlattform, + "date" => $endDate, + "prognose" => $endPrognose, + ), + "data" => array( + "productName" => $productName, + "productImg" => $productImg, + "productUrl" => $productUrl, + "duration" => $duration, + ), + ); + $i++; + $j++; + $fuss++; + } else { + break; + } + } + $_SESSION["oebbApi"]["detail"] = $changes; + $_SESSION["oebbApi"]["getDetails"] = true; + return $changes; + } + + /* The Crap begins here */ + + protected function getChangesLink($pos) { + $temp = (pq('#linkDtlC0-' . $pos)->attr("href")); + return $temp; + } + + protected function getChanges($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .changes')->text()); + return intval($temp); + } + + protected function getStartTime($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .planed')->html()); + $temp = explode("
", $temp); + return substr($temp[0], 1, 5); + } + + protected function getStartTimeEarly() { + $temp = (pq('#trOverviewC1-0 .planed')->html()); + $temp = explode("
", $temp); + return substr($temp[0], 1, 5); + } + + protected function getStartDateEarly() { + $temp = (pq('#trOverviewC1-0 .date')->html()); + $temp = explode("
", $temp); + return $temp[0]; + } + + protected function getEndTime($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .planed')->html()); + $temp = explode("
", $temp); + return substr($temp[1], 1, 5); + } + + protected function getDuration($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .duration')->text()); + return str_replace("\n", "", $temp); + } + + protected function getPrognose($pos) { + $temp = (pq('.prognosis:eq(' . $pos . ')')->html()); + return $this->trim($temp); + } + + protected function getStartStation($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .station div ')->getString()); + return $this->trim($temp[0]); + } + + protected function getEndStation($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .station div ')->getString()); + return $this->trim($temp[2]); + } + + protected function getBuyLink($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .fares a')->attr("href")); + return $temp; + } + + protected function getStartDate($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .date')->HTML()); + $temp = explode("
", $temp); + return $temp[0]; + } + + protected function getEndDate($pos) { + $temp = (pq('#trOverviewC0-' . $pos . ' .date')->HTML()); + $temp = explode("
", $temp); + + if ($temp[1] == "\n") { + return $temp[0]; + } else { + return $temp[1]; + } + } + + protected function loadUrl($url) { + + $file = file_get_contents($url); + phpQuery::newDocumentHTML($file); + } + + protected function getConnection($pos) { + $data = array( + "startStation" => $this->getStartStation($pos), + "endStation" => $this->getEndStation($pos), + "startDate" => $this->getStartDate($pos), + "endDate" => $this->getEndDate($pos), + "startTime" => $this->getStartTime($pos), + "endTime" => $this->getEndTime($pos), + "duration" => $this->getDuration($pos), + "changes" => $this->getChanges($pos), + "buyLink" => $this->getBuyLink($pos), + "changesLink" => $this->getChangesLink($pos), + "products" => $this->getProducts($pos), + "prognose" => $this->getPrognose($pos), + "id" => $this->i, + "earlier" => $this->getEarlierLink(), + + ); + return $data; + } + + protected function isValid($start, $end) { + $temp = (pq('#trOverviewC0-0')->getString()); + + if (empty($temp)) { + return false; + } else { + return true; + } + } + + protected function str_replace_once($str_pattern, $str_replacement, $string) { + if (strpos($string, $str_pattern) !== false) { + $occurrence = strpos($string, $str_pattern); + return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern)); + } + return $string; + } + + protected function stringInsert($str, $pos, $insertstr) { + if (!is_array($pos)) + $pos = array($pos); + + $offset = -1; + foreach ($pos as $p) { + $offset++; + $str = substr($str, 0, $p + $offset) . $insertstr . substr($str, $p + $offset); + } + return $str; + } + + protected function getProducts($pos) { + $products = ""; + $i = 0; + + while(1) { + $src = (pq('#trOverviewC0-' . $pos . ' .product:eq(' . $i . ')')->attr('src')); + $alt = (pq('#trOverviewC0-' . $pos . ' .product:eq(' . $i . ')')->attr('alt')); + if(empty($src)) { + break; + } else { + $products[] = array( + "name" => $alt, + "img" => "http://fahrplan.oebb.at" . $src, + ); + $i++; + } + + } + + return $products; + } + + protected function getEarlierLink(){ + $temp = (pq('.navi a:ep(0)')->attr("href")); + $this->loadUrl($temp); + $start = $this->getStartTimeEarly(); + return $start; + } + + protected function trim($string) { + return trim($string, "\xC2\xA0\n\t\r\0\x0B"); + } +}