<?php
/***************************************************************************
* InfoFrame (image generator for digital picture frames)
* Copyright (C) 2010
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://www.gnu.org/licenses/
***************************************************************************/
//version 0.4
//
//CHANGELOG:
// ## 0.4 ## 07.01.2014
// MTS Daten von clever-tanken.de werden nun wieder korrekt ausgelesen
// Das Auslesen ist nun schneller
class BenzinMTSPlugin implements IPlugin
{
private $dbconn = NULL;
private $config = NULL;
public function __construct($dbconn, $config) {
$this->dbconn = $dbconn;
$this->config = $config;
}
public function doUpdate() {
// Datenbankeinträge löschen
mysql_query("START TRANSACTION", $this->dbconn);
$query = "Delete from if_tanken_mts";
mysql_query($query, $this->dbconn) or die('Error, delete query failed');
// Preise und Tankstellen lesen - Meldestellenversion v0.1
$i=0;
$ortnumber = 0;
$spritsorte=$this->config['sorte'];
// jeden in config.ini eingetragenen Ort in file einlesen
while ($ort = $this->config['ort_'.++$ortnumber]) {
$uri = 'http://www.clever-tanken.de/tankstelle_liste?'.'ort='.$ort.'&spritsorte='.$spritsorte;
$uriElem = parse_url ( $uri );
$fp = @fsockopen ( $uriElem ['host'], 80, $errno, $errstr, 10 );
if (!$fp) {
//$title = "keine Tankstellen in $orte_fehlen gefunden";
//return;
}else{
$request = "GET " . $uriElem ['path'] . (isset ( $uriElem ['query'] ) ? "?" . $uriElem ['query'] : "") . " HTTP/1.1\r\n";
$request .= "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n";
$request .= "Host: " . $uriElem ['host'] . "\r\n";
$request .= "Connection: Close\r\n\r\n";
fwrite ( $fp, $request );
$response = "";
while ( ! feof ( $fp ) ) {
//$response .= fgets ( $fp, 128 );
$response .= fgets ( $fp, 512 );
}
fclose ( $fp );
// split headers from data
//$startindex = '<div id="mapcanvas" ng-show="visible" class="map_list row"></div>';
$startindex = '<div id="main-content" class="row tankstelle-liste">';
//$endindex = '<div class="row" id="zeug-das-niemand-liest"';
$endindex = '<div id="main-content-footer" class="col-xs-12 col-sm-12 col-md-12 col-lg-12 main-content-item">';
$responseSplit=utf8_decode($response);
$responseStart = explode ( $startindex, $responseSplit, 2 );
$responseEnd = explode ( $endindex, $responseStart[1], 2 );
//explode into single stations
//$tankstellenarray = explode ('<a href="/tankstelle_details/',$responseEnd[0]);
$tankstellenarray = explode ('<div class="price_entry_table">',$responseEnd[0]);
foreach ($tankstellenarray as $i => $tanke) {
$zeile[$i++]=strip_tags($tanke,'<div><sup>');
}
}
// Tankstelle extrahieren und Adresse formatieren
$doc = new DOMDocument();
for ($j=1;$j<$i;$j++) {
$str=$zeile[$j];
//echo $j;
$doc->loadHTML($str);
$xpath = new DomXpath($doc);
$div = $xpath->query('//*[@class="price"]')->item(0);
$preis=$div->nodeValue;
$div = $xpath->query('//*[@class="price_date"]')->item(0);
$alter=$div->nodeValue;
//$div = $xpath->query('//*[@class="location_name"]')->item(0);
$div = $xpath->query('//*[@class="row fuel-station-location-name"]')->item(0);
//$div = $xpath->query('//*[@class="location_street_number"]')->item(0);
$div = $xpath->query('//*[@id="fuel-station-location-street"]')->item(0);
//$div = $xpath->query('//*[@class="location_zip_code_city"]')->item(0);
$div = $xpath->query('//*[@id="fuel-station-location-city"]')->item(0);
//$div = $xpath->query('//*[@class="location_distance"]')->item(0);
$div = $xpath->query('//*[@class="fuel-station-location-address-distance"]')->item(0);
/*
echo "Preis: ".$preis."<br>";
echo "Alter: ".$alter."<br>";
echo "name: ".$name."<br>";
echo "strasse: ".$strasse."<br>";
echo "stadt: ".$stadt."<br>";
echo "entfernung: ".$entfernung."<br>";
*/
$ortok='';
//strikte Ortsnamensuche oder nicht
$ortscheck = preg_split('/\s+/', $stadt);
//echo $ortscheck[2];
if ($this->config['suchmodus']=='strikt'){
if (strtolower($ortscheck[2])==strtolower(trim(utf8_decode($ort)))){
$ortok=1; //echo "Gleich - ".$ortscheck[2]." ".utf8_decode($ort)."<br/>\n";
}else{
//echo "Unterschiedlich - ".$ortscheck[2]." ".utf8_decode($ort)."<br/>\n";
}
}else{
$ortok=1;
}
$pre2is='';
//Wenn Preis und Datum angegeben, Preis auslesen
if ($preis != " " && $preis != "" && $alter != "" && $ortok==1){
$preis=floatval($preis); //Preis festlegen
//echo $preis."<br/>\n";
//datum prüfen und in Unix-Zeitstempel konvertieren
if (stripos($alter,"vor")){
//Relative Zeit in der Form "gemeldet Heute vor xx Std. Min"
if (stripos($alter,"Std.")){
$faktor=3600; //60 Sekunden * 60 Minuten --> Stundenberechnung
}else if (stripos($alter,"Min.")){
$faktor=60; //60 Sekunden --> Minutenberechnung
}else if (stripos($alter,"Sek.")){
$faktor=1; //Wert ist bereits in Sekunden angegeben
}
$zeit=intval(preg_replace("/[^0-9]/","",$alter)); //nur die zeit übrig lassen
$datum=time()-$zeit*$faktor;
//echo "Relativzeit ".$datum."<br/>\n";
}else{
//Absolute Zeit wurde angegeben, kommt nicht mehr vor???
$d_arr = date_parse($alter);
$datum = mktime($d_arr['hour'],$d_arr['minute'],$d_arr['second'],$d_arr['month'],$d_arr['day'],$d_arr['year']);
//echo "Absolutzeit ".$datum."<br/>\n";
}
//echo date(DATE_ATOM, $datum)."<br/>\n";
// nur Preise mit aktuellem Datum berücksichtigen, siehe config.ini
$configalter = $this->config['max_age_in_hours'];
if ($datum>=strtotime("-$configalter hours") && $preis!='') { // Preis ist aktuell
// Datensatz für Datenbank anlegen, Adresse ohne PLZ
//preis, datum, station, strasse, ort, entfernung
$this->addStation($preis, $datum, $name, $strasse, $stadt, $entfernung);
}
}
// in Datenbank schreiben
mysql_query("COMMIT", $this->dbconn);
}
}
}
public function doOutput($image, $style, $updateData, &$yoffset) {
if ($updateData) $this->doUpdate();
$query = "SELECT * FROM `if_tanken_mts` ORDER BY `datum` DESC, `preis` ASC";
$result = mysql_query($query, $this->dbconn);
if (mysql_num_rows($result) == 0) return;
// define styles
$opt_header = array(
'width' => imagesx($image)-290,
'line_height' => 18,
'align' => ALIGN_LEFT
);
$opt_entry = array(
'width' => imagesx($image)-290,
'height' => 12,
'line_height' => 12,
'align' => ALIGN_LEFT,
'word_wrap_hyphen' => '...',
'aggressive_word_wrap' => false
);
switch ($this->config['sorte']){
case 1:
$sorte="Autogas";
break;
case 2:
$sorte="LKW-Diesel";
break;
case 3:
$sorte="Diesel";
break;
case 4:
$sorte="Bioethanol";
break;
case 5:
$sorte="Super E10";
break;
case 6:
$sorte="Super Plus";
break;
case 7:
$sorte="Super E5";
break;
case 8:
$sorte="Erdgas";
break;
case 9:
$sorte="Bio-Diesel";
break;
case 10:
$sorte="Pflanzenöl";
break;
case 11:
$sorte="Zweitakt";
break;
}
// print header
$iconpath = 'resources/benzin_icons/';
$text = 'Kraftstoffpreise ('.$sorte.')'; //.$this->config['sorte'].')';
imagettftextboxopt($image, 18, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_header);
$icon = ImageCreateFromPNG ( $iconpath.'benzin_tank.png' );
ImageCopy($image, $icon, 20, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
ImageDestroy($icon);
$yoffset += 20;
$counter=0;
while ($row = mysql_fetch_assoc($result)) {
$counter++;
$rest = (mysql_num_rows($result) - $counter) + 1;
$entrylimit = $this->config['max_displayed_stations'];
if ( (($entrylimit) && ($counter > $entrylimit)) || (($yoffset >= (imagesy($image) - 36)) && ($rest > 1)) ) {
// show only n mails. If more mails are available show hint "x more stations..."
$rest = (mysql_num_rows($result) - $counter) + 1;
if ($rest > 1)
$text = "... $rest weitere Tankstellen";
else
$text = "... $rest weitere Tankstelle";
//Text der weiteren Tankstellen auskommentiert
//imagettftextboxopt($image, 14, 0, 24, $yoffset, $style['textcolor'], $style['fontb'], $text, $opt_header);
//$yoffset += 18;
break;
}
//Anzeigetext
$text = "";
$euro = "\xE2\x82\xAc"; // Euro-Zeichen ist Multibyte char: \xE2\x82\xAc
$preis = $row['preis'];
$datum = strftime( "%d.%m. %H:%M", strtotime($row['datum']));
$station = $row['station'];
$ort = $row['ort'];
$strasse = $row['strasse'];
$oeffnungszeiten = $row['oeffnungszeiten'];
$text = $preis." ".$euro." - ".$datum." - ".$station." - ".$strasse." - ".$ort;
// print station and icon
if (stripos($station,'aral') !== false){ $png = 'benzin_aral.png'; // Aral-Tankstelle
}elseif (stripos($station,'agip') !== false){ $png = 'benzin_agip.png'; // Agip-Tankstelle
}elseif (stripos($station,'bft') !== false){ $png = 'benzin_bft.png'; // BFT-Tankstelle
}elseif (stripos($station,'esso') !== false){ $png = 'benzin_esso.png'; // Esso-Tankstelle
}elseif (stripos($station,'heinlein') !== false){ $png = 'benzin_h.png'; // Heinlein-Tankstelle
}elseif (stripos($station,'jet') !== false){ $png = 'benzin_jet.png'; // Jet-Tankstelle
}elseif (stripos($station,'omv') !== false){ $png = 'benzin_omv.png'; // OMV-Tankstelle
}elseif (stripos($station,'shell') !== false){ $png = 'benzin_shell.png'; // Shell-Tankstelle
}elseif (stripos($station,'star') !== false){ $png = 'benzin_star.png'; // Star-Tankstelle
}elseif (stripos($station,'westfalen') !== false){ $png = 'benzin_westfalen.png'; // Westfalen-Tankstelle
}elseif (file_exists($iconpath.'benzin_'.strtolower($station).'.png')){ $png = 'benzin_'.strtolower($station).'.png';
// Sucht 'blind' nach Stationsnamen als Icon in der Form benzin_"stationsname".png
}else{ $png = 'benzin_t.png'; } // generelles Bild
$wicon = ImageCreateFromPNG($iconpath.$png);
ImageCopy($image, $wicon, 25, $yoffset, 0, 0, imagesx($wicon), imagesy($wicon));
ImageDestroy($wicon);
imagettftextboxopt($image, 12, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
$yoffset += 14;
//werden keine oeffnungszeiten gewuenscht, bitte die folgenden drei zeilen auskommentieren
if ($this->config['oeffnungszeiten']==1){
$text=$oeffnungszeiten;
imagettftextboxopt($image, 12, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
$yoffset += 18;
}
}
$yoffset += 10;
mysql_free_result($result);
}
private function addStation($preis, $datum, $station, $strasse, $ort, $oeffnungszeiten) {
$query = "REPLACE INTO `if_tanken_mts` SET
`preis`= '".mysql_real_escape_string($preis)."',
`datum`= FROM_UNIXTIME($datum),
`station`= '".mysql_real_escape_string($station)."',
`strasse`= '".mysql_real_escape_string($strasse)."',
`ort`= '".mysql_real_escape_string($ort)."',
`oeffnungszeiten`= '".mysql_real_escape_string($oeffnungszeiten)."'";
mysql_query($query, $this->dbconn) or die('Error, insert query failed: '.mysql_error());
}
}