DEV Community

Cover image for Um bot feito com ShellScript que envia a cotação do Dólar para Real no Telegram.
Everton Tenorio
Everton Tenorio

Posted on

Um bot feito com ShellScript que envia a cotação do Dólar para Real no Telegram.

Recentemente vi alguém comentar sobre uma API de cotação que não pede autenticação e retorna os dados em tempo real, 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 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.

apt-get install -y jq
Enter fullscreen mode Exit fullscreen mode

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

#!/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
Enter fullscreen mode Exit fullscreen mode

Resultado

real_dolar

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 pode ser que seja útil para você tambem.

Top comments (0)