Insertar un evento en un calendario público de Google con PHP y la API v3

Próximamente las API v1 y v2 de Google Calendar dejarán de estar disponibles por lo que debes usar la versión v3 para tus proyectos. En este artículo vamos a tratar de detallar lo máximo posible como insertar un evento en un calendario público de Google usando PHP, la nueva API y todo sin necesitad del consentimiento del usuario (no hay nada malo 😉 ).

APIv2

Nos hemos basado principalmente en las indicaciones de este artículo, sobre el que hemos realizado ligeras modificaciones debido a que la librería que utiliza (y que indicamos a continuación) ha sufrido cambios y en su ejemplo (y otros muchos que encontrarás) las llamadas a ciertos métodos han quedado obsoletas.

Los pasos que debes realizar antes de programar son:

1. Descarga la librería PHP.

Hemos utilizado la librería PHP google-api-php-client  cuya documentación está disponible aquí.  Como se indica, los requisitos que debe tener el servidor son:

  • PHP version 5.2.1 or greater.
  • The JSON PHP extension.
  • Support for a writeable file system or Memcache.

2. En la web de Developers de Google tienes que:

2.1. Crear un proyecto. El id del proyecto lo tendrás que usar en el script.

Crear proyecto developer google
2.2. Habilitar en ese proyecto la API del Calendar

apiON

 

2.3. Crear ID de cliente nuevo del tipo Servicio. 

serviceaccount

Al crearlo automáticamente se te descargará la clave privada que deberás guardar a buen recaudo en tu servidor. Posteriormente se puede generar también.

p12

 

2.4. Toma nota de los datos de la Cuenta de Servicio creada. Cuando pinches en “De acuerdo” verás que además se te habrá creado un id de cliente, una dirección de correo de developer y una huella digital de clave pública. Para este caso, utilizarás el id de cliente y la dirección de correo tanto en el código como en las opciones de compartir del calendario donde queremos insertar el evento.

credenciales

 

3. Entra en http://calendar.google.com . Aquí tienes que:

 

3.1 Entrar a la configuración del calendario.

Configura el calendario donde quieres insertar el evento como público y MUY IMPORTANTE añade el correo de developer (el del tipo @developer.gserviceaccount.com) en el apartado “compartir con determinadas personas” con permiso del tipo “Realizar cambios en eventos”. Si no haces esto te encontrarás que el script lanzará el error:

Fatal error: Uncaught exception 'Google_Service_Exception' with message 'Error calling POST https://www.googleapis.com/calendar/v3/ca .....

configuracionCalendario

 

 

compartirCalendario

 

3.2 Obtener el ID del calendario.

Para ello tienes que volver a entrar a la configuración del calendario, pero esta vez a la parte de “Detalles del calendario”.

idCalendar

 

En este punto ya tenemos todo lo que vamos a necesitar en nuestro script PHP:

 

<?php
ini_set('display_errors', 1);
error_reporting(E_ALL);

set_include_path('google-api-php-client/src'); //librería obtenida en el punto 1
require_once 'Google/Client.php';
require_once 'Google/Service/Calendar.php';

$ID_PROYECTO = "proyecto-calendar"; //obtenido en punto 2.1
$ID_CLIENTE = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX.apps.googleusercontent.com"; //obtenido en punto 2.3, 2.4
$RUTA_FICHERO_P12 = "RUTA_A_FICHERO_P12/tufichero.p12"; //obtenido en punto 2.3
$EMAIL_DE_DEVELOPER = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX@developer.gserviceaccount.com"; //punto 2.3 y 2.4
$CALENDAR_ID = "XXXXXXXXXXXXXXXXXXXXXXXX@group.calendar.google.com"; //obtenido en punto 3.2

try{

   $client = new Google_Client(array('use_objects' => true));

   $client->setApplicationName($ID_PROYECTO);
   $client->setClientId($ID_CLIENTE);
   $key = file_get_contents($RUTA_FICHERO_P12);

   $credentials = new Google_Auth_AssertionCredentials(
				$EMAIL_DE_DEVELOPER,
				array("https://www.googleapis.com/auth/calendar"),
				$key,
				"notasecret"
				);

   $client->setAssertionCredentials($credentials);

   $service = new Google_Service_Calendar($client);

   $event = new Google_Service_Calendar_Event;

   $event->setSummary('Event nuevo');
   $event->setLocation('en un sitio');

   $start = new Google_Service_Calendar_EventDateTime();
   $start->setDateTime('2014-10-02T19:00:00.000+01:00');
   $start->setTimeZone('Europe/Madrid');
   $event->setStart($start);

   $end = new Google_Service_Calendar_EventDateTime();
   $end->setDateTime('2014-10-02T19:25:00.000+01:00');
   $end->setTimeZone('Europe/Madrid');
   $event->setEnd($end);

   $new_event = null;
   $new_event_id = "";

   $new_event = $service->events->insert($CALENDAR_ID, $event);

   if($new_event!=null){

      $new_event_id= $new_event->getId();
      $event = $service->events->get($CALENDAR_ID, $new_event_id);

      if ($event != null) {
	   echo "<br/>Inserted:";
	   echo "<br/>EventID=".$event->getId();
	   echo "<br/>Summary=".$event->getSummary();
	   echo "<br/>Status=".$event->getStatus();
      }
	    else{
	   	   echo "No se ha podido obtener la información del evento";
         	}			   
    }else{
         	echo "No se ha podido insertar el evento";
	 }

   } 
   catch (Google_ClientException $e) {
        echo "Caught Google_ClientException:";
		print_r($e);
   }
   catch (Google_ServiceException $e) {
        echo "Caught Google_ServiceException:";
		echo "<pre>".print_r($e,true)."</pre>";
   }

?>

Esperamos haberte ahorrado algo de tiempo 🙂

Deja un comentario