Leggere un file .ics da Google Calendar e salvare le informazioni in un file JSON

- Pubblicato in coding di - Permalink

Leggere un file .ics da Google Calendar e salvare le informazioni in un file JSON

Codice base con parsing di file .ics

<?php

function icsParse($icsUrl = "")
{
    if (!empty($icsUrl)) {
        $icsContent = file_get_contents($icsUrl);
        if (!$icsContent) {
            die("Impossibile leggere il calendario.");
        }

        $icsContent = preg_replace("/\r?\n[ \t]+/", "", $icsContent);

        $events = $event = [];
        $lines = explode("\n", $icsContent);
        $isEvent = false;

        foreach($lines as $line) {
            $line = trim($line);

            if ($line === "BEGIN:VEVENT") {
                $isEvent = true;
                $event = [];
            } elseif ($line === "END:VEVENT") {
                $isEvent = false;
                $events[] = $event;
            } elseif ($isEvent) {
                if (strpos($line, ':') !== false) {
                    list($key, $value) = explode(':', $line, 2);
                    $event[$key] = str_replace('\\,', ',', $value);
                }
            }
        }
    }

    return $events;
}

$calendarUrl = "https://calendar.google.com/calendar/ical/c_**************@group.calendar.google.com/public/basic.ics";

$vnt = icsParse($calendarUrl);

$exp = file_put_contents('calendar.json', json_encode($vnt, JSON_PRETTY_PRINT));
echo ($exp) ? "File JSON creato con successo con ".count($vnt)." eventi.\n" : "Errore nella creazione del file JSON";

?>

Se abbiamo un link di embed di Google Calendar e non un link diretto al file ICS, dobbiamo trasformarlo in un link pubblico ICS, perché il link di embed non restituisce direttamente gli eventi in formato leggibile dal server.

Ottenere il link ICS dal calendario Google

  1. Apri il link nel browser.
  2. Sul lato destro del calendario, clicca su Impostazioni -> Integrate calendar.
  3. Troverai una sezione Indirizzo segreto in formato iCal o Public URL to this calendar.
  4. Copia il link che termina in .ics. Sarà simile a quello indicato nel codice di esempio.

Se il calendario non può essere reso pubblico o non puoi ottenere il link ICS, allora non è possibile accedere direttamente ai dati con PHP senza autenticazione.

L’alternativa è usare l’API di Google Calendar con OAuth o un account di servizio, perché il link di embed è pensato solo per il browser, non per un fetch diretto.

Utilizzare l’API di Google Calendar

  1. Vai su Google Cloud Console.
  2. Crea un progetto.
  3. Abilita Google Calendar API.
  4. Se il calendario è gestito a livello aziendale/privato, crea un Service Account.
  5. Condividi il calendario con l’email del Service Account settando almeno il permesso Visualizza tutti i dettagli dell’evento.
  6. Scarica il JSON delle credenziali.

Codice base per utilizzare le Google Calendar API con Autenticazione

<?php
require 'vendor/autoload.php';

function manageCalendarClient()
{
    $client = new Google_Client();
    $client->setApplicationName('Google Calendar');
    $client->setAuthConfig('service-account.json');
    $client->setScopes([Google\Service\Calendar::CALENDAR_READONLY]);
    return $client;
}

function queryCalendar($calendarId)
{
    $client = manageCalendarClient();
    $service = new Google\Service\Calendar($client);

    $events = $service->events->listEvents($calendarId, [
        'maxResults'    =>  250,
        'singleEvents'  =>  true,
        'orderBy'       =>  'startTime',
        'timeMin'       =>  date('c'),
    ]);

    $jsonEvents = [];
    foreach ($events->getItems() as $event) {
        $jsonEvents[] = [
            'summary'       =>  $event->getSummary(),
            'start'         =>  $event->getStart()->getDateTime() ?: $event->getStart()->getDate(),
            'end'           =>  $event->getEnd()->getDateTime() ?: $event->getEnd()->getDate(),
            'description'   =>  $event->getDescription(),
        ];
    }

    return $jsonEvents;
}

$calendarId = 'c_**************@group.calendar.google.com';
$data = queryCalendar($calendarId);

$exp = file_put_contents('calendar.json', json_encode($data, JSON_PRETTY_PRINT));
echo ($exp) ? "File JSON creato con successo con ".count($data)." eventi.\n" : "Errore nella creazione del file JSON";

?>
→