Recupera los datos de un sitio web con la macro de ONLYOFFICE

18 julio 2023By Sergey

En nuestro artículo anterior, creamos una macro de ONLYOFFICE completamente funcional a partir de una referencia VBA que nos envió uno de nuestros usuarios. Hoy nos gustaría llevarlo a un nivel superior y añadir un poco de funcionalidad de la API Whois a la misma.

Recupera los datos de un sitio web con la macro de ONLYOFFICE

Acerca de Whois

Whois, abreviatura de “Who is?” (¿Quién es?) es un protocolo esencial de Internet que permite a los usuarios acceder a información exhaustiva sobre nombres de dominio y direcciones IP. Sirve como valioso recurso para recuperar detalles relacionados con el propietario registrado, los contactos administrativos y técnicos, las fechas de registro y expiración, los servidores de nombres de dominio e incluso la organización responsable del registro del dominio.

Acceso a la API

Para acceder a la API de Whois, utilizaremos una solución proporcionada por la API de Ninijas.

El sitio web de la API de Ninjas es una plataforma en línea que ofrece una variedad de recursos y conocimientos sobre las API. También proporciona una selección de API gratuitas que los desarrolladores pueden utilizar en sus proyectos. Este sitio web pretende ser un destino útil para los desarrolladores que buscan información, herramientas y ejemplos prácticos para mejorar sus habilidades de desarrollo de API.

La plataforma ofrece fragmentos de código que ayudan a realizar solicitudes HHTP:

var domain = 'example.com'
$.ajax({
    method: 'GET',
    url: 'https://api.api-ninjas.com/v1/whois?domain=' + domain,
    headers: { 'X-Api-Key': 'your_API_key'},
    contentType: 'application/json',
    success: function(result) {
        console.log(result);
    },
    error: function ajaxError(jqXHR) {
        console.error('Error: ', jqXHR.responseText);
    }
});

Creación de la macro

Ahora incorporemos esta solicitud .ajax a nuestra macro. Las primeras líneas de nuestro código permanecen intactas. Excepto la parte en la que recuperamos el valor de la celda A4. Esta vez basta con el valor de la celda A2:

var sheet = Api.GetActiveSheet();
var domainValue = sheet.GetRange("A2").GetValue();
var dateRange = sheet.GetRange("D1:D10");

A continuación, iniciamos una solicitud GET al punto final de la API especificado en la variable apiUrl:

$.ajax({
  method: 'GET',
  url: apiUrl,
  headers: { 'X-Api-Key': 'your_API_key' },
  contentType: 'application/json',
  success: function(result) {
    console.log(result);

Una vez obtenida una respuesta satisfactoria de la API, procedemos a procesar los datos. Convertimos las marcas de tiempo UNIX para la fecha de creación, la fecha de vencimiento y la fecha de actualización en formatos legibles por humanos utilizando el objeto Date de JavaScript. Estas fechas formateadas se almacenan en variables como formattedCreationDate, formattedExpirationDate y formattedUpdatedDate:

 // Convert creation_date to a more readable format
    var unixTimestamp = result.creation_date;
    var creationDate = new Date(unixTimestamp * 1000);
    var formattedCreationDate = creationDate.toDateString();
    // Convert expiration_date to a more readable format
    var expirationTimestamp = result.expiration_date;
    var expirationDate = new Date(expirationTimestamp * 1000);
    var formattedExpirationDate = expirationDate.toDateString();
    // Convert updated_date to a more readable format
    var updatedTimestamp = result.updated_date;
    var updatedDate = new Date(updatedTimestamp * 1000);
    var formattedUpdatedDate = updatedDate.toDateString();

Para rellenar la hoja de cálculo con la información de dominio recuperada, utilizamos un bucle forEach en la variable dateRange. Este bucle realiza una iteración a través de cada celda del rango especificado (D1:D10). Dentro del bucle, recuperamos la fila actual utilizando range.GetRow() y la almacenamos en la variable row:

var oRange = sheet.GetRange("E" + row);

El valor actual de la celda se obtiene utilizando range.GetValue() y se almacena en la variable currentValue:

var currentValue = range.GetValue();

Basándonos en el valor de currentValue, utilizamos una sentencia switch para determinar la acción apropiada. Por ejemplo, si currentValue es “nombre_dominio”, establecemos el valor de result.nombre_dominio en la celda correspondiente utilizando oRange.SetValue(result.nombre_dominio):

    switch (currentValue) {
        case "domain name":
          oRange.SetValue(result.domain_name);
          break;

Del mismo modo, gestionamos otros casos como registrador, servidor whois, fecha de actualización, fecha de creación, fecha de vencimiento, nombres de servidores y dnssec:

   oRange.SetValue(result.registrar);
          break;
        case "whois server":
          oRange.SetValue(result.whois_server);
          break;
        case "updated date":
          oRange.SetValue(formattedUpdatedDate);
          break;
        case "creation date":
          oRange.SetValue(formattedCreationDate);
          break;
        case "expiration date":
          oRange.SetValue(formattedExpirationDate);
          break;
        case "name servers":
          oRange.SetValue(result.name_servers.join(", "));
          break;
        case "dnssec":
          oRange.SetValue(result.dnssec);
          break;
        default:
          // Handle other cases if needed
          break;
      }
    });

Por último, definimos una función de recarga que invoca el método Api.asc_calculate(Asc.c_oAscCalculateType.All) para recalcular la hoja de cálculo una vez finalizado el bucle. Esto asegura que los nuevos valores se reflejen en la hoja de cálculo:

    reload(); // Invoke reload function after the loop is completed
  },
  error: function ajaxError(jqXHR) {
    console.error('Error: ', jqXHR.responseText);
  }
});
function reload() {
    let reloadInterval = setInterval(function() {
        Api.asc_calculate(Asc.c_oAscCalculateType.All);
    }, 100);
}

El código completo de la macro es el siguiente:

(function()
{
  var sheet = Api.GetActiveSheet();
var domainValue = sheet.GetRange("A2").GetValue();
var dateRange = sheet.GetRange("D1:D10");
var apiUrl = 'https://api.api-ninjas.com/v1/whois?domain=' + domainValue;
$.ajax({
  method: 'GET',
  url: apiUrl,
  headers: { 'X-Api-Key': 'your_API_key' },
  contentType: 'application/json',
  success: function(result) {
    console.log(result);
    // Convert creation_date to a more readable format
    var unixTimestamp = result.creation_date;
    var creationDate = new Date(unixTimestamp * 1000);
    var formattedCreationDate = creationDate.toDateString();
    // Convert expiration_date to a more readable format
    var expirationTimestamp = result.expiration_date;
    var expirationDate = new Date(expirationTimestamp * 1000);
    var formattedExpirationDate = expirationDate.toDateString();
    // Convert updated_date to a more readable format
    var updatedTimestamp = result.updated_date;
    var updatedDate = new Date(updatedTimestamp * 1000);
    var formattedUpdatedDate = updatedDate.toDateString();
    dateRange.ForEach(function(range) {
      var row = range.GetRow();
      var oRange = sheet.GetRange("E" + row);
      var currentValue = range.GetValue();
      switch (currentValue) {
        case "domain name":
          oRange.SetValue(result.domain_name);
          break;
        case "registrar":
          oRange.SetValue(result.registrar);
          break;
        case "whois server":
          oRange.SetValue(result.whois_server);
          break;
        case "updated date":
          oRange.SetValue(formattedUpdatedDate);
          break;
        case "creation date":
          oRange.SetValue(formattedCreationDate);
          break;
        case "expiration date":
          oRange.SetValue(formattedExpirationDate);
          break;
        case "name servers":
          oRange.SetValue(result.name_servers.join(", "));
          break;
        case "dnssec":
          oRange.SetValue(result.dnssec);
          break;
        default:
          // Handle other cases if needed
          break;
      }
    });
    reload(); // Invoke reload function after the loop is completed
  },
  error: function ajaxError(jqXHR) {
    console.error('Error: ', jqXHR.responseText);
  }
});
function reload() {
    let reloadInterval = setInterval(function() {
        Api.asc_calculate(Asc.c_oAscCalculateType.All);
    });
}
})();

Ahora, ejecutemos nuestra macro para ver cómo funciona.

Esperamos que esta macro sea una herramienta útil para tus proyectos, permitiéndote recuperar y mostrar eficientemente detalles importantes del dominio. La flexibilidad y funcionalidad ofrecida por la API de ONLYOFFICE abre grandes posibilidades para la personalización y automatización de tus tareas.

Te animamos a explorar el potencial de la API de ONLYOFFICE y dar rienda suelta a tu creatividad mediante la creación de tus propias macros. Si tienes alguna pregunta o idea para compartir, no dudes en dejar comentarios o ponerte en contacto con nosotros. Estamos abiertos a escuchar tus ideas y deseamos colaborar contigo. Esperamos que tengas mucha suerte.