Telegram Bot com Node.js PT2

Adicionando funcionalidades ao nosso bot, hora de fazer scraping de uma página web para listar eventos de tecnologia!

Matheus Sandrini Rossi
Matheus Rossi
3 min readNov 23, 2017

--

Telegram e Node.js — Parte 2

Na parte 01 desta série de tutoriais, vimos como criar nosso bot para telegram, e enviar aquela mensagem automática de boas vindas.

https://github.com/matheus-rossi/sc-devs-telegram-botAgora vamos adicionar mais funcionalidades, que tal responder a um comando do usuário?

Criei um grupo no telegram, para tentar reunir a galera que trabalha com TI de Santa Cataria, que pode ser acessado através link abaixo:

Para agregar mais funções ao nosso bot, vamos desenvolver uma feature, que ao ser acionada pelo usuário, listará os eventos de tecnologia, cadastrados no sympla para uma determinada cidade. Algo nesse estilo:

/eventos Florianópolis

E o retorno desejado, será uma lista com informações de eventos relacionados a tecnologia, nesse estilo:

Nosso Bot em Ação

Como esse comando irá funcionar?

Como comentado logo a cima, vamos fazer um scraping de dados da página do sympla, e retornar uma mensagem para o usuário/grupo com os eventos cadastrados no site.

I — Avaliar site do Sympla

Para nossa alegria, após realizarmos os filtros no site, e pesquisarmos a informação desejada, podemos perceber quais parâmetros de pesquisa são enviados por query string, economizando muito trabalho que seria feito dentro do scraping.

Apenas deixando o padrão mais claro:

https://www.sympla.com.br/eventos/florianopolis-sc?s=tecnologia
# ou seja
https://www.sympla.com.br/eventos/CIDADE-sc?s=ASSUNTO

II — Como fazer o Scraping dos dados?

Em um outro post sobre web Scraping, relatei uma tentativa frustrada com axios e cheerio, porém aqui ela é válida xD.

O axios realiza uma chamada http para o endereço desejado e retorna a chamada. Isto nos dá acesso a todo o código HTML, que posteriormente será carregado no cheerio (uma implementação do JQuery), que possibilitará, a extração dos dados com mais facilidade.

III — Less talk, show me the code!

Como nosso bot já está funcional desde outro post, vamos dar continuidade ao desenvolvimento:

npm i axios cheerio --save

Realizada a instalação através do npm, hora de importar esses módulos:

const axios = require('axios')
const cheerio = require('cheerio')
const normalizer = require('./helpers/normalize')# este normalize serve para "normalizar" a string passada referente a cidade escolhida, eliminando acentos o parâmetro ser enviado por query string (no final do post, teremos o cod dele

Normalizer =https://gist.github.com/matheus-rossi/758f2cf7c293b29d82d4798c9ee708a2

Admito fugir sempre que possível do JQuery, mas as vezes ele ainda é bem útil, então favor desconsiderarem a leve gambi que fiz para extrair os dados da página:

  1. A função bot.onText tem como primeiro parâmetro, uma regex para capturar o comando /eventos e a cidade que será digitada logo após.
  2. Armazenamos o id do chat, a cidade escolhida (após a normalização) e a url para ser utilizada no axios (atenção ao template literal aqui).
  3. Chamada feita com o axios, carregamos o contudo com o cheerio para a const $
  4. Através das tags css, identificamos os elementos que desejamos extrair a informação, e para cada um deles, pegamos a informação desejada, armazenando em array de objetos.
  5. Realizamos um map neste array, e retornamos a informação para o usuário ou grupo …

O mais chato aqui, é extrair os dados da página, feito isto, retornar a informação para o usuário é tarefa simples, o mais complicado mesmo é extrair as informações com JQuery …

O código do bot completo até aqui, se encontra disponível no meu github:

No mais, até próximo capitulo pessoal!

--

--

Matheus Sandrini Rossi
Matheus Rossi

Data Engineer, Especialista em Gestão da Qualidade,Engenharia de Produção e Engenharia de Dados. Estudante de Eng de Software e fotógrafo p/ hobby