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í.
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.
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áře a Podrobnosti 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
K tomuto článku již není možné přidávat další komentáře
Komentáře
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í.
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?
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