Automatiza tus eventos y recordatorios desde una aplicación en NodeJS, agenda integrantes, configura tiempo de alarma, nombre del evento, lugar del evento y mucho más.
porqué usar el Api calendar google?
Quien no se a visto en un punto de un desarrollo con la necesidad de agendar un recordatorio o generar una alarma
tal vez para la creación de un producto, al modificar un producto, antes que expire un producto o simplemente recordar algo que debe realizarse posteriormente en algún tiempo.
COMO FUNCIONA
Aprovechemos las ventajas de las herramientas que nos presenta Google en este caso el API de Google que nos permite realizar muchas actividades con el calendario una de esas el agendamiento, existen varias maneras de hacerlo pero para todas estas tenemos que tener una autorización para poder interactuar con sus Apis, utilizaremos en este caso la autorización OAuth 2.0.
ReQUISITOS PREVIOS
- Npm
- Node
- Acceso al GCP (Google Cloud)
CREAR EL PROYECTO NODE
Crearemos el proyecto de Node para esto utilizaremos una carpeta llamada Apis_gmail_calendar. Ingresamos a esa carpeta desde la consola en Linux o si estás en windows puedes utilizar GitBash o WindowsPowerShell, para iniciar digitamos:
npm init
Nos solicitará la información del proyecto, ingresamos la información y presionamos continuar.

Esto nos creará un archivo llamado package.json el cual contiene la configuración del paquete de nuestro proyecto. Ahora instalaremos la api de Google, con el siguiente comando:
npm install googleapis@39 –save
npm install googleapis@68 –save
En este caso podemos decir la versión del api que utilizaremos para este ejemplo estamos utilizando la 68.

Ahora crearemos el archivo index.js el cual nos permitirá ejecutar nuestra aplicación, podemos copiar el código que nos adjunta Google este código nos solicitará la información o credenciales que autoricen la conexión.
Si ejecutamos el comando
node index.js
Nos mostrará el siguiente mensaje.

En este caso no funciona porque no tenemos las credenciales de la cuenta que vamos a utilizar del Gmail, para esto accedemos a las configuraciones de usuarios de nuestro Gmail pero necesitamos realizarlo desde la configuración de nuestro GCP.
Ingresamos a la consola y buscamos la opción Calendar Api:

Damos clic para activarle y luego presionamos en Administrar o [Manage].

De la pantalla que nos muestra vamos a la opción de credenciales.

Presionamos en crear credenciales la cual nos solicitará información del tipo de aplicación y le colocamos un nombre.
Luego de creada la Api podemos descargarla en formato JSON le damos clic en editar:

Copiamos el objeto descargado a la carpeta del proyecto y cambiamos el nombre a credentials.json la estructura del json descargado es la siguiente:

Ejecutamos el proyecto nuevamente, como el proyecto no es web lo que nos mostrará es una url que debemos colocar en un browser para que nos muestre la pantalla de autorización del usuario de gmail y así nos permitirá acceder a la api, esto devolverá un código que nos solicita la aplicación:


De esa manera podemos probar la funcionalidad del ejemplo que nos entrega Google, es muy útil hacerlo así para acceder a herramientas como calendarios, siempre que lo estemos usando dentro de una web en la cual se le pueda mostrar la pantalla para Login del usuario pero cuando queremos acceder al calendario de Gmail desde un api del lado del servidor esto no es útil porque el servidor no puede solicitar esas contraseñas para eso vamos a impersonalizar o suplantar la cuenta de un usuario.
Creando credenciales de servicio
Vamos a crear las credenciales de servicio:

Llenamos los datos para la cuenta de servicio:

Una vez creada la cuenta vamos al menú claves o Key y presionamos crear nueva clave:

Nos descargamos la nueva clave y la copiamos al proyecto, y nos dirigimos a la opción IAM & Admin para agregarle funciones a las credenciales en este caso agregamos la función de Creador de tokens de cuenta de servicio

Al editar la cuenta se puede modificar los permisos:

Vamos a modificar el index.js para que funcione con las credenciales de servicio, eliminamos todo el grupo de autenticación y agregamos la autenticación de Google que no requiere el browser.


El código que agregaremos es:
const auth = new google.auth.GoogleAuth({
Nos quedamos solamente con la función que lista los eventos [listEvents], entonces llamamos a esa función y como parámetro enviamos la función auth realizada anteriormente.

En el caso que nos muestre el mensaje de error puede ser la versión del api de Google le modificamos la versión en el package.json.

Luego vamos a ejecutar el comando npm install para que actualice la librería.

Ejecutamos ahora el comando node index.js el cual nos muestra.

El mensaje que tenemos es que no existe eventos con esa cuenta, pero la pregunta aquí radica en ¿Cuál es el calendario de una cuenta de servicio?.
Bueno una cuenta de servicio como la que hemos creado no tiene un calendario asociado, en este caso lo que podemos hacer es invitar a nuestra cuenta de servicio a un calendario existente pero en el mismo dominio para eso vamos acceder a la cuenta de un usuario de Gmail y vamos a la opción de calendario:

Desde el calendario tenemos la lista de calendarios que tiene cada cuenta:

Vamos a crear un nuevo calendario al cual le llamaremos Calendario Lecturas:

Llenamos los datos y colocamos crear calendario:

Ahora que tenemos el calendario listo vamos a darle accesos a ese calendario a nuestra cuenta de servicio para esto necesitamos ir la configuración del calendario que creamos:

Luego nos dirigimos a la opción compartir con personas específicas y damos clic en agregar personas específicas:

En la siguiente pantalla agregamos la cuenta de servicio, para saber que email es el que está asociado a la cuenta de servicio podemos hacerlo editando el archivo JSON de las credenciales en la opción client_email:
{
“type”:”service_account”,
“project_id”:”—“,
“private_key_id”:”–“,
“private_key”:”–“,
“client_email”:”credenciales-calendarapi—“,
“client_id”:”–“,
“auth_uri”:”https://accounts.google.com/o/oauth2/auth”,
“token_uri”:”https://oauth2.googleapis.com/token”,
“auth_provider_x509_cert_url”:”https://www.googleapis.com/oauth2/v1/certs”,
“client_x509_cert_url”:”https://www.googleapis.com/robot/v1/metadata/x509/—“
}
Utilizaremos la opción o etiqueta client_email y la agregamos dentro de este calendario:

En la misma configuración del calendario vamos a buscar el ID del calendario este lo agregaremos dentro del archivo index.js en calendarID.

Al ejecutar nuevamente el proyecto veremos que nos devuelve la respuesta de que no hay eventos, en este caso ya sabemos cual es el calendario del que estamos leyendo los eventos creemos un evento en ese calendario para ver si funciona todo correctamente.

Ahora ejecutemos nuevamente el proyecto y tenemos la siguiente respuesta.

CREAR EVENTO GOOGLE CALENDAR
Ahora vamos a crear un evento desde la aplicación, la idea principal del post que fue agendar eventos desde node a diferentes integrantes, vamos a crear en nuestro index.js una variable llamada event que contendrá lo siguiente:
var event = {
‘summary’: ‘Google Suplantation Example 2021’,
‘location’: ‘800 Howard St., San Francisco, CA 94103’,
‘description’: ‘A chance to hear more about Google’s developer products.’,
‘start’: {
‘dateTime’: ‘2021-06-06T18:00:00-05:00’,
‘timeZone’: ‘America/Guayaquil’,
},
‘end’: {
‘dateTime’: ‘2021-06-06T19:00:00-05:00’,
‘timeZone’: ‘America/Guayaquil’,
},
‘recurrence’: [
‘RULE:FREQ=DAILY;COUNT=2’
],
‘attendees’: [
{’email’: ‘polivionofa@gmail.com’},
],
‘reminders’: {
‘useDefault’: false,
‘overrides’: [
{‘method’: ’email’, ‘minutes’: 24 * 60},
{‘method’: ‘popup’, ‘minutes’: 10},
],
},
};
Vamos también a agregar una función llamada createEvent la cual recibirá como parámetro el auth esto como lo hacíamos con ListEvent y también comentemos la llamada a ListEvent. Ejecutemos el proyecto y tenemos el siguiente resultado:
There was an error contacting the Calendar service: Error: Service accounts cannot invite attendees without Domain-Wide Delegation of Authority
Aquí es donde necesitaremos suplantar o impersonalizar una cuenta de servicio el mensaje nos dice que tenemos que habilitar la opción Domain-Wide Delegation entonces arreglemos este problema. Desde el GCP vamos a la opción de API:

Luego en la cuenta de servicio mostramos la opción Show Domain-wide delgation de la pestaña detalles o detail y la habilitamos anotamos el Unique ID que lo utilizaremos mas adelante.

Ahora en la pestaña permisos o permissions agregaremos un nuevo miembro como Owner en eete caso será la cuenta del usuario de gmail que queremos suplantar.

CONFIGURANDO DESDE EL GSUITE
Nos dirigimos ahora al Gsuite como administrador porque tenemos que realizar unas configuraciones más para que se pueda suplantar la cuenta. En el menú seleccionaremos Configuración.

Nos dirigimos a la opción de Controles de APIs y luego presionamos en Administra el acceso de APPs de terceros.

Aquí vamos a crear una nueva App, lo que tenemos que ingresar es el ID de cliente.

Al presionar en buscar nos va devolver el nombre del proyecto del workspace para esa api de servicio. Ahora vamos a controles de API nuevamente y en la opción delegación de todo el dominio, presionamos en Administrar la delegación de todo el dominio aquí nos mostrará el id de cliente que configuramos ahora vamos a darle alcances para esto presionamos Editar y colocamos las siguientes urls.
https://www.googleapis.com/auth/calendar
https://www.googleapis.com/auth/calendar.events
https://www.googleapis.com/auth/admin.directory.resource.calendar

Ahora regresamos al index.js es muy importante agregar a la constante de auth debajo del scopes lo siguiente.
clientOptions: { subject: ‘calendar@tudominio.com’ },
Ahora nos dirigimos a nuestro proyecto, en la función de createEvent podemos modificar también el calendarID como vimos en la parte anterior, pero le vamos a dejar en el primary y ejecutemos el proyecto. Ahora tendremos el resultado Event created, nos dirigimos al calendario para buscar si se creo el evento.


En el caso que queremos que agende por un calendario específico modificamos el calendarID con el del calendario que creamos anteriormente.

Y listo finalmente logramos crear un evento, en la variable evento podemos configurar muchos parámetros más recomiendo que revisen los detalles en eventos calendar google no olvides dejarnos tus dudas o experiencias con esta implementación y no olvides suscribirte a nuestro boletín.