Um bot feito com ShellScript que envia a cotação do Dólar para Real no Telegram.
Tags: shellscript
Published: 2024-04-23 23:33:48

Recentemente vi alguém comentar sobre uma [API de cotação que não pede autenticação e retorna os dados em tempo real](https://economia.awesomeapi.com.br), de graça. Há um tempo atrás para aprender Scraping com Python fiz um bot para o telegram que enviava a cotação do dólar para o real.

Uma API como esta facilita bastante o trabalho de quem precisa desses valores em algum projeto. Dessa vez, irei requisitar na API a cotação do dólar americano para reais criando um bot no Telegram com Shell Script. Compartilho aqui o script e como foi feito. 

---

## Configurações do bot
O primeiro passo é ter em mãos as configurações do bot, do `TOKEN` e o id do chat (`chat_id`) onde acontecerá a interação, na própria [documentação](https://core.telegram.org/bots/) tem mais detalhes explicando como realizar esse passo. Basicamente, possuir o TOKEN do bot criado no BotFather e o chat_id que poder ser encontrado acessando `https://api.telegram.org/bot<TOKEN>/getUpdates`.

---

## Função para enviar mensagens

Na documentação, são listados métodos da api do Telegram que podem ser utilizados, como o `sendMessage()`. No script é uma função que irá enviar mensagens ao usuário utilizando formatação HTML.

`%20` (mesmo que `espaço`) e `%0A` (mesmo que `\n`) são sequências de escape utilizadas para representar caracteres especiais em URLs.

## Verificar mensagens recebidas pelo usuário
O `jq` é uma ferramenta de linha de comando usada para processar, analisar e manipular dados JSON. Podemos filtrar, mapear, reduzir, transformar e formatar dados JSON no terminal.

```bash
apt-get install -y jq
```

Ele será utilizado para filtrar na estrutura do json qual foi a última mensagem enviada pelo usuário e se essa mensagem for "dólar", retornado via `sendMessage` o valor atual do dólar em reais.

A função `getLastUserMessageId()` terá o id da última mensagem enviada pelo usuário para que diferencie o momento em que o usuário enviou para o bot a palavra "dólar".

---

### O código
```bash
#!/bin/bash

echo "Cotação do Dólar americano para Real Brasileiro"

# Bot Configs. Telegram
TOKEN=''
CHAT_ID=''

# Variável para armazenar o ID da última mensagem do usuário
last_user_message_id=""

# Função que envia mensagem para o Telegram
sendMessage() {
    curl -s -X POST \
        https://api.telegram.org/bot$TKN/sendMessage \
        -d chat_id=$CHAT_ID \
        -d text="$1" \
        -d parse_mode=HTML
}

# Função para obter o ID da última mensagem do usuário
getLastUserMessageId() {
    echo "$1" | jq -r '.result[-1].message.message_id'
}

# Loop para receber atualizações do bot
while true; do
    # Obtendo atualizações
    UPDATES=$(curl -s "https://api.telegram.org/bot$TKN/getUpdates")

    # Verificar no json se há mensagens recebidas
    MESSAGE=$(echo "$UPDATES" | jq -r '.result[-1].message.text')
    USER_ID=$(echo "$UPDATES" | jq -r '.result[-1].message.from.id')
    MESSAGE_ID=$(getLastUserMessageId "$UPDATES")

    # Se a última mensagem for "dólar" e for uma nova interação do usuário...
    if [[ "$MESSAGE" == "dólar" ]] && [[ "$MESSAGE_ID" != "$last_user_message_id" ]]; then
        response=$(curl -s "https://economia.awesomeapi.com.br/json/last/USD-BRL")

        # Traduzir as chaves para português
        declare -A traducoes=(
          ["bid"]="Compra"
          ["ask"]="Venda"
          ["varBid"]="Variação"
          ["pctChange"]="Porcentagem de Variação"
          ["high"]="Máximo"
          ["low"]="Mínimo"
        )

        # Exibir os valores para cada chave traduzida
        valores=()
        for chave in "${!traducoes[@]}"; do
            valor=$(echo "$response" | jq -r ".USDBRL[\"$chave\"]")
            valores+=("<b>${traducoes[$chave]}</b>:  $valor bn")
        done
        
        # Utilizando sed para substituir caracteres que não são interpretados no envio(POST) da mensagem para usuário
        sendMessage $(echo -e "💵 DÓLAR - REAL%0A${valores[@]}" | sed 's/ /%20/g; s/bn%20/%0A/g; s/bn//g')

        # Armazena o ID da última mensagem do usuário
        last_user_message_id="$MESSAGE_ID"
    fi

    # Aguardar 5 segundos antes de verificar novamente
    sleep 5

done
```

## Resultado

![real_dolar](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kd1tw1fkt9bzbf334ckf.png)

Com Shell Script e somando com pacotes instalados em ambientes Linux, podemos automatizar diversas coisas que advenham de recursos oferecidos na Web ou não, dê uma olhada na [API](https://economia.awesomeapi.com.br) pode ser que seja útil para você tambem.