InfoFrame: Digitaler Bilderrahmen (Anzeige von Anrufen, E-Mails, Termine, Wetter...)

@h-p-d

kannst du mir bitte dein Benzin Plug zur Verfügung stellen? Das wäre prima..
 
hast du auch schon einen eigenen Foto-Feed realisiert mit dem Infoframe-Bild? Wäre vielleicht ne interessante Sache.
Konnte jemand herausfinden (evtl. auch mit YDean's Methoden aus http://www.ip-phone-forum.de/showthread.php?t=243544), unter welcher URL Bilder im Flash-Speicher (d.h. DSK2: a/k/a "[Photos \ ]Frame Memory") des ursprünglichen Rahmens Samsung SPF-83V eingebunden werden können, per http://192.168.x.y:5050/configuration/web_photos.htm bzw. per WiFi geladener HTML- oder RSS-Datei (um sie mit externen Quellen a/k/a "Web Photos \ RSS and Web Feeds" gemäß http://www.ip-phone-forum.de/showthread.php?t=206194&page=105&p=1985787#post1985787 zu mischen) ?

Außerdem: Welche weiteren Inhalte außer obigem Menü und dem stets auf JPEG 800*600 konvertierten http://192.168.x.y:5050/images/nowplaying.jpg kann der integrierte Webserver des Rahmens ausliefern (bzw. wie adressiert man z.B. darauf abgelegte Bilder im http-Request) ?

P.S.: Der eingestellte Zeitserver scheint inzwischen mal keine, mal unsinnige Antworten zu liefern: 2038, 2085 usw. - weiß jemand, wie man ihn ändert?
 
Zuletzt bearbeitet:
Hallo Zusammen,

auch wenn ich ungerne einen Thread wieder öffne, der schon ein halbes Jahr Tod ist, das Projekt interessiert mich schon, die Umsetzung scheint ja zu funktionieren.

Ich prüfe, bevor ich anfange, erst mal ob ich alle Voraussetzungen besitze, um das Projekt laufen lassen zu können.

Ich hab ein Nas, auf dem die Website ohne weiteres laufen könnte, problematisch wird es bei dem Bilderrahmen.....

Da ja aktuell die Zeit der digitalen Bilderrahmen ehr zur neige geht, frage ich mich natürlich, welchen Bilderrahmen kann ich da denn für benutzen, bzw. kennt wer einen Bilderrahmen, den man aktuell noch kaufen kann, der mit dem Projekt funktioniert ?

Ich hoffe einige verfolgen das Projekt noch.

Danke

Nex
 
Hallo Nex,

ganz im Gegenteil, scheinbar kommt die Zeit der digitalen Bilderrahmen mit WLAN wieder, ich habe diverse Modelle bei Conrad, Amazon, Pearl, etc. gesehen. Ob die dann tatsächlich auch für das Imfoframe-Projekt geeignet sind kann ich natürlich nicht beurteilen. Ansonsten schau doch mal in http://www.ip-phone-forum.de/showthread.php?t=207272 Hier werden auch andere Methoden diskutiert.

Gruß, Michael...
 
hallo zusammen
Ich versuche das Projekt auf einen Tablet zum laufen zu bringen mit einer html Datei
Code:
<html>
    <head>
    
        <meta content="text/html; charset=ISO-8859-1" http-equiv="content-type">
        <meta http-equiv="refresh"  content="5">       
            <title>InfoFrame</title>
    </head>
    <body style="background-color:#333333">
        <img src="info.jpg">
    </body>
</html>
Klappt aber irgendwie nicht. Ich habe diesen Code in eine html Datei gepackt und sie als index.html in das Infoframe Verzeichnis gespeichert.
Rufe ich nun diese index.html auf sehe ich nur oben links ein kleines leeres Bild. Was habe ich falsch gemacht.??

Volker
 
mal was ganz anderes.

bei mir Zuhause läuft es immer noch auf meinem Qnap TS-221. kann ich jetzt zusätzlich noch Owncloud installieren?

Weil mein Webserver läuft ja schon für den Infoframe.
 
Hallo Volker,

hier war es so lange ruhig :)
Code:
 <img src="info.jpg">

Nimm mal den korrekten Pfad cache/info.jpg, dann klappts.
 
Mit dem so "lange ruhig" oder dem Pfad ?
 
dem pfad, übrigens bin ich der Ralf ;)
 
Meine Message ging aber an Volker... und der ist nicht Ralf... zumindest hat er seine Anfrage mit Volker unterschrieben... aber vielleicht hat er sich ja auch geirrt...;)

Wie dem aus sei, wenn er in seiner HTML Datei ein Bild einbinden will, muss er den korrekten Pfad angeben, sonst findet der HTTP-Server das nicht.
 
wo finde ich die datenbank?
habe ein neuen Qnap und auch alles soweit installiert, aber er generiert kein bild. über phpmyadmin wird mir ne fehlermeldung angezeigt
 

Anhänge

  • php.PNG
    php.PNG
    5.5 KB · Aufrufe: 27
Hallo,

nutzt noch jemand das BenzinPlugin für den Infoframe?

Wenn ja, muss dieses für CleverTanken nun auf https umgestellt werden.
Bei meiner Variante des Benzin-Plugins müssen dazu folgende Zeilen ausgetauscht werden:

header("Content-type: text/html");
$sock = fsockopen("www.clever-tanken.de", 80, $errno, $errstr, 10);
if (!$sock) {
return; //$title = "keine Tankstellen in $orte_fehlen gefunden";
} else {
fputs($sock, "GET ".$uri." HTTP/1.1\r\n");
fputs($sock, "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.2.1) Gecko/20021204\r\n");
//------
fputs($sock, "Host: www.clever-tanken.de\r\n");
fputs($sock, "Connection: close\r\n\r\n");
while(!feof($sock)) {
$zeile[$i++] = utf8_encode(trim(fgets($sock,512)));
}
fclose($sock);
}


ersetzen durch:

$data = file_get_contents('https://www.clever-tanken.de'.$uri);
$data = str_replace("\r\n", "\n", $data);
$zeile = explode("\n", $data);
$i = count($zeile);


Evtl. kann das ja jemand gebrauchen.

Tschau
Uwe
 
  • Like
Reaktionen: Ralf0815
Hallo Uwe,

vielen Dank für Deine Info.

Ich führe das Ganze leider hinter einem Proxy aus, daher fehlt mir da noch irgend etwas.
Kannt du mal da drüber gucken.

Code:
  // 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 = "/tankstelle_liste?spritsorte=" . $this->config['sorte'] . "&r=" . $this->config['radius'] . "&ort=" . $this->config['ort'];
                $uri  = 'https://www.clever-tanken.de/tankstelle_liste?'.'ort='.$ort.'&spritsorte='.$spritsorte;
                $uriElem = parse_url ( $uri );
                $fp = fsockopen ("Proxy-IP", 8080, $errno, $errstr, 10);
                //$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";
                    fputs ($request = "GET " . $uri . " HTTP/1.1\r\n");
                    fputs ($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";
                    fputs ($request .= "Host: www.clever-tanken.de\r\n");
                    fputs ($request .= "Connection: Close\r\n\r\n");
                    fwrite ( $fp, $request );
                    $response = "";
                    while ( ! feof ( $fp ) ) {
                        //$response .= fgets ( $fp, 128 );
                        $response .= fgets ( $fp, 512 );
                    }
                    fclose ( $fp );


Danke
Gruß
Peter
 
Zuletzt bearbeitet:
Hallo Peter,

wenn der Proxy ohne Authentifizierung arbeitet, gib einmal folgendes ein (PROXY-IP muss noch angepast werden!):

$opt = array(
'http' => array(
'proxy' => 'tcp://PROXY-IP:8080',
'request_fulluri' => true,
),
);
$context = stream_context_create($opt);
$data = file_get_contents('https://www.clever-tanken.de'.$uri, False, $context);
$data = str_replace("\r\n", "\n", $data);
$zeile = explode("\n", $data);
$i = count($zeile);


Tschau
Uwe
 
Hallo Uwe,

bin erst jetzt zum Testen gekommen.
Leider geht das mit deinen Einstellungen auch nicht.
Habe mal meine BenzinPlugin.PHP hier dargestellt.
Findest du evtl da noch einen Fehler, komme da nicht weiter.

Gruß
Peter
Code:
<?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
//error_reporting(E_ALL);
class BenzinDATOKPlugin 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";
        mysql_query($query, $this->dbconn) or die('Error, delete query failed');

        // Preise und Tankstellen lesen - Meldestellenversion v0.1
        $i=0;
        $ortnumber = 0;
            while ($ort = $this->config['ort_'.++$ortnumber]) {
                 $uri = "/tankstelle_liste?spritsorte=3&r=5&ort=".$ort;   // spritsorte 3=Diesel, 5=Super E10
              $opt = array('http' => array('proxy' => 'tcp://PROXY_IP:8080','request_fulluri' => true,),);
              $context = stream_context_create($opt);
              $data = file_get_contents('https://www.clever-tanken.de'.$uri, False, $context);
              $data = str_replace("\r\n", "\n", $data);
              $zeile = explode("\n", $data);
              $i = count($zeile);
              }
                    
                    // 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="fuel-station-price">',$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="row fuel-station-location-name"]')->item(0);
                $name=$div->nodeValue;
                $div = $xpath->query('//*[@id="fuel-station-location-street"]')->item(0);
                $strasse=$div->nodeValue;
                $div = $xpath->query('//*[@id="fuel-station-location-city"]')->item(0);
                $stadt=$div->nodeValue;
                $div = $xpath->query('//*[@class="fuel-station-location-address-distance"]')->item(0); 
                $entfernung = strip_tags (trim ($div->nodeValue));

                /*
                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 != "&nbsp;" && $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 `preis` ASC, `datum` DESC";
        $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/icons/';
        
        $gelb = ImageColorAllocate ($image, 255, 255, 0);
        $yellow = imagecolorallocate($image, 240, 255, 64);
        $red = imagecolorallocate($image, 255, 0, 0);
        $green = imagecolorallocate($image, 0, 140, 255);
            // print header
            $text = 'Kraftstoffpreise (Diesel) ()';
            imagettftextboxopt($image, 24, 0, 50, $yoffset, $red, $style['font'], $text, $opt_header);
            $icon = ImageCreateFromPNG ( 'resources/icons/tank.png' );
            ImageCopy($image, $icon, 20, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
            ImageDestroy($icon);
            $yoffset += 30;
        
        //$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, 16, 0, 50, $yoffset, $style['textcolor'], $style['fontb'], $text, $opt_entry);
            $yoffset += 19;
            
            //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());
    }


}
 
Zuletzt bearbeitet:
Hallo Uwe (nochmal)

Ich habe nochmal beissl probiert.
Mit folgenden Einstellungen (als eigenständige PHP-Datei) kann ich die Clever-Tanken Seite über den Proxy-Server erreichen:
Code:
<?php

              $aContext = array('http' => array('proxy' => 'tcp://PROXY-IP:8080','request_fulluri' => true,),);
              $cxContext = stream_context_create($aContext);
              $data = file_get_contents("https://www.clever-tanken.de/tankstelle_liste?spritsorte=5&r=5&lat=50.4362219&lon=7.83024938&ort=55555+Teststadt", False, $cxContext);
              $data = str_replace("\r\n", "\n", $data);
              $zeile = explode("\n", $data);
              $i = count($zeile);
              echo $data;

?>

Wenn ich diesen PHP-Code allerdings in meiner BenzinPlugin.PHP verwenden bekomme ich (errorreporting) folgende Meldung:

Parse error: syntax error, unexpected T_PUBLIC in C:\xampp\htdocs\infoframe\plugins\BenzinDATOKPlugin.php on line 169

Zeile 169: public function doOutput($image, $style, $updateData, &$yoffset) {



Hab schon verschiedenes ausprobiert, jdoch keine Lösung gefunden.
Was könnte das sein?

Gruß
Peter
 
Hallo Peter,

poste einmal das gesamte neue Script...

Tschau
Uwe
 
Hallo Uwe,

hier das gesamte Script:

Gruß
Peter

Code:
<?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
//error_reporting(E_ALL);

class BenzinDATOKPlugin 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";
        mysql_query($query, $this->dbconn) or die('Error, delete query failed');

        // Preise und Tankstellen lesen - Meldestellenversion v0.1
        $i=0;
        $ortnumber = 0;
            while ($ort = $this->config['ort_'.++$ortnumber]) {
                 $uri = "/tankstelle_liste?spritsorte=3&r=5&ort=".$ort;   // spritsorte 3=Diesel, 5=Super E10
                          
              
             $aContext = array('http' => array('proxy' => 'tcp://PROXY-IP','request_fulluri' => true,),);
              $cxContext = stream_context_create($aContext);
              $data = file_get_contents("https://www.clever-tanken.de/tankstelle_liste?spritsorte=5&r=5&lat=50.4362219&lon=7.83024938&ort=55555+TESTSTADT", False, $cxContext);
              $data = str_replace("\r\n", "\n", $data);
              $zeile = explode("\n", $data);
              $i = count($zeile);
              }
              
              
                    
                    // 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="fuel-station-price">',$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="row fuel-station-location-name"]')->item(0);
                $name=$div->nodeValue;
                $div = $xpath->query('//*[@id="fuel-station-location-street"]')->item(0);
                $strasse=$div->nodeValue;
                $div = $xpath->query('//*[@id="fuel-station-location-city"]')->item(0);
                $stadt=$div->nodeValue;
                $div = $xpath->query('//*[@class="fuel-station-location-address-distance"]')->item(0); 
                $entfernung = strip_tags (trim ($div->nodeValue));

                /*
                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 != "&nbsp;" && $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 `preis` ASC, `datum` DESC";
        $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/icons/';
        
        $gelb = ImageColorAllocate ($image, 255, 255, 0);
        $yellow = imagecolorallocate($image, 240, 255, 64);
        $red = imagecolorallocate($image, 255, 0, 0);
        $green = imagecolorallocate($image, 0, 140, 255);
            // print header
            $text = 'Kraftstoffpreise (Diesel) (Teststadt)';
            imagettftextboxopt($image, 24, 0, 50, $yoffset, $red, $style['font'], $text, $opt_header);
            $icon = ImageCreateFromPNG ( 'resources/icons/tank.png' );
            ImageCopy($image, $icon, 20, $yoffset-3, 0, 0, imagesx($icon), imagesy($icon));
            ImageDestroy($icon);
            $yoffset += 30;
        
        //$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, 16, 0, 50, $yoffset, $style['textcolor'], $style['fontb'], $text, $opt_entry);
            $yoffset += 19;
            
            //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());
    }
    

 


?>
 

Anhänge

  • BenzinDATOKPlugin_https.zip
    4.6 KB · Aufrufe: 2
Hallo Uwe,

ich wollte mich nochmal bei dir bedanken.

Habe den fehler gefunden, nun läufts wieder wie gewohnt.

Code:
 $aContext = array('http' => array('proxy' => 'tcp://PROXY_IP:8080','request_fulluri' => true,),);
            $cxContext = stream_context_create($aContext);
            //$data = file_get_contents("https://www.clever-tanken.de/tankstelle_liste?spritsorte=3&r=10&lat=50.4362219&lon=7.83024938&ort=55555+TESTSTADT", False, $cxContext);
            $data = file_get_contents('https://www.clever-tanken.de'.$uri, False, $cxContext);
            $data = str_replace("\r\n", "\n", $data);
            $zeile = explode("\n", $data);
            $i = count($zeile);
                  
                    // 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($data);
                    $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="fuel-station-price">',$responseEnd[0]);
                    foreach ($tankstellenarray as $i => $tanke) {
                        $zeile[$i++]=strip_tags($tanke,'<div><sup>');

FALSCH: $responseSplit=utf8_decode($response);
RICHTIG: $responseSplit=utf8_decode($data);

Denkanstöße kommen immer gut, manchmal sieht man den Wald vor lauter Bäume nicht.

Gruß
Peter
 
Zuletzt bearbeitet:
Holen Sie sich 3CX - völlig kostenlos!
Verbinden Sie Ihr Team und Ihre Kunden Telefonie Livechat Videokonferenzen

Gehostet oder selbst-verwaltet. Für bis zu 10 Nutzer dauerhaft kostenlos. Keine Kreditkartendetails erforderlich. Ohne Risiko testen.

3CX
Für diese E-Mail-Adresse besteht bereits ein 3CX-Konto. Sie werden zum Kundenportal weitergeleitet, wo Sie sich anmelden oder Ihr Passwort zurücksetzen können, falls Sie dieses vergessen haben.