Este é um guia de como cria um bot para Telegram capaz de buscar e exibir eventos da Comunidade Devs Norte através da plataforma Sympla. Vamos mergulhar no processo de desenvolvimento passo a passo.
Pré-requisitos
Antes de começarmos, assegure-se de ter o Go instalado em seu sistema. Além disso, será necessário ter uma no Telegram.
Passo 1: Configuração do Ambiente
Crie um novo diretório para o seu projeto
inicialize um módulo Go usando o seguinte comando:
Certifique-se de ter as dependências necessárias instaladas:
Passo 2: Configuração do Token
Agora, você precisa obter um token de autenticação do bot do Telegram para interagir com a API do Telegram. Siga estas etapas para obter o token:
Acesse o BotFather no Telegram.
Siga as instruções para criar um novo bot. Envie o comando /newbot e siga as instruções para fornecer um nome e um username para o seu bot.
Após concluir o processo de criação do bot, o BotFather irá fornecer um token de acesso para o seu bot.
Agora, crie um arquivo chamado .env no mesmo diretório do seu código e adicione o token como uma variável de ambiente.
Substitua seu_token_aqui pelo token fornecido pelo BotFather.
Passo 3: Escrevendo o Código
Crie um arquivo main.go e coloque nele:
Importações das bibliotecas necessárias.
Definição das estruturas de dados necessárias para lidar com a resposta da API do Sympla.
Implementação da função NewBot para criar uma nova instância do bot do Telegram.
Implementação do método Start para iniciar o bot.
Implementação dos métodos para registrar os comandos do bot e lidar com eventos relacionados a eventos disponíveis e encerrados.
Implementação da função fetchSymplaEvents para fazer requisições à API do Sympla e obter eventos futuros ou passados.
Implementação da função intArrayToString para converter uma lista de inteiros em uma string.
Implementação da função formatEventsMessage para formatar a 9ensagem a ser enviada ao usuário com base nos eventos encontrados.
Função main que carrega as variáveis de ambiente, cria uma instância do bot e inicia sua execução.
“bytes”
“encoding/json”
“fmt”
“io/ioutil”
“net/http”
“os”
“strings”
“github.com/joho/godotenv”
“github.com/mymmrac/telego”
th “github.com/mymmrac/telego/telegohandler”
tu “github.com/mymmrac/telego/telegoutil”
)
package main: Define que este arquivo faz parte do pacote principal do programa.
Importações: Importamos as bibliotecas necessárias para o funcionamento do bot, incluindo godotenv para lidar com variáveis de ambiente, telego para interagir com a API do Telegram e telegohandler e telegoutil para lidar com os eventos e mensagens do Telegram.
bot *telego.Bot
bh *th.BotHandler
token string
}
Bot: Definimos uma estrutura Bot que contém o bot do Telegram, o manipulador de bot e o token de autenticação.
Data []Event `json:”data”`
}
SymplaResponse: Define uma estrutura para armazenar a resposta da API do Sympla.
Country string `json:”country”`
Address string `json:”address”`
AddressAlt string `json:”address_alt”`
City string `json:”city”`
AddressNum string `json:”address_num”`
Name string `json:”name”`
Longitude float64 `json:”lon”`
State string `json:”state”`
Neighborhood string `json:”neighborhood”`
ZipCode string `json:”zip_code”`
Latitude float64 `json:”lat”`
}
Location: Define uma estrutura para armazenar informações sobre a localização de um evento.
Original string `json:”original”`
XS string `json:”xs”`
LG string `json:”lg”`
}
Images: Define uma estrutura para armazenar URLs de imagens relacionadas a um evento.
Pt string `json:”pt”`
En string `json:”en”`
Es string `json:”es”`
}
type EndDateFormats struct {
Pt string `json:”pt”`
En string `json:”en”`
Es string `json:”es”`
}
StartDateFormats e EndDateFormats: Definem estruturas para armazenar formatos de data de início e fim de um evento.
Name string `json:”name”`
Images Images `json:”images”`
Location Location `json:”location”`
StartDateFormats StartDateFormats `json:”start_date_formats”`
EndDateFormats EndDateFormats `json:”end_date_formats”`
URL string `json:”url”`
}
Event: Define uma estrutura para representar um evento, incluindo seu nome, imagens, localização, datas e URL.
bot, err := telego.NewBot(token, telego.WithDefaultDebugLogger())
if err != nil {
return nil, err
}
updates, err := bot.UpdatesViaLongPolling(nil)
if err != nil {
return nil, err
}
bh, err := th.NewBotHandler(bot, updates)
if err != nil {
return nil, err
}
return &Bot{
bot: bot,
bh: bh,
token: token,
}, nil
}
NewBot: Esta função cria uma nova instância do bot do Telegram, configura os manipuladores de atualização e retorna uma estrutura Bot inicializada.
defer b.bh.Stop()
defer b.bot.StopLongPolling()
b.registerCommands()
b.bh.Start()
}
Start: Método que inicia o bot. Ele registra os comandos e inicia o manipulador de bot para receber atualizações do Telegram.
b.registerBotCommand()
b.registerEventCommands()
}
registerCommands: Método que registra todos os comandos disponíveis do bot.
b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
infoMessage := `
👋 Bem-vindo ao Bot da Comunidade Devs Norte! 🚀
Este bot está aqui para ajudá-lo a encontrar os eventos mais recentes e emocionantes hospedados no Sympla pela nossa comunidade.
Para consultar os eventos disponíveis, basta digitar /disponiveis. E se estiver interessado nos eventos que já passaram, digite /encerrados.
Fique à vontade para explorar e participar dos eventos que mais lhe interessarem!😊
`
_, _ = bot.SendMessage(tu.Message(
tu.ID(update.Message.Chat.ID),
infoMessage,
))
}, th.CommandEqual(“start”))
}
registerBotCommand: Método que registra o comando /start, que envia uma mensagem de boas-vindas ao usuário quando o bot é iniciado.
b.registerAvailableEventsCommand()
b.registerClosedEventsCommand()
}
registerEventCommands: Método que registra os comandos relacionados aos eventos disponíveis e encerrados.
b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
events, err := fetchSymplaEvents(“future”)
if err != nil {
fmt.Println(“Erro ao buscar eventos:”, err)
return
}
message := formatEventsMessage(events)
_, _ = bot.SendMessage(tu.Message(
tu.ID(update.Message.Chat.ID),
message,
))
}, th.CommandEqual(“disponíveis”))
}
registerAvailableEventsCommand: Método que registra o comando /disponiveis, que busca e exibe eventos futuros.
b.bh.Handle(func(bot *telego.Bot, update telego.Update) {
events, err := fetchSymplaEvents(“past”)
if err != nil {
fmt.Println(“Erro ao buscar eventos:”, err)
return
}
message := formatEventsMessage(events)
_, _ = bot.SendMessage(tu.Message(
tu.ID(update.Message.Chat.ID),
message,
))
}, th.CommandEqual(“encerrados”))
}
registerClosedEventsCommand: Método que registra o comando /encerrados, que busca e exibe eventos passados.
// Define os IDs dos organizadores
organizerIDs := []int{3125215, 5478152}
// Define o serviço a ser chamado na API do Sympla com base no tipo de evento
service := “/v4/search”
if eventType == “past” {
service = “/v4/events/past”
}
// Monta o corpo da requisição
requestBody := fmt.Sprintf(`{
“service”: “%s”,
“params”: {
“only”: “name,images,location,start_date_formats,end_date_formats,url”,
“organizer_id”: %s,
“sort”: “date”,
“order_by”: “desc”,
“limit”: “6”,
“page”: 1
},
“ignoreLocation”: true
}`, service, intArrayToString(organizerIDs))
// Faz a requisição HTTP para a API do Sympla
resp, err := http.Post(“https://www.sympla.com.br/api/v1/search”, “application/json”, strings.NewReader(requestBody))
if err != nil {
return nil, err
}
defer resp.Body.Close()
// Lê a resposta da requisição
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
// Decodifica a resposta JSON em uma estrutura SymplaResponse
var symplaResp SymplaResponse
if err := json.NewDecoder(bytes.NewReader(body)).Decode(&symplaResp); err != nil {
return nil, err
}
// Retorna os eventos encontrados na resposta
return symplaResp.Data, nil
}
fetchSymplaEvents: Esta função faz uma requisição para a API do Sympla para buscar eventos, com base no tipo de evento (futuro ou passado), e retorna uma lista de eventos encontrados.
strArr := make([]string, len(arr))
for i, num := range arr {
strArr[i] = fmt.Sprint(num)
}
return “[” + strings. Join(strArr, “,”) + “]”
}
intArrayToString: Esta função converte uma lista de inteiros em uma string formatada para ser usada na construção do corpo da requisição para a API do Sympla.
message := “#BOT Devs Norte 🤖nnn”
if events == nil || len(events) == 0 {
message += “Ops… Nem um evento disponivel no momento, mas não fique triste logo estaremos fazendo mais eventos! 🥺nnn”
} else {
message += “🎉 Eventos: 🎉nnn”
for _, event := range events {
message += fmt.Sprintf(“- %sn Local: %sn Data: %sn URL: %sn nnn”, event. Name, event.Location.City, event.StartDateFormats.Pt, event.URL)
message += “—————————————-nnn”
}
}
return message
}
}
formatEventsMessage: Esta função formata uma mensagem a ser enviada ao usuário com base nos eventos encontrados.
// Carrega as variáveis de ambiente do arquivo .env
if err := godotenv.Load(); err != nil {
fmt.Println(“Erro ao carregar o arquivo .env:”, err)
os.Exit(1)
}
// Obtém o token do bot do Telegram das variáveis de ambiente
token := os.Getenv(“TELEGRAM_BOT_TOKEN”)
if token == “” {
fmt.Println(“Token do bot do Telegram não fornecido”)
os.Exit(1)
}
// Cria uma nova instância do bot e inicia sua execução
bot, err := NewBot(token)
if err != nil {
fmt.Println(err)
os.Exit(1)
}
bot.Start()
}
main: A função main é o ponto de entrada do programa. Ela carrega as variáveis de ambiente do arquivo .env, obtém o token do bot do Telegram, cria uma instância do bot e inicia sua execução.
Passo 5: Executar o Código
No diretório do projeto.
execute o código Go:
Isso iniciará o bot do Telegram. Agora você pode acessar o bot no Telegram e interagir com ele usando os comandos /start, /disponiveis e /encerrados.
Você pode encontrar o código completo do projeto no repositório GitHub aqui.
Espero que essa explicação detalhada ajude a entender como o código funciona e como cada parte contribui para o funcionamento do bot do Telegram. Se tiver mais alguma dúvida ou precisar de mais alguma explicação, estou à disposição!