Criando aplicações CLI utilizando Node.js
Instruções de como fazer CLI Applications com Javascript com Node.js usando o API do forecast.io
Introdução
As aplicações que se utilizam da linha de comando do Sistema Operacional são comumente chamadas de CLI Applications
ou Command-Line Interface Applications
. O que isto quer dizer? Estas aplicações só sofrerão alguma interação caso ela seja feita através de um Shell (BASH, DOS, ZSH, entre outros), mediante entrada de texto.
Este tipo de aplicação é contrária as GUI Applications
ou Graphical User Interface Applications
, que permitem o usuário interagir com a aplicação através de ícones, disposição dos elementos na tela, utilizando-se do Mouse para isto.
Por que utilizar CLI?
Um dos principais motivos é a agilidade com que algumas tarefas podem ser executadas. Por utilizar apenas texto, algumas tarefas triviais são mais simples de serem executadas. Por exemplo, para copiar todos os arquivos com terminação .js
de um diretório para outro:
GUI:
- Abrir o gerenciador de arquivos
- Navegar entre os diretórios até achar o desejado
- Selecionar todos os arquivos que terminam com
.js
- Copiar os arquivos
- Trocar de diretório no gerenciador de arquivos
- Colar os arquivos
CLI:
- Abrir o terminal
- Executar o comando de cópia
cp *.js destinationfolder
Além disto, você consegue automatizar diversas tarefas criando arquivos executáveis, simplesmente executando estes arquivos (que podem ser em bash, python, ou qualquer outra linguagem que rode em ambiente Shell).
Como fazer CLI Applications com Javascript?
Antes de tudo, faça o download do NodeJS, que é o runtime utilizado para executar Javascript no server-side.
Após ter o Node instalado, vá até o seu terminal e execute os seguintes comandos:
mkdir tableless-cli cd tableless-cli npm init--yes
Estes comandos irão gerar um arquivo chamado package.json
, que terá o seguinte formato:
{ "name": "tableless-cli", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC" }
O package.json
é um arquivo de configuração do NPM
(Node Package Manager)
que é utilizado como um descritor do seu projeto, além de manusear suas dependências, e o mais importante para nós neste tutorial, transformar seu arquivo Javascript em um executável no sistema.
Nosso projeto vai consistir de um arquivo javascript que, ao ser executado, nos trará a previsão do tempo da cidade passada como parâmetro. Esta previsão do tempo será resgatada através de uma busca para a API de Geocoding do Google Maps, e em seguida para a API do forecast.io.
Vamos criar nosso arquivo index.js dentro de uma pasta bin
.
mkdir bin cd bin touch index.js
E, dentro do nosso package.json, vamos dizer ao npm que quando o comando “forecast” for executado no terminal, queremos que execute o arquivo ./bin/index.js
{ "name": "tableless-cli", "version": "1.0.0", "description": "", "main": "index.js", "scripts": { "test": "echo \"Error: no test specified\" && exit 1" }, "keywords": [], "author": "", "license": "ISC", "bin": { "forecast": "./bin/index.js" } }
No nosso arquivo index.js
, vamos dizer para o sistema que o arquivo deve ser executado utilizando o NodeJS e vamos importar uma biblioteca padrão para realizar chamadas HTTPS.
#! /usr/bin/env node var https = require('https')
Vamos adicionar mais duas linhas de códigos para testarmos se está tudo funcionando.
#! /usr/bin/env node var https = require('https') var arguments = process.argv.splice(2, process.argv.length -1).join(' ') console.log(arguments);
A linha 3 captura os argumentos passados para nossa aplicação, ignorando os dois primeiros itens. Eles são ignorados pois são o caminho dos executáveis que farão nossa aplicação ser executada, e nós não precisamos desta informação. Além disto, transformamos o Array
de argumentos para uma String
, através do comando .join(' ')
.
Voltando a pasta onde o arquivo package.json
está, vá até seu terminal e execute os seguintes comandos:
npm link forecast
O comando npm link
irá transformar em executável nosso arquivo dentro do sistema, deixando-o disponível para ser executado, e o comando forecast
foi o que definimos dentro do nosso package.json
.
Pronto, criamos nosso primeiro executável! Agora vamos fazer uma busca para a API do Google Maps para transformar o endereço digitado em Latitude e Longitude.
Para fazermos a busca para a API do Google Maps, precisamos de mais uma biblioteca padrão do Node.js: querystring
. Utilizaremos a função stringify
dela, para podermos normalizar o texto que enviaremos para a API.
#! /usr/bin/env node var https = require('https') var querystring = require('querystring') var arguments = process.argv.splice(2, process.argv.length -1).join(' ') var search = querystring.stringify({ address: arguments }) https .get('https://maps.googleapis.com/maps/api/geocode/json?' + search, function(res){ var data = '' res.on('data', function(newData){ data += newData }); res.on('end', function(){ var location = JSON.parse(data).results[0].geometry.location }) })
Na linha 9, estamos fazendo uma chamada https para a API do google maps passando como parâmetro o que foi passado para nossa aplicação.
Na linha 18, obtemos como resultado da busca a Latitude e a Longitude da nossa pesquisa. Por prática estou usando apenas o primeiro resultado, mas sinta-se a vontade para brincar com os resultados da API.
Até agora, geramos um arquivo javascript executável através da linha de comando que faz uma busca na API do Google para um endereço passado como parâmetro.
Utilizando a API do Forecast.
O Forecast é um site que mostra a condição do tempo e possui uma API muito boa para que nós, desenvolvedores, possamos aproveitar. É necessário uma key
para fazermos uma requisição e, na versão gratuita, podemos fazer no máximo 1.000 chamadas por dia para a API. Como não teremos um volume muito grande de chamadas, vamos utilizá-la.
Para conseguir sua key de acesso, faça o cadastro aqui.
Vamos utilizar agora o objeto de Geolocalização que obtivemos da API do Google Maps para fazermos uma chamada para API do Forecast.
#! /usr/bin/env node var https = require('https') var querystring = require('querystring') var arguments = process.argv.splice(2, process.argv.length -1).join(' ') var search = querystring.stringify({ address: arguments }) https .get('https://maps.googleapis.com/maps/api/geocode/json?' + search, function(res){ var data = '' res.on('data', function(newData){ data += newData }); res.on('end', function(){ var location = JSON.parse(data).results[0].geometry.location var options = querystring.stringify({ units: 'si', lang: 'pt' }) https .get('https://api.forecast.io/forecast//' + location.lat +',' + location.lng + '?' + options, function(resForecast){ var data = '' resForecast.on('data', function(newData){ data += newData }); resForecast.on('end', function(){ var json = JSON.parse(data) console.log('Temperatura Atual: ' + json.currently.temperature + ' ºC') console.log('Sensação Térmica: ' + json.currently.apparentTemperature + ' ºC') console.log(json.daily.summary) }) }) }) })
Com isto, finalizamos nossa aplicação. Foi feita uma chamada para a API do Forecast passando a latitude e longitude descobertas através da API do Google Maps.
Utilizamos o retorno da API do Forecast para mostrar no terminal algumas das informações retornadas. As opções que foram passadas para a API do Forecast foram utilizadas para formatar tanto o sistema de medidas (units: 'si'
), quanto o idioma de retorno: (lang: 'pt'
).
Executando a aplicação após ela estar finalizada:
Conclusão
Fazer aplicações que serão executadas na linha de comando com NodeJS é muito simples, e requer conhecimentos apenas da linguagem. Estas aplicações poderão ser executadas em qualquer Sistema Operacional (Windows, Linux, Mac) e podem nos ajudar e muito na resolução de tarefas corriqueiras do dia a dia.
O código desta aplicação está no meu github, para quem quiser dar uma olhada.