Bot de Telegram con base de datos MySQL

Telegram y MySQL: conexión usando bot

En este post vamos a ver cómo realizar la conexión de Telegram con MySQL a través de un bot, de modo que podamos guardar y consultar datos de una base de datos de MySQL desde Telegram.

Telegram bot con MySQL - Listar e insertar registros a base de datos con comandos
Telegram bot con MySQL – Listar e insertar registros a base de datos con comandos

Con lo que veremos vamos a poder insertar datos en una tabla de MySQL desde Telegram y cualquier chat (siempre y cuando nuestro bot pueda leer los mensajes).

También vamos a ver cómo guardar el nombre del usuario y la fecha de envío del mensaje. Será un CRUD (sin Update) básico pero puedes partir del mismo para hacer cosas más específicas.

Descripción del bot

Como lo dice el título, vamos a hacer un bot de Telegram que va a conectarse con MySQL. En este caso voy a programarlo con JavaScript del lado del servidor usando Node.

Recuerda que los bots de Telegram pueden ser programados en varios lenguajes de programación, pero esta vez he decidido usar JS.

Conexión con MySQL

Lo primero que vamos a ver es cómo conectar solo Node y MySQL.

Tenemos el archivo de conexión en donde leemos el host, usuario, nombre de la base de datos y contraseña de un archivo .env:

const mysql = require("mysql");
// Coloca aquí tus credenciales
module.exports = mysql.createPool({
  host: process.env.MYSQL_HOST,
  user: process.env.MYSQL_USER,
  password: process.env.MYSQL_PASSWORD,
  database: process.env.MYSQL_DATABASE,
});

Nota importante: en donde sea que vayas a importar la conexión, antes debes invocar a require("dotenv").config(); para que las variables del entorno sean cargadas. Alternativamente puedes simplemente escribir los datos de la conexión directamente en el código.

Recuerda que la base de datos debe existir, así como las tablas que vamos a usar para insertar, obtener datos y eliminarlos. En mi caso el esquema queda así:

CREATE TABLE mascotas(
    id integer NOT NULL AUTO_INCREMENT,
    nombre varchar(255),
    creada_por varchar(255) NOT NULL,
    timestamp_mensaje BIGINT UNSIGNED NOT NULL,
    PRIMARY KEY(id)
);

Va a ser un simple CRUD de Telegram con MySQL en donde vamos a trabajar con mascotas, guardando además el usuario que la ha registrado y la marca de tiempo del mensaje.

Controlador de MySQL

Ya tenemos la conexión, ahora falta algo que nos ayude a interactuar con la base de datos y realizar las operaciones. Yo he creado un controlador:

const conexion = require("./conexion")
module.exports = {
    insertar(nombre, creadoPor, timestampMensaje) {
        conexion.query
        return new Promise((resolve, reject) => {
            conexion.query(`insert into mascotas
            (nombre, creada_por, timestamp_mensaje)
            values
            (?, ?, ?)`,
                [nombre, creadoPor, timestampMensaje], (err, resultados) => {
                    if (err) reject(err);
                    else resolve(resultados.insertId);
                });
        });
    },
    obtener() {
        return new Promise((resolve, reject) => {
            conexion.query(`select id, nombre, creada_por,timestamp_mensaje
            from mascotas`,
                (err, resultados) => {
                    if (err) reject(err);
                    else resolve(resultados);
                });
        });
    },
    eliminar(id) {
        return new Promise((resolve, reject) => {
            conexion.query(`delete from mascotas
            where id = ?`,
                [id],
                (err) => {
                    if (err) reject(err);
                    else resolve();
                });
        });
    },
}

Como puedes ver, estoy importando la conexión en la parte superior. Estamos exponiendo 3 operaciones básicas, ahora solo vamos a invocarlas desde Telegram.

Telegram y MySQL

Finalmente en el index.js creamos el bot y escuchamos comandos. En este caso lo hice sin botones o cosas complejas para que todo quede simple y nos enfoquemos en la conexión entre la base de datos MySQL y Telegram.

Primero veamos cómo insertar (hacer insert) un dato:

bot.onText(new RegExp('\/insertar (\\d+|\\w+)'), async (mensaje, coincidencias) => {
    const nombre = coincidencias[1];
    const chatId = mensaje.chat.id;
    const nombreUsuario = mensaje.from.first_name;
    const timestampMensaje = mensaje.date;
    await controlador.insertar(nombre, nombreUsuario, timestampMensaje);
    bot.sendMessage(chatId, nombreUsuario + " quiere insertar mascota llamada " + nombre);
});

Estamos usando expresiones regulares porque en este caso el usuario va a enviar un comando como /insertar Guayaba y tenemos que extraer el nombre de la mascota, por ello es que accedemos a las coincidencias o matches de la expresión regular.

Después de eso simplemente invocamos a insertar de nuestro controlador pasándole el nombre del usuario, la fecha y el nombre de la mascota.

Finalmente respondemos al usuario (aunque no es obligatorio responder, digamos que tu bot puede ser silencioso y registrar todos los mensajes, por ejemplo).

Nota: si tú quisieras simplemente registrar todos los mensajes entonces debes escuchar al evento message.

Listar y eliminar

Para el caso de listar (operación select) tenemos algo muy parecido. En este caso obtengo los registros como un arreglo y luego los convierto a cadena para enviarlos como un simple texto; te repito que hago esto por simplicidad:

bot.onText(new RegExp(`/listar`), async (mensaje) => {
    const chatId = mensaje.chat.id;
    const mascotas = await controlador.obtener();
    let cadena = "";
    mascotas.forEach(mascota => {
        cadena += `*ID:* ${mascota.id} *Nombre*: ${mascota.nombre} *Creada por:* ${mascota.creada_por} *Timestamp: * ${mascota.timestamp_mensaje}


`;
    });
    bot.sendMessage(chatId, cadena, { parse_mode: "markdown" });
});
Eliminar registro de base de datos con bot de Telegram, MySQL y JavaScript
Eliminar registro de base de datos con bot de Telegram, MySQL y JavaScript

Finalmente vemos el de eliminar que es muy parecido al de insertar pero ahora extraemos el id del registro que se va a eliminar:

bot.onText(new RegExp('\/eliminar (\\d+)'), async (mensaje, coincidencias) => {
    const id = parseInt(coincidencias[1]);
    const chatId = mensaje.chat.id;
    await controlador.eliminar(id);
    bot.sendMessage(chatId, "Eliminar con id " + id);
});

Así es como podemos tener un bot que elimina, lee registros y los inserta en una base de datos de MySQL, aunque obviamente podemos cambiar el motor de base de datos y el lenguaje de programación.

Por cierto, no importa desde cuál chat se envíe el mensaje, pues todos quedarán registrados en la misma base de datos.

Vídeo de apoyo

Te dejo un vídeo que explica todo lo de este post:

Poniendo todo junto

Bot de Telegram con base de datos MySQL
Bot de Telegram con base de datos MySQL

Te he mostrado los detalles más importantes del código para conectar un bot de Telegram con MySQL. El código completo lo dejo en GitHub.

Una vez que lo hayas descargado instala las dependencias con npm install, luego crea la base de datos y las tablas.

El siguiente paso es crear el archivo .env basándote en el archivo .env.example y configurar tu token para el bot (obtenido con el BotFather), host, usuario, contraseña y nombre de la base de datos de MySQL.

Finalmente ejecuta node index.js, tu bot debería estar en línea y listo para recibir comandos.

Por aquí puedes ver más bots de Telegram que he creado.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

2 comentarios en “Telegram y MySQL: conexión usando bot”

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *