InfoFrame: Digitaler Bilderrahmen auf dem Raspberry PI

Hallo Leutz,

Ich habe ein kleines Problem mit dem Benzin Plugin. Clever Tanken stellt mir 2 Seiten zur Verfügung, das Plugin liest aber immer nur eine Seite aus. Wie bekomme ich es hin, daß das Plugin auch beide Seiten ausliest?
Hatte in der BenzinPlugin.php schon die Sortierung eingebracht, nur ist eine Tankstelle ich möchte immer auf der 2. Seite zu sehen. Auch finde ich bei clever-tanken.de keine Option, alle Tankstellen auf einer Seite darzustellen.
Vielleicht kann mir einer einen Tip geben.

Gruß Daniel

@marvin424: Schönen Urlaub
 
Hallo Daniel,
Wenn Du mit den Optionen lat und lon genau die Koordinaten deiner gewünschten Tanke einträgst und den Suchradius mit r=2 möglichst klein machst, wirst Du bestimmt keine zwei Seiten bekommen.
 
Hallo Michael,

genau das ist ja mein Problem. Ich habe genau 4 Tankstellen, die ich im Auge haben möchte, weil ich die von zu Hause bis zur Arbeit auf dem Weg habe. Und die sind so ziemlich an die 10km auseinander...
Und alphabetische Sortierung ist auch nicht drin, weil von Aral bis Westfalen.
Naja, wird die Westfalen Tankstelle erstmal ausgelassen.
Vielleicht hat ja noch jemand einen Tip.

Gruß Daniel

PS: Ich werds mal anders versuchen, indem ich die Koordinaten in die Mitte setze und Radius auf 5km. Mal schauen was dabei rauskommt.
 
Hi,

jetzt klappts, habe die Koordinaten so ziemlich mittig gesetzt und Radius auf 5km. Jetzt habe ich alle Tankstellen auf einer Seite und alle 4, die ich sehen möchte, habe ich jetzt drin.
Hätte ich ja auch vorher mal drauf kommen können... ;)

Gruß Daniel
 
Hi Jörg,

wie versprochen, hier die neue GoogleContactsUpdate.php

Die arbeitet jetzt ähnlich, wie die Box mit einer Client-ID. Diese musst Du erst mal unter https://console.developers.google.com/project/infoframe-1/apiui/credential erstellen.
1.jpg

"Installierte Anwendung" und "Sonstige" anklicken...
2.jpg

Dann bekommst Du eine Client-ID und Schlüssel, die Du dann bitte in die config.ini einträgst.
3.jpg

config.ini
Code:
;für google contacts update
cny_prefix = "+49"
cty_prefix = "0211"
client_id = "xxxxxxxxxxxxxx.apps.googleusercontent.com"
client_secret = "XXXXXXXXXXXXXXXXX"

Die alten Optionen user und pass kannst Du löschen.

Jetzt müssen wir nur noch die Token holen. Dazu sind die Dateien Get_Token1 und 2 da.

$ php Get_Token1.php gibt Dir sowas aus:

[NOPARSE]Diese URL aufrufen: https://www.google.com/device
Diesen Code eingeben: YYYY-YYYY
In Get_Token2.php $device_code = "XXXXXXXXXXX"[/NOPARSE]


Im Browser die URL aufrufen, evtl. einloggen, den Code eingeben und bestätigen.
4.jpg

Danach die Variable $device_Code in Get_Token2.php anpassen und aufrufen.

$ php Get_Token2.php liefert Dir dann access_token und refresh_token (in dieser Reihenfolge).

config.ini
Code:
;für google contacts update
cny_prefix = "+49"
cty_prefix = "0211"
client_id = "xxxxxxxxxxxxxx.apps.googleusercontent.com"
client_secret = "XXXXXXXXXXXXXXXXX"
access_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
refresh_token = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"

Jetzt kannst Du die neue GoogleContactsUpdate.php wie gewohnt per cron ausführen lassen.


GoogleContactsUpdate.php
PHP:
<?php
// Includes & Settings
error_reporting (E_ERROR);
// $loc = setlocale (LC_ALL, 'de_DE.UTF8', 'de_DE', 'de', 'ge');

// Config lesen
$config = parse_ini_file ("config.ini", true);
$cny_prefix = preg_replace ("/^\+/", "00", $config['System']['cny_prefix']);
$cty_prefix = $config['System']['cty_prefix'];
$num_days = $config['CalendarPlugin']['number_of_days'];

// OAuth 2.0 Authentication
$client_id = $config['System']['client_id'];
$client_secret = $config['System']['client_secret'];
$access_token = $config['System']['access_token'];
$refresh_token = $config['System']['refresh_token'];

// Google-php-api-master
if (isset ($config['System']['google_api_path'])) set_include_path (get_include_path () . PATH_SEPARATOR . $config['System']['google_api_path']);
require_once 'src/Google/autoload.php';

// teste Datenbank Verbindung
$dbconn = new PDO('mysql:host=' . $config['System']['db_host'] . ';dbname=' . $config['System']['db_name'], $config['System']['db_user'], $config['System']['db_password']);

session_start();

if (isset($_SESSION['access_token']))
	$access_token = $_SESSION['access_token'];

$url = 'https://www.google.com/m8/feeds/contacts/default/full?max-results=9999&alt=json&v=3.0&oauth_token=' . $access_token;
$xmlresponse =  curl($url);
$response = json_decode($xmlresponse, true);

if ($response['error']['code'] == 401)
{
	// access_token abgelaufen, neuen holen und in Session speichern
	$url = "https://www.googleapis.com/oauth2/v3/token";
	$post = "client_id=" . urlencode($client_id);
	$post .= "&client_secret=" . urlencode($client_secret);
	$post .= "&refresh_token=" . urlencode($refresh_token);
	$post .= "&grant_type=refresh_token";
	$xmlresponse =  curl($url, $post);
	$response = json_decode($xmlresponse, true);
	$access_token = $response['access_token'];
	$_SESSION['access_token'] = $response['access_token'];
	$url = 'https://www.google.com/m8/feeds/contacts/default/full?max-results=9999&alt=json&v=3.0&oauth_token=' . $access_token;
	$xmlresponse =  curl($url);
	$response = json_decode($xmlresponse, true);
}

$contacts = array ();	
foreach ($response['feed']['entry'] as $entry)
{
	$obj = new stdClass;
	
	if (($b = $entry['gContact$birthday']['when']) != '')
		// 1970 falls kein Jarh angegeben ist
		$obj->birthday = preg_replace ("/^--/", "1970-", $b);
	else
		$obj->birthday = null;
	$obj->name = $entry['gd$name']['gd$fullName']['$t'];
	$obj->upd = $entry['updated']['$t'];
	foreach ($entry['gd$phoneNumber'] as $p)
	{
		//rel suchen
		$rel = $p['rel'];
		//wenn rel nicht da vielleicht ein user defined label?
		if ($rel == null) $rel= '#' . $p['label'];
		// nur ab # wollen wir haben und in array
		$obj->phoneType[] = substr ($rel, strpos ($rel, '#') + 1, strlen ($rel));
		// und nummer in array
		$obj->phoneNumber[] = $p['$t'];
	}
	// find pictures
	foreach ( $entry['link'] as $link )
	{
		if (!empty ($link['gd$etag']))
		{
			$image = curl($link['href'] . "&access_token=" . $access_token);
			$obj->image = "cache/google_contacts_images/" . $obj->name . ".jpg";
			file_put_contents ($obj->image, $image);
		}
	}
	// speichern
	$contacts[] = $obj;
}

$sql = "DELETE FROM `if_phonebook`";
$dbconn->query ($sql) or die ('DELETE gescheitert: ' . $dbconn->errorInfo()[2]);

// nur Geburtstage aus contacts löschen
$sql = "DELETE FROM `if_calendar` WHERE `color`='#000000'";
$dbconn->query ($sql) or die ('DELETE gescheitert: ' . $dbconn->errorInfo()[2]);

// alle Daten in results, los gehts
foreach ($contacts as $r)
{
	$na = utf8_decode ($r->name);
	if ($r->birthday)
	{
		// Geburtstag in unixtime, Termin ist Monat, Tag mit aktuellem Jahr
		$n1 = strtotime (date('o') . '-' . substr ($r->birthday, 5, 5));
		// dauert einen Tag
		$n2 = $n1 + 60 * 60 * 24;
		// liegt Geburtstag in der Vergangenheit? dann Termin plus ein Jahr
		if ($n2 < strtotime('now'))
		{	
			$n1 = strtotime ('+ 1 year', $n1);
			$n2 = strtotime ('+ 1 year', $n2);
		}
		// liegt Geburtstag ausserhalb der Anbzeigezeitspanne, dann ignorieren.
		if ($n1 < strtotime('+ ' . $num_days . ' days')) 
		{
			$sql = "INSERT INTO `if_calendar` (`color`, `begin`, `end`, `title`, `location`) VALUES ('#000000', FROM_UNIXTIME($n1) , FROM_UNIXTIME($n2) ,'" . $na . " hat Geburtstag','')";
			$dbconn->query($sql) or die ('INSERT gescheitert: ' . $dbconn->errorInfo()[2]);
		}
	}
	
	if (property_exists ($r, "phoneNumber"))
	{
		if (property_exists ($r, "image"))
			$im = $r->image;
		else
			$im = "";
		$up = $r->upd;
		
		for ($i = 0; $i < count ($r->phoneNumber); $i++)
		{
			$ty = utf8_decode ($r->phoneType[$i]);
						
			// Nummer ohne space, _, - () etc...
			$no = utf8_decode ($r->phoneNumber[$i]);
			$no = preg_replace ("/[^\+,0-9]/", "", $no);              // alles was nicht Ziffer ist raus
			$no = preg_replace ("/^\+/", "00", $no);                  // + -> 00
			$no = preg_replace ("/^" . $cny_prefix . "/", "0", $no);  // führende 0049 durch 0 ersetzen
			$no = preg_replace ("/^00/", "+", $no);                   // 00 -> +
			$no = preg_replace ("/^" . $cty_prefix . "/", "", $no);   // city  durch nix
			
			// existiert die Nummer schon?
			$sql = "SELECT * FROM `if_phonebook` WHERE `number`='" . $no . "'";
			$res = $dbconn->query ($sql) or die ('SELECT * gescheitert: ' . $dbconn->errorInfo()[2]);
			if ($res->rowCount () > 0)
			{
				// Nummer existiet schon
				$row = $res->fetch(PDO::FETCH_ASSOC);
				error_log("Warnung: doppelte Nummer: " . $no . " - " . $na . ": Bereits vergeben für " . $row['name'], 0);
			}
			else
			{
				// Nummer existiert noch nicht, alles einfügen
				$sql = "INSERT INTO `if_phonebook`(`number`, `name`, `type`, `image`, `update`) VALUES ('" . $no . "','" . $na . "','" . $ty . "','" . $im . "','" . $up . "')";
				$dbconn->query($sql) or die ('INSERT gescheitert: ' . $dbconn->errorInfo()[2]);
			}
		}
	}
}

function curl($url, $post = "")
{
	$curl = curl_init();
	$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
	curl_setopt($curl, CURLOPT_URL, $url);
	curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
	curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
	if ($post != "")
	{
		curl_setopt($curl, CURLOPT_POST, 5);
		curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
	}
	curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
	curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
	curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);
	curl_setopt($curl, CURLOPT_TIMEOUT, 10);
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
	$contents = curl_exec($curl);
	curl_close($curl);
	return $contents;
}
?>


Get_Token1.php
PHP:
<?php
$config = parse_ini_file ("config.ini", true);
$client_id = $config['System']['client_id'];
$client_secret = $config['System']['client_secret'];

$url = "https://accounts.google.com/o/oauth2/device/code";
$post = "client_id=" . urlencode($client_id);
$post .= "&scope=https://www.googleapis.com/auth/contacts https://www.googleapis.com/auth/calendar.readonly";

$curl = curl_init();
$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_POST, 5);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
$xmlresponse = curl_exec($curl);
curl_close($curl);

$response = json_decode($xmlresponse, true);

echo "\nDiese URL aufrufen: ". $response['verification_url'] . "\n";
echo "Diesen Code eingeben: " . $response['user_code'] . "\n";
echo "In Get_Token2.php \$device_code = \"". $response['device_code'] . "\n\n";

?>


Get_Token2.php
PHP:
<?php
$config = parse_ini_file ("config.ini", true);
$client_id = $config['System']['client_id'];
$client_secret = $config['System']['client_secret'];
$device_code='Edit me';

$url = "https://www.googleapis.com/oauth2/v3/token";
$post = "client_id=" . urlencode($client_id);
$post .= "&client_secret=" . urlencode($client_secret);
$post .= "&code=" . urlencode($device_code);
$post .= "&grant_type=" . urlencode("http://oauth.net/grant_type/device/1.0");

$curl = curl_init();
$userAgent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; .NET CLR 1.1.4322)';
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($curl, CURLOPT_POST, 5);
curl_setopt($curl, CURLOPT_POSTFIELDS, $post);
curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
curl_setopt($curl, CURLOPT_AUTOREFERER, TRUE);
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
$xmlresponse = curl_exec($curl);
curl_close($curl);

$response = json_decode($xmlresponse, true);

echo $response['access_token'] . "\n\n";
echo $response['refresh_token'] . "\n\n";

?>
 
Zuletzt bearbeitet:
Hallo.

Die Umstellung hat dank der genialen Anleitung problemlos funktioniert. Super - vielen Dank und sonnige Grüße

Jörg
 
Hallo.

Hat Google erneut etwas angepasst? Meine ContactsUpdate.php scheint nichts mehr abzuholen. In der Developer Consulo kann ich keine Apis mehr aktiviere/deaktivieren.

Gruß
Jörg
 
Läuft nach wie vor bei mir.
 
Läuft nach wie vor bei mir.

Kalender läuft auch wie bisher. Wenn ich die php manuell starte erhalte ich:

Code:
root@raspberrypi:/var/www# wget http://192.168.2.40/GoogleContactsUpdate.php
--2015-11-29 12:50:11--  http://192.168.2.40/GoogleContactsUpdate.php
Verbindungsaufbau zu 192.168.2.40:80... verbunden.
HTTP-Anforderung gesendet, warte auf Antwort... 200 OK
Länge: 1 [text/html]
In »»GoogleContactsUpdate.php.2«« speichern.

100%[======================================>] 1           --.-K/s   in 0s

2015-11-29 12:50:11 (23,0 KB/s) - »»GoogleContactsUpdate.php.2«« gespeichert [1/1]

Die genannte Datei ist allerdings leer. Im Cache Ordner sind keine Bilder geschrieben - Datenbank habe ich noch nicht nachgesehen.

Gruß
Jörg
 
Hallo,
dass die Datei leer ist, ist korrekt, es wird ja nichts ausgegeben.
Der Umweg über wget wird ja nur gemacht, damit Fehlermeldungen in die /var/log/apache2/error.log geschrieben werden.
Dessen Inhalt wäre interessant, evtl. die logstufe mit error_reporting (E_ALL); hochsetzen.
Gruß, Michael...
 
Der Umweg über wget wird ja nur gemacht, damit Fehlermeldungen in die /var/log/apache2/error.log geschrieben werden.
Dessen Inhalt wäre interessant, evtl. die logstufe mit error_reporting (E_ALL); hochsetzen.
Hallo.

So - habe ich gemacht. Im Log mosert er Zeile 53 an: Invalid argument supplied for foreach()...

Gruß und einen schöne vierten Advent
Jörg
 
Im Log mosert er Zeile 53 an: Invalid argument supplied for foreach()..

Ein paar Tage krank - Zeit für den Infoframe. Ich habe nunmehr eine neue ID und die beiden Tokens neu erstellt -> läuft wieder.

Euch allen eine wunderbares neues 2016.

Gruß
Jörg
 
Ein paar Tage krank - Zeit für den Infoframe. Ich habe nunmehr eine neue ID und die beiden Tokens neu erstellt -> läuft wieder.

Seltsam - wenn ich das aller erste mal die GoogleContactsUpdate.php mit neuen Tokens aufrufe geht das prima. Wenn allerdings der CronJob später versucht das alles zu aktualisieren ist das Ergebnis wieder leer - die SQL Datenbank ohne Ergebnis. Also: Wieder neue Token erzeugen und dann läuft das gleiche Script wieder wie gewünscht. Haben die Tokens ein "Ablaufdatum"?

Und was mich auf noch ärgert - es werden (bei Mail und bei Paket aufgefallen) die Umlaute durch "?" ersetzt - wenn ich manuell in die SQL DB eintrage (UTF8) geht es bis zur nächsten Aktualsierung. Kann ich irgendeinen Feldtyp ändern.

Gruss und schönen Restfasching

Jörg
 
Hallo Jörg,
der Access-Token läuft nach 30 Minuten ab, der Refresh-Token eigentlich erst, wenn Du bei Google den Zugang löschst.
GoogleContactsUpdate.php schaut, ob der Access-Token noch gültig ist. Falls nein, wird mit dem Refresh-Token ein neuer Access-Token generiert.

Irgendwie wäre hier ein Logfile interessant. So kann ich Dir nur sagen: Bei mir läufts.


Umlaute:

in /var/www/plugins/MailPlugin.php Zeile 190:
PHP:
".$this->dbconn->quote($subject)."
nach
PHP:
".$this->dbconn->quote(utf8_encode($subject))."

und

in /var/www/plugins/PaketPlugin.php Zeile 659:
PHP:
status=".$this->dbconn->quote($stat_txt).",
nach
PHP:
status=".$this->dbconn->quote(utf8_encode($stat_txt)).",
 
Irgendwie wäre hier ein Logfile interessant. So kann ich Dir nur sagen: Bei mir läufts.

Vielen Dank - Umlaute waren einfach und geht. Den Code für das Update vom Refresh-Token habe ich gefunden und auch soweit verstanden.

error.log aus Apache2 warnt vor Zeile 53 - soweit war ich schon mal.
 
Die Warnung kommt, weil $response['feed']['entry'] leer ist. Das darf aber eigentlich nicht sein, weil es weiter oben abgefragt wird.

Ersetze mal Zeile 35
PHP:
if ($response['error']['code'] == 401)
durch
PHP:
if (is_null($response))
 
Plugin IPPF

Hallo zusammen,

ich möchte mir ein Plugin basteln, welches mir neue Nachrichten bestimmter Themen in diesem Forum anzeigt. Eine API-Funktion, die für einen User alle neuen Nachrichten der abonnierten Themen ausspuckt wäre schön, ich habe aber keinerlei Infos dazu gefunden. Sollte einer von euch Infos dazu haben, immer her damit ;)

In der Zwischenzeit benutze ich folgende Lösung:
  • Eine Tabelle if_ippf in der die Nummer des zu überwachenden Themas mit PostNr und der SeitenNr gespeichert werden.
  • Eine Tabelle if_ippf_posts in der die Posts geschrieben werden, die Angezeigt werden sollen, also PostNr größer als in if_ippf.
  • Ein Hilfsprogramm ippf.php, mit dem die Tabelle if_ippf bearbeitet wird, ähnlich wie beim Paket Plugin.
Die Tabellen werden in der dbconn.php erstellt:
PHP:
        // table "if_ippf
        $query = "CREATE TABLE IF NOT EXISTS if_ippf (
                Thread INT UNSIGNED NOT NULL,
                LastPost INT UNSIGNED NOT NULL,
                Page INT UNSIGNED NOT NULL)
                ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ";
        self::$connection->query ($query) or die ('Error, insert query if_ippf failed: ' . self::$connection->errorInfo()[2]);

        // table "if_ippf_posts"
        $query = "CREATE TABLE IF NOT EXISTS if_ippf_posts (
                Thread INT UNSIGNED NOT NULL,
                ThreadName VARCHAR(255) COLLATE utf8_unicode_ci NOT NULL,
                PostDate VARCHAR(20) COLLATE utf8_unicode_ci NOT NULL,
                PostNumber INT UNSIGNED NOT NULL,
                PostUser VARCHAR(50) COLLATE utf8_unicode_ci NOT NULL,
                PostPage INT UNSIGNED NOT NULL)
                ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; ";
        self::$connection->query ($query) or die ('Error, insert query if_ippf_posts failed: ' . self::$connection->errorInfo()[2]);

Das eigentliche Plugin IPPFPlugin.php
PHP:
<?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/
 ***************************************************************************/

class IPPFPlugin implements IPlugin
{
    private $dbconn = NULL;
    private $config = NULL;

    public function __construct($dbconn, $config)
    {
        $this->dbconn = $dbconn;
        $this->config = $config;
    }


    public function doUpdate()
    {
        $query = "DELETE FROM if_ippf_posts";
        $this->dbconn->query ($query);

        $query = "SELECT * FROM if_ippf";
        $result = $this->dbconn->query ($query);

        while ($row = $result->fetch (PDO::FETCH_ASSOC))
        {
            $Thread = intval ($row[Thread]);
            $Lastpost = intval ($row[LastPost]);
            $Page = intval ($row[Page]);

            do
            {
                $url  = 'http://www.ip-phone-forum.de/showthread.php?t=' . $Thread . '&page=' . $Page;
                $ch = curl_init ($url);
                curl_setopt ($ch, CURLOPT_URL, $url);
                curl_setopt ($ch, CURLOPT_USERAGENT, utf8_encode ("Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"));
                curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
                $response = curl_exec ($ch);
                curl_close ($ch);
            
                $split_string = '<!-- see bottom of postbit.css for .userinfo .popupmenu styles -->';
                $response_array = explode ($split_string, $response);

                $i = 0;
                $doc = new DOMDocument ();
                foreach ($response_array as $i => $t)
                {
                    if ($i == 0)
                    {
                        $doc->loadHTML ($t);
                        $xpath = new DomXpath ($doc);
                        $div = $xpath->query ('//*[@class="threadtitle"]')->item (0);
                        $ThreadTitle = $div->nodeValue;
                    }
                    else
                    {
                        $doc->loadHTML ($t);
                        $xpath = new DomXpath ($doc);
                        $div = $xpath->query ('//*[@class="date"]')->item (0);
                        $PostDate = trim ($div->nodeValue);
                        $div = $xpath->query ('//*[@class="nodecontrols"]')->item (0);
                        $PostNumber = intval (substr (trim ($div->nodeValue), 1));
                        $div = $xpath->query ('//*[@class="popupmenu memberaction"]')->item (0);
                        $PostUser = trim (substr ($div->nodeValue, 2, strpos ($div->nodeValue, "\n", 2) - 1));
                        if ($PostNumber > $Lastpost)
                        {
                            $query = "INSERT INTO if_ippf_posts (Thread, ThreadName, PostDate, PostNumber, PostUser, PostPage) VALUES (".$Thread.",".$this->dbconn->quote ($ThreadTitle).",".$this->dbconn->quote ($PostDate).",".$PostNumber.",".$this->dbconn->quote ($PostUser).",".$Page.");";
                            $this->dbconn->query ($query) or die ('Error, insert query if_ippf_posts failed: ' . $this->dbconn->errorInfo ()[2]);
                        }
                    }
                }
                $Page++;
            }
            while (strpos ($response, "Letzte Seite") == True);  
        }
    }


    public function doOutput($image, $style, $updateData, &$yoffset)
    {
        if ($updateData) $this->doUpdate();

        $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,);

        $output = 0;

        $query = "SELECT * FROM if_ippf";
        $result = $this->dbconn->query ($query);
        while ($row = $result->fetch (PDO::FETCH_ASSOC))
        {
            $query = "SELECT COUNT(`Thread`) AS A FROM `if_ippf_posts` WHERE `Thread` = " . $row[Thread] . " GROUP BY `Thread`";
            $new_msg_count = $this->dbconn->query ($query)->fetch (PDO::FETCH_ASSOC);
            if ($new_msg_count != false)
            {
                // header nur einmal ausgeben
                if ($output == 0)
                {
                    $output++;
                    imagettftextboxopt ($image, 22, 0, 50, $yoffset, $style['textcolor'], $style['font'], 'IP-Phone-Forum', $opt_header);
                    $icon = ImageCreateFromPNG ('resources/icons/ippf_logo.png');
                    ImageCopy ($image, $icon, 20, $yoffset-3, 0, 0, imagesx ($icon), imagesy ($icon));
                    ImageDestroy ($icon);
                    $yoffset += 26;
                }
                if ($yoffset >= (imagesy($image) - 18)) 
                {
                    break;
                }
                $query = "SELECT * FROM if_ippf_posts WHERE Thread = " . $row[Thread];
                $r = $this->dbconn->query ($query)->fetch (PDO::FETCH_ASSOC);
                if ($new_msg_count[A] == 1)
                {
                    $text = "Neue Nachricht von " . $r[PostUser] . " in " . $r[ThreadName] . ": " . $r[PostDate];
                }
                else
                {
                    $text = $new_msg_count[A] . " neue Nachrichten in " . $r[ThreadName];
                }
                imagettftextboxopt($image, 12, 0, 50, $yoffset, $style['textcolor'], $style['font'], $text, $opt_entry);
                $yoffset += 18;
            }
        }
        if ($output != 0) $yoffset += 18;
    }
}
?>

Das Hilfsprogramm ippf.php zum Hinzufügen oder Bearbeiten der Themen bzw. um die Themen als gelesen zu markieren:
HTML:
<html>
    <head>
        <title>IP-PHONE-FORUM</title>
    </head>
    <body>
        <h2>IPPF-Dateneingabe</h2>
        <form action = "ippf.php" method = "post">
            <?php
                error_reporting(E_ALL);
                // PFAD zur config.ini ANPASSEN!!!!                
                $config = parse_ini_file("/var/www/config.ini", true);
                $sysconfig = $config['System'];
                
                $dbconn = new PDO('mysql:host=' . $sysconfig['db_host'] . ';dbname=' . $sysconfig['db_name'], $sysconfig['db_user'], $sysconfig['db_password']);
                if (!$dbconn)
                {
                    die('keine Datenbankverbindung möglich: ' . $dbconn->errorInfo()[2]);
                }
                    
                if (isset($_POST['add']))
                {
                    $query = "SELECT * FROM if_ippf WHERE Thread = " . $dbconn->quote($_POST['thread']);
                    $result = $dbconn->query($query);
                    if ($result->rowcount() > 0)
                    {
                        $query = "UPDATE if_ippf SET LastPost=" . $dbconn->quote($_POST['post']) . ", Page=" . $dbconn->quote($_POST['page']) . " WHERE Thread=" . $dbconn->quote($_POST['thread']);
                    }
                    else
                    {
                        $query = "INSERT INTO if_ippf (Thread, LastPost, Page) VALUES (" . $dbconn->quote($_POST['thread']) . ", " . $dbconn->quote($_POST['post']) . ", " . $dbconn->quote($_POST['page']) . ");";
                    }
                    $dbconn->query($query) or die($dbconn->errorInfo()[2]);
                }
                elseif (isset($_POST['reset']))
                {
                    $query = "SELECT Thread, Max(PostNumber) as Post, Max(PostPage) as Page  FROM if_ippf_posts GROUP BY Thread";
                    $result = $dbconn->query($query);
                    while ($row = $result->fetch(PDO::FETCH_ASSOC))
                    {
                        $query = "UPDATE if_ippf SET LastPost=" . $row['Post'] . ", Page=" . $row['Page'] . " WHERE Thread=" . $row['Thread'];
                        $dbconn->query($query) or die($query . " " . $dbconn->errorInfo()[2]);
                    }
                }
                else
                {
                    echo "<p>Go for it!</p><hr />";
                }
            ?>
            <p></p>
            <table>
                <tr>
                    <td>Thread ID:</td>
                    <td><input name = "thread" /></td>
                </tr>
                <tr>
                    <td>Post Nr:</td>
                    <td><input name = "post" /></td>
                </tr>
                <tr>
                    <td>Page:</td>
                    <td><input name = "page" /></td>
                </tr>
                <tr>
                    <td></td>
                    <td><input type = "submit" value = "Submit Data" name = "add" /></td>
                </tr>
                <tr>
                    <td><input type = "submit" value = "Mark as Read" name = "reset" /></td>
                    <td></td>
                </tr>
            </table>
        </form>
</body>
</html>

Das Logo ippf_logo.png in ./resources/icons:
ippf_logo.png

So siehts dann aus: für jedes Thema mit neuen Nachrichten eine Zeile, wenn mehr als eine neue Nachricht vorhanden sind, wird die Anzahl statt des Absendes angegeben.
IPPF Plugin.PNG

In die config.ini muss dann noch, zum Einschalten des Plugins, diese Section hinzugefügt werden, Parameter gibt es keine:
Code:
[IPPFPlugin]

Gruß, Michael...

PS. das Plugin arbeitet mit PDO_MYSQL statt der alten MySQL API.
 

Anhänge

  • IPPFPlugin.zip
    4.1 KB · Aufrufe: 2
Zuletzt bearbeitet:
Hallo zusammen. Ich habe bei meinem Kumpel das Projekt "Infoframe" bestaunen dürfen. Er meinte dann zu mir einfach der Anleitung hier folgen, ist total easy. Naja, was soll ich sagen. Läuft auch soweit. Beim Kalender scheitere ich aber daran das ich bei Google kein Projekt so starten kann, wie die Anleitung (Bilder) zum erstellen des Projekts es vorgeben. Konkret finde ich da keine Mailadresse im Format ****@developer.gserviceaccount.com. Eine Client-ID im Format ****apps.googleusercontent.com konnte ich erstellen und einen P12-Schlüssel downloaden. Leider fehlt da aber dann die Mailadresse. Also wie gesagt, sieht alles anders aus, als wenn Google die Seite geändert hat. Oder bin ich einfach zu doof. Der Kalender war eigentlich der Hauptgrund es mit dem Projekt mal zu versuchen.

Hoffe es hat jemand einen Tip für mich.
Bis denne.

MariusH
 
Hallo MariusH,

auch wenn sich die Oberfläche der Google Developers Console geändert hat - sehr zum Vorteil, wie ich finde - so sind die Namen doch ziemlich gleich geblieben.

Früher musste man eine Client-ID erstellen und dann den Anwendungstyp Dienstekonto auswählen.
Heute muss man im Menüpunkt Dienstekonten -> Dienstekonto erstellen auswählen.

So verwirrend ist das aber jetzt nicht...

Grüße auch an h-p-d,
Michael...
 
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.