O ponto máximo da história é o R mandando mensagem pro Telegram. Só para motivar, vou contar o que fiz de divertido usando telegram e preços de bitcoin.
Herói do dia: Luca Biglia, autor do pacote telegram
do R.
O que faremos
Como mencionei, Vou construir um Acompanhador de bitcoin pra ilustrar e ao fim do post teremos feito o R mandar um telegram quando o preço da bitcoin atingir um dado patamar.
Ingredientes
Na arte de hoje vamos precisar de:
- Um bot do telegram
- O pacote do R
library(telegram)
- A API da BlinkTrade
- Barbante e um tubo de cola
Os passos que precisamos seguir para alcançar isso são:
- Criar um .Rproj (projeto do RStudio).
- instalar e carregar o pacote
telegram
do R. - Criar um bot do telegram com a ajuda do BotFather.
- Conectar o R com o bot.
- Consultar e guardar os preços da bitcoin de 30 em 30 segundos.
- criar um loop infinito no R para acompanhar os preços sem parar.
- Fazer o R mandar mensagem pra gente quando o preço da bitcoin for maior que X, por exemplo.
- (extra) Pensar em ideias mirabolantes do que fazer com telegram + R.
Introdução aos componentes
Antes de mais nada, uma breve introdução às coisas que aparecerão por aqui:
- telegram: é igual ao Whatsapp, mas melhorado.
- BotFather: um contato do seu celular (no telegram) que te ajuda a criar um bot do telegram.
- bitcoin: moeda digital de sucesso.
- BlinkTrade: dentre outras coisas, fornece API para valores da bitcoin em tempo real.
Acompanhador de bitcoin
Já crie o seu .Rproj, rode install.packages("telegram");library(telegram)
e vamos direto ao terceiro passo.
Passo 3: Bot do telegram - Criar um bot
Bot é como se fosse uma pessoa a mais na sua lista de contato do telegram, mas que são máquinas em vez de humanos e respondem a comandos específicos. A graça é que você pode customizar esses comandos do jeito que quiser! Basta ter um propósito e saber programá-lo.
O README que tá no github do pacote é muito bom! Vou resumir com pequenas mudanças o que está lá:
- Vá ao seu telegram e procure pelo BotFather como se estivesse procurando uma pessoa da sua lista de contato. Abra uma conversa com ele!
- Envie o texto “/start” e em seguida “/newbot”. Dê um nome ao seu bot (pode ser um nome fofo) e depois um nome de usuário para o seu bot que necessariamente termina em bot.
- Agora copie e cole o token que o BotFather te enviou no
.Renviron
. O meu bot tem o usernameAthosDamianiBot
, então eu devo colocar o nome da variável assim:
Se você usar essa convenção de nome você poderá usar a função bot_token()
pra pegar o seu token. Caso contrário vai ter que apelar para a Sys.getenv()
.
OBS: Reinicie o R para o .Renviron
ficar configurado.
Passo 4: Bot do telegram - Conectar ao R
- Carregue o pacote e crie um objeto
TGBot
para o seu bot criando anteriormente:
library(telegram)
bot <- TGBot$new(token = bot_token('AthosDamianiBot'))
bot$getMe()
Agora precisamos do
chat_id
. Para isso, no seu telegram, procure o seu bot como se fosse um contato (que nem você fez com o BotFather) e comece uma conversa com ele.No R, chame o método
bot$getUpdates()
para pegar no R as mensagens que você enviou a ele e, finalmente, encontre ochat_id
escondido nomsgs
.
msgs <- bot$getUpdates()
msgs$message$chat$id[1]
[1] 135717340
- Com o
chat_id
em mãos, configure ele comochat_id
padrão.
bot$set_default_chat_id(135717340)
Neste momento já estamos prontos para interagir com o nosso bot!
Passo 5: Consultar preços da bitcoin
Os preços da bitcoin são fornecidos pela API da BlinkTrade que é bem simples usar: basta pegar o json que a url do código abaixo solta. Aproveito e dou um tapinha para deixar em forma de data.frame e com a data de consulta junto.
library(jsonlite)
library(tidyverse)
safe_fromJSON <- safely(fromJSON, as.numeric(NA))
nova_consulta_list <- safe_fromJSON("https://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC")
nova_consulta <- nova_consulta_list$result %>%
as.tibble %>%
mutate(timestamp = lubridate::now())
nova_consulta
# A tibble: 1 x 9
high vol buy last low pair sell vol_brl timestamp
<dbl> <dbl> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dttm>
1 14438.21 511.5911 14077.01 14200 13801.04 BTCBRL 14200 7257317 2017-08-18 17:09:44
OBS: Usei o advérbio safely()
porque a API pode engasgar a qualquer momento, fazendo assim o R retornar um erro que interromperia o acompanhamento do preço.
Passo 6: Loop infinito para acompanhar os preços
O esqueleto do acompanhador é composto por um loop infinito (while(TRUE)
), um data.frame historico.RData
, um tempo entre uma consulta e outra (30 segundos por padrão) e a consulta propriamente dita.
# inicializa o historico.RData
# historico <- nova_consulta
# save(historico, file = "historico.RData")
acompanhar_bitcoin <- function(frequencia = 30) {
load("historico.RData")
# loop infinito
while(TRUE) {
# pega a cotação do bitcoin brasil (BTCBRL) da API do blinktrade
nova_consulta_list <- safe_fromJSON("https://api.blinktrade.com/api/v1/BRL/ticker?crypto_currency=BTC")
# verifica se a API retornou uma lista
if("list" %in% class(nova_consulta_list$result)) {
nova_consulta <- nova_consulta_list$result %>%
as.tibble %>%
mutate(timestamp = lubridate::now())
# ---------------------
#
# espaço reservado para as regras!
#
# ---------------------
# guarda a consulta
historico <- bind_rows(historico, nova_consulta)
save(historico, file = "historico.RData")
}
}
Sys.sleep(frequencia)
}
Passo 7: Regras para mensagens de telegram
Agora é a hora de decidir o que o bot deve nos avisar! Deixei dois exemplos simples abaixo usando o método bot$sendMessage()
, que como o nome sugere faz o bot enviar mensagem pra gente. Agora, toda vez que o preço da bitcoin valer menos que R$13.600 ou valer mais que R$14.600 eu vou ficar sabendo na hora!
# caso o valor da cotação atinja algum critério, envia uma mensagem via telegram.
if(nova_consulta$buy < 13600 & nova_consulta$last > 13900) {
bot$sendMessage('baixa!')
bot$sendMessage(nova_consulta$buy)
}
# ...
if(nova_consulta$buy > 14600 & nova_consulta$last < 14500) {
bot$sendMessage('alta!')
bot$sendMessage(nova_consulta$buy)
}
Passo Extra: Ideias mirabolantes do que fazer com telegram + R
Aqui reina a criatividade. Dá pra mandar gráficos, sons, stickers e qualquer tipo de mídia. Eu fiz um ggplot para ficar vendo a tendência, daí poderia pedir para ver o gráfico ao meu bot a qualquer momento.
# ... isso vai dentro da funcao acompanhar_bitcoin()
p <- ggplot(historico %>%
gather(indicador, valor, high, low, buy, sell, last)) +
geom_line(aes(x = timestamp, y = valor, colour = indicador))
print(p)
Também é possível programar comandos para serem passados ao Bot para que ele construa algo para a gente, por exemplo, vc poderia criar um comando para comprar ou vender bitcoins em tempo real!
O Julio uma vez criou um bot que era praticamente o próprio R, vc enviava código como mensagem e ele retornava o output do R! Depois vou pedir pra ele postar algo sobre isso.
Enfim, dá pra ser engenhoso aí. Basta ter aquela ideia de chuveiro genial.
Exercício para casa: - Enviar o gemidão do zap para 3 amigos via linha de código.
abs!