Scripte für den Google Kalender. (Ehemals Termine eintragen)

Also anscheinend stimmt jetzt der Magic Cookie. Obwohl es bei bei mir kein „private“ im Cookie gibt. Liegt vielleicht auch daran das ich einen google-Apps-Account habe.

Jedenfalls bekomme ich nun diese Fehlermeldung:

Fatal error:  Uncaught exception 'Zend_Gdata_App_HttpException' with message 'Expected response code 200, got 403
Für diesen Kalender wurde leider kein Privat-Zugriff aktiviert. Der Eigentümer des Kalenders kann den Kalender über die Seite mit den Einstellungen für die Kalenderfreigabe veröffentlichen.' in C:\IP-Symcon\scripts\Zend\Gdata\App.php:709
Stack trace:

Ich schreibe aber beim Magic Cookie das „private-“ davor.

Spiele mal mit dieser Zeile oberhalb von Zeile 81.


$query->setVisibility('private-'.$magicCookie);

Lass das „privat-“ mal weg.

Hallo alle zusammen.

Aus gegebenen Anlass habe ich hier ein Script, das die Termine aus mehreren Google-Kalendern liest,
nach Datum und Uhrzeit sortiert und in einer Variablen ausgibt. Diese Variable kann dann so im Webfront angezeigt werden.

Vorgehensweise:

  • Aus dem Beitrag #7 die php_openssl.zip runterladen und entpacken.
  • Die php_openssl.dll in „IP-Symcon\ext“ kopieren.

  • Den IP-Symcon Dienst stoppen.
  • Den IP-Symcon Dienst starten.
  • Danach sollte IPS die Datei php_openssl.dll in der php.ini eingetragen haben.
  • Aus dem Beitrag #7 die Datei Zend.zip runterladen und entpacken.
  • Den kompletten „Zend“-Ordner in „IP-Symcon\scripts“ kopieren.

Ein neues Script anlegen und das rein kopieren.


<?
/*=============================================================
skrGoogleKalenderLesen - Martin Heinzel - 01.05.2012
Version: 1.0

Beschreibung:
Mit diesem Script werden die nächsten "X" Termine aus den Google Kalendern
gelesen.

Änderungen
----------

07.06.2012 von Version 0.1 -> 1.0

Beschreibung:

Erste Version des Scriptes. Geändert wurde:

-	Es werden nun Start und Endzeit angegeben.
-	Bei ganztägigen Terminen steht anstelle der Zeit der Text „Ganztägig“
-	Vor dem Termin steht in eckigen Klammern der Kalender, aus dem der Termin ist.
   Die Anzahl der angezeigten Zeichen des Kalendernamens kann eingestellt werden.

================================================================*/

//#################################### Bitte einstellen #####################################################################

$user                 = '0815blubber@googlemail.com'; //Google E-Mail
$pass                 = '12345';                    //Passwort
$message_count        = 10;                            //Anzahl der Meldungen
$whoCounts		   = 3;                             //Anzahl der dargestellten Zeichen des Kalenders

                                 //              Kalender-ID                                         =>          MagicCookie
$calendar_login     =    array('0815blubber@googlemail.com'                                     => 'e4d7b4567890f6adf49fb151a38d5d31',
                                   '9fi4ch8npcftzhnjsbi0s3tkhs@group.calendar.google.com'    => 'bbf5b3123dcb777a5a1fd9c0a432d834');

//###########################################################################################################################


// Variablen Deklaration --------------------------------------

// Variablen
//--------------

$StartTimes       =  array();
$EndTimes 	      =  array();
$Titles		      =  array();

//-------------------------------------------------------------

//benötigte Funktionen/Klassen
require_once 'Zend/Loader.php';
Zend_Loader::loadClass('Zend_Gdata');
Zend_Loader::loadClass('Zend_Gdata_AuthSub');
Zend_Loader::loadClass('Zend_Gdata_ClientLogin');
Zend_Loader::loadClass('Zend_Gdata_Calendar');

//--------------------------- Main ----------------------------

// Die Verbindung zum Kalender aufbauen
try
{
	$client = getClientLoginHttpClient($user, $pass);
}
catch(Exception $e)
{
	// prevent Google username and password from being displayed
	// if a problem occurs
	echo "Could not connect to calendar.";
	die();
}

// Event lesen
//==============

$start_date = date("Y-m-d");                    // Event ab dem aktuellem Datum
$gdataCal = new Zend_Gdata_Calendar($client);   // Eine neue Instanz der Kalender Klasse anlegen
$query = $gdataCal->newEventQuery();            // Eine neue Suchanfrage

// Die einzelnen Kalender abfragen
foreach ($calendar_login as $calendar_user => $magicCookie)
{

	// Übergeben der Daten der Suchanfrage
	$query->setUser($calendar_user);
	$query->setVisibility('private-'.$magicCookie);
	$query->setSingleEvents(true);
	$query->setProjection('full');
	$query->setOrderby('starttime');
	$query->setSortOrder('ascending');
	$query->setMaxResults($message_count);
	$query->setStartMin($start_date);

	// Die Suchanfrage ausführen
	$event_list = $gdataCal->getCalendarEventFeed($query);

	// Das Ergebnis durchsuchen
	foreach ($event_list as $event)
	{
	
	   $who           = utf8_decode($event->who[0]);
	   $who_substr    = substr($who, 0, $whoCounts);
	   
		//Auslesen der Daten
		$StartTimes[] 	= EventTime_to_TimeStamp($event->when[0]->startTime);
		$EndTimes[] 	= EventTime_to_TimeStamp($event->when[0]->endTime);
		$Titles[] 	 	= "[".$who_substr."] ".utf8_decode($event->title);
	}
}

array_multisort($StartTimes,SORT_ASC,$Titles,$EndTimes);	//Arrays sortieren
$count   = count($StartTimes);									//Anzahl der Termine

//Max Schleifenzählers
if($count <= $message_count){	$i = $count; }
else                        {	$i = $message_count; }
$sz      = 0; 															//Schleifenzähler

//Terminanzeige zusammenbauen
$event_display = "";                            			// Initialisieren der Anzeige

while($sz < $i)
{
	//Abfrage ganztägiger Termin
	if(Date("H:i:s",(int)$StartTimes[$sz]) === "00:00:00")
	{
		$event_display .= Date("d.m.Y",(int)$StartTimes[$sz])." ---  Ganztägig  ---   ".$Titles[$sz]."
";
	}
	else
	{
		$event_display .= Date("d.m.Y H:i:s",(int)$StartTimes[$sz])." - ".Date("H:i:s",(int)$EndTimes[$sz])."   ".$Titles[$sz]."
";
	}
	$sz++;
}

//echo $event_display;
SetValue(CreateVariableByName($IPS_SELF, "Kalender", 3, "~TextBox"), $event_display);

//------------------------- Main ENDE --------------------------

//------------------------ Funktionen -------------------------

/**
 * Returns a HTTP client object with the appropriate headers for communicating
 * with Google using the ClientLogin credentials supplied.
 *
 * @param  string $user The username, in e-mail address format, to authenticate
 * @param  string $pass The password for the user specified
 * @return Zend_Http_Client
 */
function getClientLoginHttpClient($user, $pass)
{
  $service = Zend_Gdata_Calendar::AUTH_SERVICE_NAME;
  $client = Zend_Gdata_ClientLogin::getHttpClient($user, $pass, $service);
  return $client;
}

function CreateVariableByName($id, $name, $type, $profile = "")
{
    global $IPS_SELF;
    $vid = @IPS_GetVariableIDByName($name, $id);
    if($vid === false)
    {
        $vid = IPS_CreateVariable($type);
        IPS_SetParent($vid, $id);
        IPS_SetName($vid, $name);
        IPS_SetInfo($vid, "this variable was created by script #$IPS_SELF");
        if($profile !== "") { IPS_SetVariableCustomProfile($vid, $profile); }
    }
    return $vid;
}

/**
 * Returns a timestamp of the Google event Time
 *
 * @param  string $eventTime The Google event Time in "2010-06-11T07:30:00.000-07:00"
 * @return int Timestamp of the Google event Time
 */
function EventTime_to_TimeStamp($eventTime)
{

		// Zerlegen der Startzeit
		if(strpos($eventTime, "T")>0)
		{
			//Datum
			$arrDate_Time 	= 	explode("T", $eventTime);
			$Date 			=  $arrDate_Time[0];
			$arrDate 		=  explode("-", $Date);
			$term_jahr     =  (int)$arrDate[0];
			$term_monat    = 	(int)$arrDate[1];
			$term_tag      =  (int)$arrDate[2];

			//Uhrzeit
			$arrTime 		=  explode("+", $arrDate_Time[1]);
			$Time          =  substr($arrTime[0], 0, 8);
			$arrTimeVal		=  explode(":", $Time);
			$term_Stunde   =  (int)$arrTimeVal[0];
			$term_Minute   =  (int)$arrTimeVal[1];
			$term_Sekunde  =  (int)$arrTimeVal[2];

		}
		else
		{
			//Datum
			$arrDate 		=  explode("-", $eventTime);
			$term_jahr     =  (int)$arrDate[0];
			$term_monat    = 	(int)$arrDate[1];
			$term_tag      =  (int)$arrDate[2];

			//Uhrzeit
			$term_Stunde   =  0;
			$term_Minute   =  0;
			$term_Sekunde  =  0;
		}

    return mktime($term_Stunde, $term_Minute, $term_Sekunde, $term_monat, $term_tag, $term_jahr);
}

//--------------------- Funktionen ENDE ------------------------

?>

  • In dem Script „$user“ anpassen. Der User ist deine Google-Mail Adresse.
  • In dem Script „$pass“ anpassen. Das ist das Passwort für deine Google-Mail Adresse.
  • In dem Script „$message_count“ anpassen. Das ist die Anzahl der Meldungen, die gelesen werden sollen.
  • In dem Script „$whoCounts“ anpassen. Das ist die Anzahl der dargestellten Zeichen des Kalendernamens.
  • In dem Script „$calendar_login“ anpassen. Diese Variable ist ein Array und kann beliebig erweitert werden.
    Sie besteht aus den Pärchen Kalender-ID (key) und dazugehörigem MagicCookie (value).

Jeder angelegte Kalender in Google hat dieses Pärchen Kalender-ID und MagicCookie.

So komme ich an diese Daten.

Ihr müsst Euch in Google einloggen und zu Kalender gehen.
Die Kalender-ID findest Du in den Einstellungen deines Kalenders.

Kalender-ID:

MagicCookie:

Ihr müsst den MagicCookie ohne „private-“ nehmen!!

Nach dem ausführen des Scripts sollten die Termine in der Variable „Kalender“ stehen.

Wenn noch Fragen sind meldet Euch bitte.

Calender_User1.png

Hallo,

wie kann ich den Google Kalender im IPS Webbrowser Anzeigen.

Der HTML Code von Google ist so.

<iframe src=„https://www.google.com/calendar/embed?showTitle=0&showPrint=0&showTz=0&height=600&wkst=1&bgcolor=%23c0c0c0&src=EMAIL-ADREESSE%40gmx.de&color=%232952A3&ctz=Europe%2FBerlin“ style=" border:solid 1px #777 " width=„800“ height=„600“ frameborder=„0“ scrolling=„no“></iframe>

Wenn ich aber mit dem Code den Kalender aufrufe, kommt die Password Abfrage von Google.

So sollte es werden .

Das finde ich so nicht OK!
Bitte Lösung angeben!

Der 2 Beitrag war ein doppel Posting, nur der kann gelöscht werden.:o

Das Problem wie im 1 Posting geschrieben besteht noch.

Gruß Uwe

Dank an Schablone funktioniert perfekt!
Ich habe dein Skript ein Bisschen umgebaut , so das ich automatisch meinen Schichtplan aus einer Excel CSV Datei auslese und in den Google Kalender Schreibe.

Wenn ich jetzt Schichten tausche möchte ich gerne den Inhalt aus dem Googlekalender leeren lassen und dann die neue CSV Datei einlesen .

Weiß jemand wie ich Automatisch meinen Googlekalender automatisch leeren kann?

Habe zwar diese Seite gefunden. Aber mir hilft das nicht weiter

Hallo,

gibte es auch einen Möglichkeit die Aufgaben von Googleklaender bei IPS einzulesen ?

Gruß Uwe

Hi Leute,

so endlich habe ich mir auch IPS angeschafft. Nun kommen meine ersten Gehversuche.
Die Funktion einen Google-Kalener einzubinden ist eine super Sache, allerdings stoße ich auf die ersten Probleme und hoffe, dass Ihr mir helfen könnt.

Es bestrifft die php_openssl.dll, sie taucht einfach nicht in der php.ini auf.
Ja, ich habe sie in den /ext - Pfad kopiert. Denn Dienst vorher ausgeschaltet und wieder eingeschaltet. Sie taucht nicht auf. Selbst reingeschrieben habe ich auch, wird auch wieder gelöscht.
Habe schon die verschiedensten Version der openssl.dll versucht, alles erfolglos.

Ich benutze IPS V2.6, ich hoffe es kann mir jemand weiterhelfen.

Mfg

Christian

Hallo…

ich m.E. habe das gleiche Problem wie klinge.

Nach erfolgtem Update auf IPS V2.6 funktioniert das Script zum Auslesen des Googlekalenders nicht mehr, obwohl es zuvor mind ein 1/2 Jahr ohne Probleme seinen Dienst tat und ich daran nichts verändert habe (Passwort und MagicCookie sind ok). Ein manueller Start wird immer mit der Meldung: <<Could not connect to calendar.">> quitiert.

Ich hege den Verdacht, dass dieses Verhalten mit dem Verschwinden der openssl aus der php.ini in Verbindung steht. Die dll ist zwar noch in den Extentions vorhanden, IPS ingnoriert diese jedoch. Auch ein manuelles Editieren der php.ini und ein anschließender Neustart von IPS brachten keine Abhilfe … Die openssl wurde wieder aus der php.ini gelöscht. … Gibt des da ggf. eine neue Version ? Kann jemand das Problem nachvollziehen und mir einen Lösungtipp geben ? :confused:

Gruß Swifty

Hi swifty.

Ich hab zwar leider keine Lösung aber das Problem tritt bei mir nicht auf.
Der Code fürs Kalenderauslesen ist seit Urzeiten unverändert. Läuft hier auch mit 2.6 ganz normal.

gruß
bb

Hallo alle zusammen.

Ich habe auch den Update auf 2.6 gemacht.
Seit dem läuft bei mir so ziemlich gar nichts mehr. :mad:
Wenn ich beim Google Kalender angekommen bin, melde ich mich.

Hallo alle zusammen.

Ich habe die php_openssl.dll im Beitrag #7 erneuert.
Das war es bei mir!!

Super jetzt geht’s bei mir auch wieder. Danke !!! :loveips:

Hi zusammen,

ja jetzt läuft alles!

Danke an Schablone für die neue openssl.dll (siehe Beitrag #7)!

Aus welcher PHP Version kam die openssl.dll denn? Hatte so viele Versionen ausprobiert, anscheinend nur die falschen.

Gruß

Christian

Die Frage habe ich auch gestellt.

Das ist die Antwort.

Hallo alle zusammen,

ich habe im #7 Post die php_openssl.dll gegen die kompletten Extensin’s getauscht.

Bitte dort die entsprechende Datei entnehmen!!

Servus,

Habe da mal ein kleines Problem …
Hätte alles nach Beschreibung gemacht, aber wenn ich das Script ausführe, dann
kommt die Fehlermeldung dass die „Class Zend_Exception“ nicht gefunden werden kann.

Im Ordner Zend im Script-Ordner wäre die aber vorhanden?

Irgendwie, ja, nix deutsch, php ist nix für mich :smiley:

Hallo Manni,

ich bin gestern nicht mehr dazu gekommen mir das anzusehen. Ich schaue mir das heute an.

Gesendet von meinem GT-I9205 mit Tapatalk

Servus Martin,

Nur keinen Stress, dass Problem läuft ja nicht weg … :rolleyes:
Vielleicht finde ich ja doch noch den Fehler, was bei meinen PHP-Kenntnissen
dann wohl ein Quantensprung wäre :smiley:

Gruß
Manfred