Objective: Demonstrate the possibility of automating tasks that generate information using APIs and Shell Script.
Recently, I saw someone comment about a quotation API that does not require authentication and returns real-time data for free.
An API like this greatly facilitates the work of those who need these values for a project. Here, I easily demonstrate how to get the current dollar exchange rate via Telegram by requesting the quotation API.
Bot Configurations
The first step is to have the bot configurations, the TOKEN, and the chat ID (chat_id
) where the interaction will take place. The Telegram bot API documentation provides more details explaining how to perform this step. Basically, you need the bot's TOKEN created in BotFather and the chat_id, which can be found by accessing https://api.telegram.org/bot<TOKEN>/getUpdates
.
Function to Send Messages
In the documentation, methods of the Telegram API that can be used are listed, such as sendMessage()
. In the script, it is a function that will send messages to the user using HTML formatting.
%20
(space) and %0A
(\n) are escape sequences used to represent special characters in URLs.
Check Messages Received by the User
jq
is a command-line tool used to process, analyze, and manipulate JSON data. We can filter, map, reduce, transform, and format JSON data in the terminal.
apt-get install -y jq
It will be used to filter the JSON structure for the last message sent by the user, and if that message is "dollar" the current value of the dollar in reais will be returned via sendMessage
.
The function getLastUserMessageId()
will have the ID of the last message sent by the user to differentiate the moment when the user sent the word "dollar" to the bot.
Code
#!/bin/bash
echo "Cotação do Dólar americano para Real Brasileiro"
# Bot Configs.
TOKEN=''
CHAT_ID=''
# Variable to store the ID of the user's last message
last_user_message_id=""
# Function that sends a message to 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
}
# Function to get the ID of the last user message
getLastUserMessageId() {
echo "$1" | jq -r '.result[-1].message.message_id'
}
# Loop to receive bot updates
while true; do
# Getting updates
UPDATES=$(curl -s "https://api.telegram.org/bot$TKN/getUpdates")
# Check the JSON for received messages
MESSAGE=$(echo "$UPDATES" | jq -r '.result[-1].message.text')
USER_ID=$(echo "$UPDATES" | jq -r '.result[-1].message.from.id')
MESSAGE_ID=$(getLastUserMessageId "$UPDATES")
# If the last message is "dólar" and it's a new interaction from the user...
if [[ "$MESSAGE" == "dólar" ]] && [[ "$MESSAGE_ID" != "$last_user_message_id" ]]; then
response=$(curl -s "https://economia.awesomeapi.com.br/json/last/USD-BRL")
# Translate the keys to Portuguese
declare -A traducoes=(
["bid"]="Compra"
["ask"]="Venda"
["varBid"]="Variação"
["pctChange"]="Porcentagem de Variação"
["high"]="Máximo"
["low"]="Mínimo"
)
# Display the values for each translated key
valores=()
for chave in "${!traducoes[@]}"; do
valor=$(echo "$response" | jq -r ".USDBRL[\"$chave\"]")
valores+=("<b>${traducoes[$chave]}</b>: $valor bn")
done
# Using sed to replace characters that are not interpreted in the message (POST) sent to the user
sendMessage $(echo -e "💵 DÓLAR - REAL%0A${valores[@]}" | sed 's/ /%20/g; s/bn%20/%0A/g; s/bn//g')
# Store the ID of the user's last message
last_user_message_id="$MESSAGE_ID"
fi
# Wait 5 seconds before checking again
sleep 5
done
Top comments (0)