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.
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" });
});
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
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.
Saludos amigo, me gustaría saber más a cerca de programar para hacer bot de telegram,
Espero puedas contactarme
Telegram:
Saludos
Saludos. Claro que sí, estoy disponible en https://parzibyte.me/#contacto