Domine a API etechpt.com: 3 métodos NodeJS para consultas DNS

Neste guia, mostrarei como utilizar a API etechpt.com com NodeJS para averiguar os registros DNS de qualquer domínio.

Criaremos um script simples que, ao ser executado, mostrará o endereço IP do servidor de busca do Google.

Este script empregará a API de consulta DNS da etechpt.com.

Para desenvolvê-lo, exploraremos três métodos: o primeiro empregará o módulo https nativo do NodeJS; o segundo, o módulo node-fetch; e, por fim, o terceiro utilizará a biblioteca cliente axios.

O que é a API etechpt.com?

A API etechpt.com disponibiliza conjuntos de APIs REST para realizar testes de desempenho de websites, DNS e medições de segurança. Você poderá realizar tarefas como capturar screenshots, gerar PDFs, fazer web scraping, escanear portas e muito mais.

Requisitos

Para acompanhar este tutorial, é necessário ter conhecimento de JavaScript, incluindo Promises e a sintaxe ES6. Em relação ao software, você precisará ter o NodeJS e um editor de texto, como o Visual Studio Code, instalado.

Será necessário possuir uma conta na etechpt.com para obter uma chave de API para autenticação ao realizar requisições. Para isso, acesse a página inicial da API e crie uma conta gratuita.

Após a criação da conta, você será direcionado ao painel, onde encontrará sua chave de API.

Construindo o Projeto

Para começar, crie uma pasta para o projeto e abra-a em um terminal de sua preferência. Em seguida, execute o comando abaixo.

npm init -y

O comando acima inicializará o diretório do projeto como um projeto NodeJS.

Logo após, execute o comando abaixo, que instalará todas as dependências do nosso projeto.

npm install dotenv axios node-fetch

Com as dependências instaladas com sucesso, crie três arquivos JavaScript na pasta raiz do projeto: vanilla.js, with-axios.js e with-fetch.js, além de um arquivo .env para armazenar nossas variáveis ambientais.

No final, a estrutura da raiz do projeto deverá ser semelhante a:

Agora, abra o arquivo .env e adicione sua chave de API da etechpt.com com a seguinte linha de código:

API_KEY=<api key>

Substitua <api key> por sua chave de API real.

vanilla.js

O NodeJS possui os módulos http e https nativos, que podemos utilizar para efetuar requisições do cliente. Vamos empregar essa abordagem inicialmente.

Abra o arquivo vanilla.js e insira as seguintes linhas de código no início para importar as dependências do projeto:

import { request } from "https";
import { config } from "dotenv";

Em seguida, vamos invocar a função config() para carregar as variáveis ambientais. Posteriormente, armazenaremos a chave de API e o nome do host em variáveis.

config();

const apiKey = process.env.API_KEY;
const host="google.com";

Ao invocar a função de solicitação para iniciar uma requisição HTTP no NodeJS, será necessário fornecer opções para o host e o endpoint ao qual desejamos nos conectar, o método HTTP que utilizaremos e os cabeçalhos da solicitação. Então, vamos criar uma variável para armazenar essas opções.

const options = {
  hostname: "api.etechpt.com.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

Até agora, o código no arquivo vanilla.js está assim:

import { request } from "https";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host="google.com"

const options = {
  hostname: "api.etechpt.com.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

Agora podemos proceder para invocar a função request, passando o objeto options como parâmetro:

const req = request(options, response => {

  // Incluiremos os manipuladores de resposta aqui

});

Como pode ser observado, a função request recebe dois argumentos. O primeiro é o objeto options que definimos anteriormente. O segundo é uma função de retorno de chamada que manipulará a resposta do servidor. Dentro da função de retorno de chamada, podemos adicionar listeners de eventos para quando o servidor enviar dados, concluir o envio de dados ou enviar um erro.

Para adicionar os diferentes manipuladores de resposta, inclua as seguintes linhas de código dentro da função de retorno de chamada:

let data = "";

response.on("data", chunk => {
  data += chunk;
});

response.on("end", () => {
  console.log(JSON.parse(data).data.A);
});

response.on("error", error => {
  console.log(error);
});

A variável data é simplesmente uma string onde iremos armazenar a resposta JSON do servidor à medida que ela é transmitida de volta para nós.

Para realmente armazenar os dados, vamos escutar o evento on data do objeto response. Sempre que esse evento for acionado, anexaremos o bloco de dados enviado pelo servidor à variável data.

Então, para finalmente utilizar os dados, vamos escutar o evento on end no objeto response. Este será acionado quando todos os dados forem enviados do servidor e tiver finalizado sua resposta.

Finalmente, escutaremos por erros e os registraremos no console, caso surjam.

Portanto, a chamada para a função request deverá ter esta aparência:

const req = request(options, response => {

  let data = "";

  response.on("data", chunk => {
    data += chunk;
  });

  response.on("end", () => {
    console.log(JSON.parse(data).data.A);
  });

  response.on("error", error => {
    console.log(error);
  });

});

Por último, precisamos escrever alguns dados no corpo da solicitação e encerrar a solicitação.

req.write(JSON.stringify({ url: host, types: ["A"] }));
req.end();

No final, o arquivo deve se apresentar da seguinte forma:

import { request } from "https";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host="google.com"

const options = {
  hostname: "api.etechpt.com.com",
  path: "/dnsrecord",
  method: "POST",
  headers: {
    "Content-Type": "application/json",
    "x-api-key": apiKey,
  },
};

const req = request(options, response => {

  let data = "";

  response.on("data", chunk => {
    data += chunk;
  });

  response.on("end", () => {
    console.log(JSON.parse(data).data.A);
  });

  response.on("error", error => {
    console.log(error);
  });

});

req.write(JSON.stringify({ url: host, types: ["A"] }));
req.end();

Agora, se você retornar ao terminal e executar o script utilizando o comando node vanilla.js, deverá obter a seguinte saída.

[
  { address: '172.253.122.101', ttl: 247 },
  { address: '172.253.122.113', ttl: 247 },
  { address: '172.253.122.100', ttl: 247 },
  { address: '172.253.122.102', ttl: 247 },
  { address: '172.253.122.138', ttl: 247 },
  { address: '172.253.122.139', ttl: 247 }
]

Isso é tudo para a primeira parte. A principal desvantagem de usar os módulos HTTP/S nativos é que ele é prolixo. Bibliotecas de clientes, como o node-fetch, o ajudarão a criar o mesmo programa, mas com um código mais claro e conciso.

node-fetch

Para criar o mesmo script, mas com node-fetch, abra o arquivo with-fetch.js e adicione as seguintes importações no topo.

import fetch from "node-fetch";
import { config } from "dotenv";

Em seguida, chame a função config para configurar as variáveis ambientais e definir constantes para a API_KEY e o host, cujos registros A serão solicitados.

config();

const apiKey = process.env.API_KEY;
const host="google.com"

Agora, definiremos uma função para fazer a chamada à API. Essa função será assíncrona.

async function request() {
  // O corpo da função será inserido aqui
}

Dentro do corpo da função, precisaremos chamar a função fetch, que importamos anteriormente do pacote node-fetch.

const response = await fetch("https://api.etechpt.com.com/dnsrecord", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": apiKey,
    },
    body: JSON.stringify({ url: host, types: ["A"] }),
});

Após a chamada da função fetch, gostaríamos de analisar a resposta e lidar com quaisquer erros que possam ocorrer.

if (response.ok) {
    const { data } = await response.json();

    console.log(data.A);
  } else {
    console.log(response);
  }

Neste ponto, adicione uma chamada para a função após a definição da mesma.

request();

Seu arquivo agora deve ter esta aparência:

import fetch from "node-fetch";
import { config } from "dotenv";

config();

const apiKey = process.env.API_KEY;
const host = "google.com";

async function request() {
  const response = await fetch("https://api.etechpt.com.com/dnsrecord", {
    method: "POST",
    headers: {
      "Content-Type": "application/json",
      "x-api-key": apiKey,
    },
    body: JSON.stringify({ url: host, types: ["A"] }),
  });

  if (response.ok) {
    const { data } = await response.json();

    console.log(data.A);
  } else {
    console.log(response);
  }
}

request();

E executar este script com o node with-fetch.js deve exibir a seguinte saída:

[
  { address: '172.253.122.113', ttl: 134 },
  { address: '172.253.122.138', ttl: 134 },
  { address: '172.253.122.100', ttl: 134 },
  { address: '172.253.122.139', ttl: 134 },
  { address: '172.253.122.102', ttl: 134 },
  { address: '172.253.122.101', ttl: 134 }
]

Axios

Finalmente, utilizaremos o Axios para acessar a API etechpt.com. Para começar, vamos importar os pacotes dotenv e axios.

import axios from "axios";
import { config } from "dotenv";

Em seguida, vamos chamar a função config para configurar as variáveis ambientais. Além disso, armazenaremos o nome do host e a API Key em constantes separadas.

const host = "google.com";
const key = process.env.API_KEY;

Agora, vamos armazenar a URL do endpoint da API em outra constante.

const url = "https://api.etechpt.com.com/dnsrecord";

Logo após, vamos armazenar os dados que serão enviados como parte do corpo da solicitação em outra constante.

const data = { url: host, types: ["A"] };

Então, a última coisa a fazer antes de enviar a solicitação será também armazenar as opções meta, como cabeçalhos, em outra constante.

const options = {
  headers: {
    "Content-Type": "application/json",
    "x-api-key": key,
  },
};

Finalmente, faremos a chamada para a função post que importamos anteriormente, passando as variáveis url, data e options que definimos anteriormente como argumentos. Como isso retornará uma promise, você poderá usá-la para lidar com a resposta quando ela for retornada.

axios.post(url, data, options).then(({ data }) => {
  console.log(data.data.A);
});

Ao final, o código no arquivo with-axios deve ter esta aparência:

import axios from "axios";
import { config } from "dotenv";

config();
const host = "google.com";
const key = process.env.API_KEY;

const url = "https://api.etechpt.com.com/dnsrecord";
const data = { url: host, types: ["A"] };
const options = {
  headers: {
    "Content-Type": "application/json",
    "x-api-key": key,
  },
};

axios.post(url, data, options).then(({ data }) => {
  console.log(data.data.A);
});

E quando você executa o script usando o node with-axios.js, ele deve exibir a seguinte saída:

[
  { address: '142.251.163.138', ttl: 60 },
  { address: '142.251.163.113', ttl: 60 },
  { address: '142.251.163.100', ttl: 60 },
  { address: '142.251.163.101', ttl: 60 },
  { address: '142.251.163.102', ttl: 60 },
  { address: '142.251.163.139', ttl: 60 }
]

Considerações Finais

Neste artigo, criamos o roteiro utilizando três abordagens distintas. O intuito disso foi demonstrar como é simples utilizar a API etechpt.com e como podemos empregá-la em Javascript, especificamente no NodeJS.

Explore a documentação da API etechpt.com para saber mais.