Google Kalender Zugriff und OAUTH 2.0

Hallo ihr kundigen PHP Programmierer,
ich versuche verzweifelt, meine alten Scripte zum Abrufen von Terminen aus dem Google Kalender auf die Google API V3 umzustellen. Leider fehlen mir da wohl doch ein paar Kenntnisse.
Ich versuche schon mit einigen PHP Bibliothenken dafür zu hantieren, habe mir entsprechende Zugangsdaten für die API generiert, stehe nun aber auf dem Schlauch. Wie realisiere ich OAUTH 2.0 in IP-Symcon?
Wie kann ich einen Termin an einem bestimmten Datum aus dem Google Kalender holen?
Geht das direkt per PHP oder muss ich irgend etwas mit JSON (was mir total fremd ist) machen?

Das alte Skript sah so aus;

<?

 $userid = 'xxxxxxx@gmail.com';
 $magicCookie = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
 $CalendarLink = "http://www.google.com/calendar/feeds/$userid/private-$magicCookie/full";
$feedParams = "?singleevents=true&max-results=1&orderby=starttime&start-min=".urlencode($datum)."&sortorder=a";

libxml_use_internal_errors(true);
$sxml = simplexml_load_file($feedURL.$feedParams);
if (!$sxml) {
    $protokolltext = "Laden der GoogleKalenderdaten fehlgeschlagen\r";
    echo $protokolltext;
    foreach(libxml_get_errors() as $error) {
        $protokolltext = sprintf("	 %s",$error->message);
        echo "	", $error->message;
    }
} else {
    $protokolltext = "Laden der GoogleKalenderdaten erfolgreich\r";
    echo $protokolltext;

// Teil der bei Leseerfolg ausgeführt wird

$today = 0;
$dienst = "";
$date = "";
$ausgabe = "";

foreach ($sxml->entry as $entry) {
    $title = stripslashes(utf8_decode($entry->title));
    $gd = $entry->children('http://schemas.google.com/g/2005');

    $where = utf8_decode($gd->where->attributes()->valueString);
    if(strlen($where) > 0) {
        $where = " (".$where.")";
    }
	 
	 
    $dienst= substr ($title.$where,0,11);
    $startTime = '';
    $endTime = '';


     // read StartTime
        if ( $gd->when ) {
            $startTime = $gd->when->attributes()->startTime;
        } elseif ( $gd->recurrence ) {
            $startTime = $gd->recurrence->when->attributes()->startTime;
        }
        $startTime = strtotime( $startTime );

    // read EndTime
        if ( $gd->when ) {
            $endTime = $gd->when->attributes()->endTime;
        } elseif ( $gd->recurrence ) {
            $endTime = $gd->recurrence->when->attributes()->endTime;
        }
        $endTime = strtotime( $endTime );
        $sommerzeit = date("I");
        $zeitzone = 1;
        $dayofweek = date("l", $startTime);
        
}

Ich bekomme als Ergbnis den Termineintrag und Anfangs und Endzeit geliefert. So geht es nicht mehr, die alte API wurde deaktiviert.
Wie jetzt?

Cheers,

Andreas

Hallo,
hier ein paar Links:

http://blog.iangsy.com/2013/10/writing-events-to-calendar-with-php.html

Hi Brovning

… danke für die Links.

Ich habe mich an die hier beschriebene Anleitung gehalten. Die Registrierung bei Google hat ganz gut funktioniert, jedoch läuft das php Skript bei mir nicht.

Fehler:

„Uncaught exception ‚Google_Exception‘ with message ‚The Google PHP API library needs the openssl PHP extension‘ in C:\IP-Symcon\scripts\google-api-php-client-master\src\Google\Signer\P12.php:36“

Das liegt m.E. daran, dass die „php_openssl.dll“ nicht geladen wird. Beim Start schreibt IPS hierzu folgendes ins LOG:

„Erweiterung php_openssl.dll nicht geladen. Nicht nutzbar in Verbindung mit OpenSSL 1.0.1“

Meine Suche hier im Forum führte mich zu der Erkenntnis, dass es hierfür wohl eine Abhilfe gibt.

Hat jemand noch einen TIP für mich ?

Gruß

Swifty

Hallo,
mit der alten libeay32.dll und ssleay32.dll in der Version 0.9.8.18 sollte es funktionieren.
Schon probiert?

Habe mal folgendes probiert:

Das Beispielskript scheint soweit zu funktionieren.

Hier ist die API beschrieben:

Ju hu… läuft … :loveips:

Ich habe die libeay32.dll und ssleay32.dll gegen die alten Versionen ausgetauscht.
Weiterhin hatte ich vergessen die auszulesenden Google-Kalender für die Service Account-ID (E-Mail) freizugeben.

Jetzt kann ich den Google-Kalender wieder auslesen.

Gruß

Swifty

Nicht, dass in ein paar Wochen über Sicherheitslücken genörgelt wird… :rolleyes::eek::confused::smiley:

Hallo Raketenschnecke…

ich bin, was diese Sicherheitslücken angeht, sehr unbedarft. :confused:

Kannst Du mich bitte aufklären. :rolleyes:

Gibt es ggf. einen anderen Weg die php_openssl.dll einzubinden ?

Gruß

Swifty

Du hast Dir eben den SSL-Bug wieder eingebaut. Such mal nach SSL/Heartbleed. Oder auch hier: Forenthread

0.9.8. War davon doch gar nicht betroffen? Oder täusche ich mich da.
Michael

Ups, stimmt. Da hat Papa nicht aufgepasst, sorry :eek:

@Swifty: Könntest du mir/uns bitte erklären, wie du den Google Kalender wieder in Ordnung gebracht hast? Ich kann leider nach wie vor den Kalender nicht auslesen und habe deshalb keine Termine und Mülltonnen mehr im WebFront und den Tagesansagen :frowning:

Vielen Dank im Voraus und Grüße,
Chris

Hallo Swifty,
woher hast Du die dlls?

VG

Hallo…

@Stele99

schau mal hier:smiley:

@Bayaro
Ich habe mich ganz stur an diese Anleitungen gehalten:

Vorgehensweise (grob aus dem Kopf); die Details könnt Ihr den Anleitungen aus den obigen Links entnehmen:

  1. Den google-api-php-client (eine von Google zur Verfügung gestellte php-Skript Sammlung) von hier herunterladen. Ich hab das ganze Gedöns im in einem Unterordner im Skriptverzeichnis von IPS abgespeichert.

  2. Bei Google registrieren https://cloud.google.com/console, dort ein Projekt anlegen und die Calender API aktivieren,

  3. Unter dem o.g. Projekt ein Zertifiakt erzeugen und die "privatekey.p12’-Datei herunterladen.

  4. Die zum Zertifikat generierte Service Account Email-Adresse kopieren. Sodann im "normalen „Google-Account“ einloggen und bei dem jeweiligen Kalender unter Einstellungen diesen für die o.g. E-Mail-Adresse freigeben.

  5. Als „Probierskript“ habe ich dass von den obigen Webseiten verwandt.

  6. Nicht vergessen die libeay32.dll und ssleay32.dll (s.o.) im IPS-Stammverzeichnis noch auszutauschen.

… alles aus dem Kopf und ohne Gewähr …

Gruß

Swifty

Bezieht sich das ganze denn jetzt auch auf den Privaten kalender oder nur auf den öffentlichen?
Das wird mir gerade nicht so ganz klar …

Und kann ich die alten Scripte wie gewohnt weiter verwenden weil hier nur etwas an der Authorisierung gemacht wurde oder muss das ganze Auslesen anders gestaltet werden?

Grüße,
Doc

hier mal mein Script zum Auslesen der „unwichtigen“ Kalender, welche auf öffentlich stehen.

define("CALENDAR_ID", "xxxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com");
define("API_KEY", "hier den Api-Key aus der Konsole eintragen");
define("MAX_RESULTS", 1);

$url  = "https://www.googleapis.com/calendar/v3/calendars/".CALENDAR_ID."/events?key=".API_KEY;
$url .= "&timeMin=".urlencode(date("c"))."&singleEvents=true&orderBy=startTime&maxResults=".MAX_RESULTS;
$json = Sys_GetURLContent($url);
$cal  = json_decode($json);

$name = utf8_decode($cal->items[0]->summary);
$ereignis_datum = strtotime( $cal->items[0]->start->date );
$ereignis_datum = date("d.m.y", $ereignis_datum);
echo "$ereignis_datum $name";

Hallo…

m.E. bezieht sich das Ganze nur auf die privaten Kalender.

Meine Skripte musste ich etwas modifizieren. Die Google API leifert ein Array mit diversen Daten zu jedem Ereigniss innerhalb einer vorgegebene Zeitspanne (z.B. alle Ereignisse für die nächsten 30 Tage). Welche Datenfelder man davon auswerten will ist einem ja selbst überlassen.

Gruß

Swifty

… und hier mein Skript für die „wichtigen“ privaten Kalender …

<?
//Kalender Abfall
$calName = 'xxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com'; //Abfallkalender
$Tage=40;

$calcData=ReadCalendar($calName, $Tage);

usort($calcData, 'DateCompare');

print_r($calcData);


//***************************************************************************************************

function DateCompare($a, $b)
	 {
    if ( strtotime($a['Start']) == strtotime($b['Start']) ) return 0;
    if ( strtotime($a['Start']) < strtotime($b['Start']) )  return -1;
    return 1;
	}

function ReadCalendar($calName, $maxDays)
	{
    require_once "google-api-php-client-master/autoload.php";

	// Service Account info
	$client_id = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.apps.googleusercontent.com';
	$service_account_name = 'xxxxxxxxxxxxxxxxxxxxxxxxx@developer.gserviceaccount.com';
	$key_file_location = 'google-api-php-client-master/Google-IPS-Kalender-xxxxxxxxxxx.p12';

	$client = new Google_Client();
	$client->setApplicationName("Abfall_Kalender");
	$service = new Google_Service_Calendar($client);

	$key = file_get_contents($key_file_location);
	$cred = new Google_Auth_AssertionCredentials($service_account_name, array('https://www.googleapis.com/auth/calendar.readonly'), $key);

	$client->setAssertionCredentials($cred);


	$params = array( 'singleEvents' => TRUE,
	   				  'timeMin' => (new DateTime())->format(DateTime::RFC3339),
	   				  'timeMax' => (new DateTime())->add(new DateInterval('P' .$maxDays .'D'))->format(DateTime::RFC3339),);

	$events = $service->events->listEvents($calName, $params);

//print_r ($events->getItems());

	$c=0;
	foreach ($events->getItems() as $event)
				{
            $Ergebnis[$c]['Start'] = fmt_gdate($event->getStart());
            $Ergebnis[$c]['Ende'] = fmt_gdate($event->getEnd());
				$Ergebnis[$c]['Beschreibung'] = iconv('UTF-8', 'ISO-8859-1',$event->getSummary());
				$Ergebnis[$c]['Ort'] = iconv('UTF-8', 'ISO-8859-1',$event->getLocation());

				$c++;
				}

	return $Ergebnis;
   }


function fmt_gdate( $gdate )
	{
   if ($val = $gdate->getDateTime())
 		{
	   return (new DateTime($val))->format( 'd.m.Y H:i' );
	  	}
	   else if ($val = $gdate->getDate())
		{
		return (new DateTime($val))->format( 'd.m.Y'). '(ganztags)';
		}
	}

?>

Gruß

Swifty

Hallo,

wo kann ich denn den CalName finden?
‚xxxxxxxxxxxxxxxxxxxxxxxx@group.calendar.google.com‘

:confused:

Aber sicher doch.

Das hat Martin doch hier sehr gut beschrieben.

Grüße,
Doc