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.