Chatbots en Go: Escribiendo un asistente rápido y confiable desde cero

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

¿Por qué Go es la elección ideal para chatbots?

\n\n

Si alguna vez has escrito un chatbot en Python, sabes que funciona. Pero cuando la carga crece a miles de peticiones por segundo, Python comienza a "pensar". Go (o Golang) está creado para no pensar — simplemente hace. El alto rendimiento, la compatibilidad integrada con redes, las gorutinas (hilos ligeros) y el consumo mínimo de memoria convierten a Go en el mejor lenguaje para crear chatbots de alta carga.

\n\n

En esta guía crearemos un bot completo de Telegram en Go que procesará comandos, trabajará con la API y se escalará fácilmente. Obtendrás no solo teoría, sino código listo que puedes ejecutar en 5 minutos.

\n\n

¿Qué vamos a construir?

\n\n

Nuestro bot en Go podrá:

\n
    \n
  • Responder al comando /start con un saludo.
  • \n
  • Recibir mensajes de texto y devolverlos en mayúsculas (un bot eco con "personalidad").
  • \n
  • Manejar errores y registrar acciones.
  • \n
  • Funcionar a través de la API de Telegram Bot (el escenario más popular para chatbots).
  • \n
\n\n

Todo el código estará escrito en Go puro sin bibliotecas externas (solo la biblioteca estándar y el cliente HTTP), para que entiendas cómo funciona todo "bajo el capó".

\n\n

Paso 1: Preparación del entorno

\n\n

Asegúrate de tener Go instalado (versión 1.21+). Puedes verificarlo con el comando:

\n\n
go version
\n\n

Crea un nuevo directorio para el proyecto e inicializa el módulo:

\n\n
mkdir go-chat-bot\ncd go-chat-bot\ngo mod init github.com/tunombre/go-chat-bot
\n\n

Necesitarás un token de bot. Si no lo tienes:

\n
    \n
  1. Escribe en Telegram a @BotFather.
  2. \n
  3. Envía el comando /newbot y sigue las instrucciones.
  4. \n
  5. Copia el token obtenido (se ve así: 123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11).
  6. \n
\n\n

Guarda el token en una variable de entorno (¡nunca guardes los tokens en el código!):

\n\n
export BOT_TOKEN="tu_token_aquí"
\n\n

Paso 2: Estructura básica del bot en Go

\n\n

Crea el archivo main.go. Comenzaremos con un servidor HTTP simple que recibirá actualizaciones de Telegram. Go es ideal para esto gracias al paquete integrado net/http.

\n\n
package main\n\nimport (\n    "encoding/json"\n    "fmt"\n    "io"\n    "log"\n    "net/http"\n    "os"\n    "strings"\n)\n\n// Update — estructura de la actualización entrante de Telegram\ntype Update struct {\n    UpdateID int `json:"update_id"`\n    Message  struct {\n        Text string `json:"text"`\n        Chat struct {\n            ID int64 `json:"id"`\n        } `json:"chat"`\n    } `json:"message"`\n}\n\nfunc main() {\n    botToken := os.Getenv("BOT_TOKEN")\n    if botToken == "" {\n        log.Fatal("BOT_TOKEN no está configurado")\n    }\n\n    http.HandleFunc("/webhook", func(w http.ResponseWriter, r *http.Request) {\n        handleWebhook(w, r, botToken)\n    })\n\n    log.Println("Bot iniciado en :8080")\n    log.Fatal(http.ListenAndServe(":8080", nil))\n}\n\nfunc handleWebhook(w http.ResponseWriter, r *http.Request, token string) {\n    body, err := io.ReadAll(r.Body)\n    if err != nil {\n        log.Printf("Error al leer el cuerpo de la solicitud: %v", err)\n        http.Error(w, "Bad Request", http.StatusBadRequest)\n        return\n    }\n    defer r.Body.Close()\n\n    var update Update\n    if err := json.Unmarshal(body, &update); err != nil {\n        log.Printf("Error al analizar JSON: %v", err)\n        http.Error(w, "Bad JSON", http.StatusBadRequest)\n        return\n    }\n\n    // Si el mensaje está vacío, lo ignoramos\n    if update.Message.Text == "" {\n        return\n    }\n\n    log.Printf("Mensaje recibido: %s", update.Message.Text)\n\n    // Formamos la respuesta\n    var replyText string\n    if strings.HasPrefix(update.Message.Text, "/start") {\n        replyText = "¡Hola! Soy un bot en Go. Escríbeme algo y te lo devolveré en mayúsculas."\n    } else {\n        replyText = strings.ToUpper(update.Message.Text)\n    }\n\n    // Enviamos la respuesta a través de la API de Telegram\n    apiURL := fmt.Sprintf("https://api.telegram.org/bot%s/sendMessage", token)\n    payload := fmt.Sprintf(`{"chat_id":%d,"text":"%s"}`, update.Message.Chat.ID, replyText)\n\n    resp, err := http.Post(apiURL, "application/json", strings.NewReader(payload))\n    if err != nil {\n        log.Printf("Error al enviar mensaje: %v", err)\n        return\n    }\n    defer resp.Body.Close()\n\n    log.Printf("Respuesta enviada: %s", replyText)\n}\n
\n\n

Este código crea un servidor HTTP en el puerto 8080 que acepta webhooks de Telegram. Cuando llega un mensaje, el bot verifica si es el comando /start y responde con un saludo. Para cualquier otro texto, lo devuelve en mayúsculas.

\n\n

Paso 3: Configuración del webhook en Telegram

\n\n

Para que Telegram envíe actualizaciones a nuestro servidor, necesitamos configurar un webhook. Si estás probando localmente, usa ngrok para crear un túnel HTTPS:

\n\n
ngrok http 8080
\n\n

Obtendrás una URL como https://1234.ngrok.io. Luego configura el webhook en Telegram:

\n\n
curl -F "url=https://tu-dominio.ngrok.io/webhook" https://api.telegram.org/bot<TU_TOKEN>/setWebhook
\n\n

¡Importante! Telegram solo acepta conexiones HTTPS. En producción, despliega tu bot en un servidor con certificado SSL (por ejemplo, usando un proxy inverso con Nginx).

\n\n

Paso 4: Prueba del bot

\n\n

Ejecuta tu bot:

\n\n
go run main.go
\n\n

Abre Telegram, encuentra tu bot y escribe /start. Deberías recibir un saludo. Luego escribe cualquier texto y el bot te lo devolverá en mayúsculas. ¡Felicidades! Has creado tu primer chatbot en Go.

\n\n

¿Qué sigue?

\n\n

Este es solo el comienzo. Puedes expandir el bot añadiendo:

\n
    \n
  • Manejo de comandos: /help, /weather, etc.
  • \n
  • Teclados inline para una interfaz más interactiva.
  • \n
  • Base de datos (PostgreSQL, Redis) para almacenar el estado del usuario.
  • \n
  • Gorutinas para manejar múltiples conversaciones simultáneamente sin bloqueos.
  • \n
\n\n

Go te proporciona el rendimiento y la simplicidad necesarios para crear bots que manejen millones de usuarios. ¡Empieza a construir el tuyo hoy mismo!

Blogs

Book Recommendations