Crear evento Api Calendar Google con NodeJS

eventos_calendar_api_1200_628

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.

 

google_calendar_api_npm_install

 

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.

 

google_calendar_api_install_api

 

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.

 

google_calendar_api_error_sin_credencial

 

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:

google_calendar_api_gcp_api

 

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

google_calendar_api_configura_calendar_api

 

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

 

google_calendar_api_datos_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:

 

google_calendar_api_json_descarga

 

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

 

google_calendar_api_json_data

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:

google_calendar_api_ejecucion
google_calendar_api_solicitud_usuario

 

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:

google_calendar_api_cuenta_servicio

 

Llenamos los datos para la cuenta de servicio:

 

google_calendar_api_datos_cuenta_servicio

 

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

 

google_calendar_api_crear_clave_primaria

 

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

google_calendar_api_rule

 

Al editar la cuenta se puede modificar los permisos:

 

google_calendar_api_rule_manage

 

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.

 

google_calendar_api_delete_auth1
google_calendar_api_delete_auth2

 

El código que agregaremos es:

const auth = new google.auth.GoogleAuth({

    keyFile: ‘create_automatic_event.json’,
    scopes: [‘https://www.googleapis.com/auth/calendar.events’,’https://www.googleapis.com/auth/calendar’],    
 
  });
 

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.

 

google_calendar_api_error_version

 

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.

 

google_calendar_api_cambio_version

 

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

 

google_calendar_api_actualiza_version

 

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

 

google_calendar_api_lectura_eventos

 

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:

 

google_calendar_api_calendario_usuario

 

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

 

google_calendar_api_calendario_internos

 

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

 

google_calendar_api_crear_calendario

 

Llenamos los datos y colocamos crear calendario:

 

google_calendar_api_crear_calendario_datos

 

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:

 

google_calendar_api_configura_calendario

 

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

 

google_calendar_api_compartir_calendario

 

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:

 

google_calendar_api_agrega_servicio_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.

google_calendar_api_id_calendario

 

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.

google_calendar_api_crea_evento

 

Ahora ejecutemos nuevamente el proyecto y tenemos la siguiente respuesta.

google_calendar_api_lista_evento

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:

 

google_calendar_api_api_services_credentials

 

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.

google_calendar_api_detalle_cuenta

 

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.

google_calendar_api_agregar_cuenta_gmail

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.

google_calendar_api_gsuite_config

 

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

google_calendar_api_administra_api_terceros

 

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

google_calendar_api_gsuite_crea_app_1

 

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

 

google_calendar_api_gsuite_edita_alcances

 

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.

google_calendar_api_crea_evento_primary
google_calendar_api_evento_calendar_creado

 

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

google_calendar_api_evento_calendar_creado_especifico

 

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.

One thought on “Crear evento Api Calendar Google con NodeJS

  1. Pingback: Crear Usuarios en Gsuite desde Node – Ingenius

Leave a Reply

Your email address will not be published. Required fields are marked *