Google Calendar API - události z vlastního kalendáře

16.12.2015 (aktualizováno 31.1.2017) Pavel PHP, Google

Návodů na API ke Google kalendáři je na webu hodně, všechny ale využívaly OAuth k přístupu do uživatelova kalendáře. Co když ale chcete vybírat data ze svého vlastního kalendáře?

Google Calendar API - události z vlastního kalendáře

Když jsem dělal Androidí aplikaci Rádio Kolej, potřeboval jsem stahovat aktuální pořad, který běží. Tyto data pro jednoduchou editaci a sdílení máme uložené v Google Kalendáři, a stahoval jsem je pomocí RSS feedu. Tomu ale Google v listopadu ukončil podporu a musel jsem najít jiný způsob.

AKTUALIZACE 31.1.2017 - Jak je zmíněno v komentářích, API se mění. Článek jsem aktualizoval pro fungování s APIv3.
Pokud přecházíte z APIv2, prvně si přečtěte článek Přechod z GApi v2 na v3.

OAuth2 Service account

Abychom nemuseli požadovat přístup do uživatelova účtu, musíme vytvořit Service account. Můžete si také prohlédnout anglický návod.

Google Console

Přihlásíme se do Google Console a vytvoříme nový projekt. Klikneme na záložku Service account a vytvoříme nový účet. Zatrhneme, že chceme nový privátní klíč a vybereme formát JSON, v APIv2 se používal P12 formát. A také  povolíme získávat data bez zeptání.

Vytvoření Service account

Stáhne se vám klíč ve formátu JSON, ten si dobře uložte, budete jej ještě potřebovat. Navíc Google privátní klíč neuchovává, takže při ztrátě je nutné vygenerovat nový.

Sdílení kalendáře pro nový servise account

Nyní musíme přidat práva tomuto účtu číst náš kalendář. Otevřeme si Google Kalendář, u požadovaného kalendáře klikneme na šipku napravo od něj a zvolíme Nastavení kalendáře. Poté se přepneme na záložku Sdílet tento kalendář. Zde vložíme stejnou emailovou adresu, která náleží novému servisnímu účtu.

Sdílení kalendáře

Programová část

Vše máme připravené a je potřeba stáhnout Google API a začít jej využívat. Pro APIv2 stačilo stáhnout projekt z GitHubu, nyní ale doporučuji stáhnout projekt přes Composer, jak je popsáno v článku Přechod z GApi v2 na v3. API využívá většího množství závislostí, a ruční stahování a includování třídy by mohlo být dosti složité.

Může se stát, že API bude vyhazovat výjimku o chybě SSL certifikátu, jak se zbavit této chyby je pospáno v článku Přechod z GApi v2 na v3.

// Využít autoloader od Compseru
// require_once 'src/Google/autoload.php';

// V APIv3 se již nepoužívá - Emailová adresa z Google Console
// $email_address = 'radiokolej-calendar@e-observer-114521.iam.gserviceaccount.com';
// Cesta k souboru se staženým klíčem
$key_file_location = 'rk.json';    

$client = new Google_Client();
$client->setApplicationName("RadioKolej-Calendar");
$client->setAuthConfig($key_file_location);
$client->useApplicationDefaultCredentials();
$client->addScope([
    Google_Service_Calendar::CALENDAR_READONLY
]);
$service = new Google_Service_Calendar($client);

/* Parametr je ID kalendáře ze kterého chceme číst
Druhý parametr určuje bližší informace ohledně hledaných eventů
*/
$calendarList = $service->events->listEvents("r7s7lvvalpj1tvkntmipfgb7o0@group.calendar.google.com", array(
    'orderBy' => 'startTime', // seřadíme podle začátku události
    'singleEvents' => true, // U pakujících se události se vypíšou všechny konání
    'timeMin' => date("Y-m-d\\TH:i:sP"), // Pouze události které ještě neskončily
    'maxResults' => 5 // Max 5 výsledků, pro mě dostačující
    ))->getItems();

foreach ($calendarList as $event) {
    $startTimeStamp = strtotime($event->getStart()->getDateTime());
    // Uložíme,nejvíce zanořenou událost
    if($startTimeStamp < time()){
        $actualShow = $event->summary;
    }else{
        break;
    }
}

ID kalendáře které vkládám v metodě listEvents najdeme v Nastavení kalendářePodrobnosti kalendáře.

V kalendáři existují události, které se překrývají vůči hlavní Události jako Kultura s Terkou se v kalendáři překrývají s hlavním programem. Druhý cyklus mi vybere nejvíce zanořenou událost. 

Nemusíte řešit časová pásma. Kalendář vše přepočítá na hlavní časové pásmo a vrátí vám správný čas.


Podělte se s námi v komentáři, pokud jste řešili podobný problém. Nejlepší článek ze kterého jsem čerpal najdete na Daimto.com

Přidat komentář

Právě odpovídáte na existující komentář. Zrušit

Komentáře

Lukáš Zelenka

25.9.2016 09:28

Ahoj,

děkuju za ukázku využití Google API. Povídání ohledně toho jak to funguje mě odrazilo k tomu využít kalendář podobným způsobem a to pro rozpis ledové plochy jednoho zimního stadionu. Nicméně už uběhl nějaký čas a článek by si zasloužil aktualizaci. Takže pokud někdo podle tohoto návodu bude postupovat, tak zjistí že P12 je deprecated. Proto doporučuji toto:

1) Místo P12 generujte JSON

2) Stažení API můžete provést přes composer a to příkazem: composer require google/apiclient

3) Je třeba upravit i script, aby využil JSON místo P12. Proto $key_file_location upravte na cestu k souboru JSON.

4) Autentikace bude probíhat jiným způsobem a proto řádek 8 - 15 je třeba nahradit tímto:

$client = new Google_Client();
$client->setApplicationName("hc-rakovnik-cz");
$client->setAuthConfig($key_file_location);
$client->useApplicationDefaultCredentials();
$client->addScope('https://www.googleapis.com/auth/calendar.readonly';);

$service = new Google_Service_Calendar($client);

Důležité je zmínit Scope, který říká co budeme dělat. V tomto případě jsem vybral službu kalendáře a to jen pro čtení.

Odpovědět

Tomáš

24.5.2017 14:44

Zdravím,

mám vygenerovaný JSON soubor, ale nevím jak provést autentifikaci z javascriptu a zatím jsem nic nenašel. Netušíte?

Odpovědět

Pavel

https://www.kutac.cz/blog/ 24.5.2017 16:39

Bohužel netuším, jediné co jsem používal tak je právě v rámci PHP a kolega v Pythonu. S JavaScriptem ale ne

Novinky z blogu

Vlastní eventy v Javascriptu

Eventy jsou s Javascriptem spjaty už od jeho počátků. Přesto, že jich v základu obsahuje nepřeberné množství, je někdy užitečné vytvořit si eventy vlastní. V tomto článku se...

Další články