DEV Community

Fernando Raposo da Camara Silva
Fernando Raposo da Camara Silva

Posted on • Updated on

GUI Simples no Linux Utilizando Node.js e Zenity

(Este post é uma tradução deste original em inglês)
É impressionante a quantidade de ferramentas "secretas" do Linux que não são tão bem conhecidas até hoje. Outro dia mesmo esbarrei com o Zenity. Ele tem a ver com a geração de notificações através do Terminal do Linux. Ele pode permitir fazer scripts mais amigáveis exibindo caixas de diálogo. Usa-se ele tipicamente em scripts shell para aumentar a usabilidade.

Meus objetivos serão os seguintes:

  1. Usar o Node.js para acessar dados financeiros relacionados a preços de títulos do Tesouro Direto;
  2. Criar um mecanismo para de forma sistemática checar o preço dos títulos (minuto a minuto, ou hora por hora...);
  3. Usar o Zenity para exibir uma notificação com o preço corrente do título.

Acessando Informações do Tesouro Direto

As informações do Tesouro Direto podem ser achadas aqui. Além disso, se apertarmos o F12 e checarmos a aba Network, veremos o seguinte json sendo recebido pelo browser:
https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json
Podemos ver que este JSON contém as informações instantêneas de cotações do Tesouro Direto.
Assim, não há muito mais o que fazer além de usar o Node.js para fazer chamadas GET e capturar este arquivo json como visto abaixo:

const axios = require('axios');
const { exec } = require("child_process");
const https = require('https');



const instance = axios.create({
  httpsAgent: new https.Agent({
    rejectUnauthorized: false
  })
});

instance.get('https://www.tesourodireto.com.br/json/br/com/b3/tesourodireto/service/api/treasurybondsinfo.json')
.then(x => {...
Enter fullscreen mode Exit fullscreen mode

Nota: Este rejectUnauthorized: false tem que ser setado, caso contrário você receberá erro de certificado.

Agendador de Tarefas

Um cron job é um comando Linux usado para agendar (ou schedular) tarefas a serem executadas em algum momento do futuro. Esta funcionalidade é exatamente o que é necessário para podermos checar as taxas a cada hora. Assim, iremos usar um cron job para chamar o nosso script Node e assim recuperar as taxas do tesouro direto a cada hora.
Para criar um Cron Job vá em:
/var/spool/cron
E acesse a tabela cron do usuário escrevendo no prompt:
crontab -e
O README apresenta orientações sobre como agendar comandos usando a crontab adicionando uma expressão seguida pelo comando que se deseja executar periodicamente.
Por exemplo, se você quiser rodar seu programa a cada minuto entre dez da manhã e cinco da tarde todos os dias úteis da semana escreva o seguinte na crontab:
* 10-17 * * 1-5 <comando>
Para facilitar esta tarefa existe um site chamado crontab.guru que ajuda a construir a expressão.
Nota: Para agendar o cron para rodar o seu script DE HORA EM HORA, DE SEGUNDA A SEXTA das dez da manhã às cinco da tarde a expressão é: 0 10-17 * * 1-5

  • Lembre-se de adicionar o caminho completo do Node e do seu script para que o job na cron tab funcione corretamente.

Notificações Usando Zenity

O Zenity é uma ferramenta que permite a geração de notificações através de comandos no terminal. Notificações que se parecem com isso:
image
Você pode gerá-las escrevendo no Terminal assim:

zenity --notification\
--window-icon="info" \
--text="There are system updates necessary!"

Há uma boa chance do Zenity já estar instalado na sua máquina (no Ubuntu está). Mas se você não tem, por favor escreva:
sudo apt-get update -y
depois, escreva:
sudo apt-get install -y zenity
Para concluir os objetivos nós precisamos que o Node execute comandos Shell de alguma forma. Isto é alcançado utlizando a biblioteca exec como demonstrada abaixo:

  exec('zenity --notification --window-icon="info" --text="Taxa Atual TD 2035: IPCA+"' + taxa, (error, stdout, stderr) => {
    if (error) {
      console.log(`error: ${error.message}`);
      return;
    }
    if (stderr) {
      console.log(`stderr: ${stderr}`);
      return;
    }
  });
Enter fullscreen mode Exit fullscreen mode

O projeto inteiro no GitHub está aqui.

Fontes:
https://help.gnome.org/users/zenity/stable/index.html.en
https://www.howtoforge.com/how-to-display-gui-dialogs-in-bash-script-using-zenity/
https://crontab.guru/

Top comments (0)