Cómo crear un Bot de Telegram Seguro

Telegram tiene alrededor de un billón de usuarios activos al mes y es una parte fundamental de las dApps y comunidades Web3. Sin embargo, muchos bots de Telegram aún usan de métodos de interacción inseguros. Al completar esta guía, conocerás una mejor manera de conectar a los usuarios con aplicaciones decentralizadas a través de Telegram. Este tutorial te mostrará cómo autenticar usuarios de Telegram con sus wallets Web3, sin acceder nunca a sus claves privadas. En este tutorial aprenderás a: Crear un bot de Telegram seguro: Construir un bot que autentique usuarios mediante firmas de wallets Web3 sin almacenar llaves privadas. Implementar firmas ERC-712: Crear un flujo de autenticación donde el usuario firma mensajes en un formato legible. Implementar autenticación flexible: A través de telegram los usuarios pueden interactuar con cualquier tipo de aplicación, desde grupos secreatos hasta cualquier tipo de transacción ya sea en DeFi o airdrops. Para ver el proyecto completo, revisa el código completo. Flujo de la apliación. 1. Crea un nuevo bot de Telegram Crear un bot de Telegram es muy sencillo. Puedes hacerlo enviando un mensaje directo a la cuenta de Telegram @BotFather. Solo envíale el comando /newbot, sigue las instrucciones y obtendrás un token que usaremos para interactuar con la librería de Telegram en el siguiente paso. Envía /newbot al @botfather para crear un nuevo Bot de Telegram. 2. Lanza el backend del bot de Telegram Comencemos instalando las dependencias. Pero antes de eso, asegúrate de tener Node.js instalado. Te recomiendo usar nvm para instalarlo. Una vez que tengas Node.js instalado, puedes instalar las dependencias con el siguiente comando: npm install node-telegram-bot-api ethers dotenv express cors Now, let's create the .env file with the following variables: .env BOT_TOKEN=your_telegram_bot_token CHAIN_ID=534352 WEB_DAPP_URL=http://localhost:3000 No olivdés crear el archivo .gitignore para evitar subir el archivo .env a un repositorio público. .gitignore .env node_modules Este es el archivo bot.js, que lanza un bot que escucha mensajes de Telegram y verifica la firma. Los bots de Telegram usan polling para recibir mensajes localmente, lo que significa que estarán haciendo llamadas constantes a los servidores de Telegram en busca de nuevos mensajes. En un entorno de producción con muchos usuarios, esto podría ser un problema, por lo que deberías usar el método de webhook y alojar el servidor de forma remota. Para este tutorial usaremos el método de polling localmente. Si quieres aprender más sobre el método de webhook, puedes consultar la documentación de la API de Bots de Telegram. Cuando el usuario envía el comando authenticate al bot, este le responderá con un mensaje para que visite la dApp web. La dApp web firmará un mensaje y lo enviará al bot, que verificará la firma y enviará un mensaje de bienvenida al usuario. bot.js // Usaremos la biblioteca oficial node-telegram-bot-api para interactuar con la API de Telegram y ethers para verificar la firma const TelegramBot = require("node-telegram-bot-api"); const { ethers } = require("ethers"); require("dotenv").config(); const express = require("express"); const cors = require("cors"); const bot = new TelegramBot(process.env.BOT_TOKEN, { polling: true }); const CHAIN_ID = process.env.CHAIN_ID; const WEB_DAPP_URL = process.env.WEB_DAPP_URL; const app = express(); app.use(cors()); app.use(express.json()); // Inicia el bot de Telegram y el servidor API que recibe la firma y la verifica (async () => { try { bot.botInfo = await bot.getMe(); app.listen(8080, () => { console.log("\nServer is running on port 8080"); console.log("Bot is running..."); }); } catch (error) { console.error(error); process.exit(1); } })(); // El endpoint /verify se usa para verificar la firma y enviar un mensaje de bienvenida al usuario app.post("/verify", async (req, res) => { const { userId, message, signature } = req.body; try { const signerAddress = await getAuthenticationSigner(userId, message, signature); await bot.sendMessage( Number(userId), `Welcome! You're authenticated as ${signerAddress}.\n\nEnjoy your welcome gift!

Apr 15, 2025 - 19:26
 0
Cómo crear un Bot de Telegram Seguro

Telegram tiene alrededor de un billón de usuarios activos al mes y es una parte fundamental de las dApps y comunidades Web3. Sin embargo, muchos bots de Telegram aún usan de métodos de interacción inseguros.

Al completar esta guía, conocerás una mejor manera de conectar a los usuarios con aplicaciones decentralizadas a través de Telegram. Este tutorial te mostrará cómo autenticar usuarios de Telegram con sus wallets Web3, sin acceder nunca a sus claves privadas.

En este tutorial aprenderás a:

  1. Crear un bot de Telegram seguro: Construir un bot que autentique usuarios mediante firmas de wallets Web3 sin almacenar llaves privadas.
  2. Implementar firmas ERC-712: Crear un flujo de autenticación donde el usuario firma mensajes en un formato legible.
  3. Implementar autenticación flexible: A través de telegram los usuarios pueden interactuar con cualquier tipo de aplicación, desde grupos secreatos hasta cualquier tipo de transacción ya sea en DeFi o airdrops.

Para ver el proyecto completo, revisa el código completo.

Flow
Flujo de la apliación.

1. Crea un nuevo bot de Telegram

Crear un bot de Telegram es muy sencillo. Puedes hacerlo enviando un mensaje directo a la cuenta de Telegram @BotFather. Solo envíale el comando /newbot, sigue las instrucciones y obtendrás un token que usaremos para interactuar con la librería de Telegram en el siguiente paso.

bot father
Envía /newbot al @botfather para crear un nuevo Bot de Telegram.

2. Lanza el backend del bot de Telegram

Comencemos instalando las dependencias. Pero antes de eso, asegúrate de tener Node.js instalado. Te recomiendo usar nvm para instalarlo.

Una vez que tengas Node.js instalado, puedes instalar las dependencias con el siguiente comando:

npm install node-telegram-bot-api ethers dotenv express cors

Now, let's create the .env file with the following variables:

.env

BOT_TOKEN=your_telegram_bot_token
CHAIN_ID=534352
WEB_DAPP_URL=http://localhost:3000

No olivdés crear el archivo .gitignore para evitar subir el archivo .env a un repositorio público.

.gitignore

.env
node_modules

Este es el archivo bot.js, que lanza un bot que escucha mensajes de Telegram y verifica la firma. Los bots de Telegram usan polling para recibir mensajes localmente, lo que significa que estarán haciendo llamadas constantes a los servidores de Telegram en busca de nuevos mensajes. En un entorno de producción con muchos usuarios, esto podría ser un problema, por lo que deberías usar el método de webhook y alojar el servidor de forma remota.

Para este tutorial usaremos el método de polling localmente. Si quieres aprender más sobre el método de webhook, puedes consultar la documentación de la API de Bots de Telegram.

Cuando el usuario envía el comando authenticate al bot, este le responderá con un mensaje para que visite la dApp web. La dApp web firmará un mensaje y lo enviará al bot, que verificará la firma y enviará un mensaje de bienvenida al usuario.

bot.js

// Usaremos la biblioteca oficial node-telegram-bot-api para interactuar con la API de Telegram y ethers para verificar la firma
const TelegramBot = require("node-telegram-bot-api");
const { ethers } = require("ethers");
require("dotenv").config();
const express = require("express");
const cors = require("cors");

const bot = new TelegramBot(process.env.BOT_TOKEN, { polling: true });
const CHAIN_ID = process.env.CHAIN_ID;
const WEB_DAPP_URL = process.env.WEB_DAPP_URL;

const app = express();
app.use(cors());
app.use(express.json());

// Inicia el bot de Telegram y el servidor API que recibe la firma y la verifica
(async () => {
    try {
        bot.botInfo = await bot.getMe();
        app.listen(8080, () => {
            console.log("\nServer is running on port 8080");
            console.log("Bot is running...");
        });
    } catch (error) {
        console.error(error);
        process.exit(1);
    }
})();

// El endpoint /verify se usa para verificar la firma y enviar un mensaje de bienvenida al usuario
app.post("/verify", async (req, res) => {
    const { userId, message, signature } = req.body;
    try {
        const signerAddress = await getAuthenticationSigner(userId, message, signature);
        await bot.sendMessage(
            Number(userId), 
            `Welcome! You're authenticated as ${signerAddress}.\n\nEnjoy your welcome gift!