GUI Simples no Linux Utilizando Node.js e Zenity
Tags: node, linux, gui, cronjob
Published: 2021-06-01 02:12:53

(Este post é uma tradução deste original [em inglês](https://dev.to/ferfox1981/simple-gui-on-linux-using-zenity-and-node-js-2kei))
É 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](https://www.tesourodireto.com.br/titulos/precos-e-taxas.htm). 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 => {...
```
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](https://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](https://help.gnome.org/users/zenity/stable/notification.html.en) que se parecem com isso:
![image](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rtmt5jalq7ane6su572l.png)
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;
    }
  });
```
O projeto inteiro no GitHub está [aqui](https://github.com/ferfox1981/td-monitor).

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/