Categorías
Linux Telemática

Telegram bot

Desde el año pasado, Telegram permite crear bots para poder interaccionar con un servidor de manera automática.

La manera de crear un bot se realiza a través del BotFather, un bot de Telegram que permite crear el tuyo propio. Una vez hayamos creado nuestro bot, BotFather nos dará un token. Este token es un identificador único que solo debes saber tú ya que te dará acceso a realizar cualquier acción sobre tu bot.

Una vez creado el bot, podemos enviarle mensajes, sin embargo, nadie contestará. Existen dos maneras para acceder a los mensajes que se hayan enviado por un usuario. La primera es mediante el método getUpdates, que básicamente consiste en una escucha activa mediante un bucle para detectar que alguien nos ha enviado un mensaje. Para comprobar rápidamente que los mensajes no están llegando, podemos pegar esta URL en el navegador, cambiando MYTOKEN por nuestro token real:

https://api.telegram.org/botMYTOKEN/getUpdates

De esta manera podremos ver qué mensajes están pendientes de ser respondidos.

Para responder desde el navegador, podemos utilizar el método sendMessage:

https://api.telegram.org/botMYTOKEN/sendMessage?chat_id=CHATID&text=TEXTO

En el que tendremos que cambiar MYTOKEN por nuestro token, CHATID por el ID del chat al cual queramos respondes y que habremos obtenido del método getUpdates (ver captura anterior), y TEXT por el texto que queramos enviar.

Sin embargo, con este método ya se ve que no es demasiado cómodo utilizar un bot de Telegram.

La mejor opción es utilizar un webhook. Un webhook es un archivo PHP (o cualquier otro lenguaje que podamos correr en nuestro servidor como Python, Ruby o Java) en el que cada vez que alguien envíe un mensaje a nuestro bot, Telegram hará una llamada automática a este archivo.

De esta manera podremos automatizar totalmente la interacción con nuestro bot.
Para decirle a Telegram dónde se encuentra nuestro webhook, es necesario ejecutar la siguiente URL:

https://api.telegram.org/botMYTOKEN/setWebhook?url=https://example.com/folder/file.php

Es muy importante que nuestro servidor tenga cifrado SSL para poder hacer peticiones HTTPS sobre él. Si no dispones de uno, te recomiendo que instales el certificado de Let’s Encrypt, el cual permite crear un certificado SSL de manera totalmente gratuita. Si por el contrario tienes un certificado autofirmado, Telegram te explica como enviarles tu clave pública del certificado.

El código PHP que he utilizado para mi bot es el siguiente:

<?php
 
$bottoken = "MYTOKEN";
$website = "https://api.telegram.org/bot".$bottoken;
 
$update = file_get_contents('php://input');
$update = json_decode($update, TRUE);
 
$chatId = $update["message"]["chat"]["id"];
$message = $update["message"]["text"];
 
switch($message) {
        case "/comando1":
                sendMessage($chatId, "Has enviado el comando 1");
                break;
        case "/comando2":
                sendMessage($chatId, "Has enviado el comando 2");
                break;
        default:
                sendMessage($chatId, "default");
}
 
function sendMessage ($chatId, $message) {
 
        $url = $GLOBALS['website']."/sendMessage?chat_id=".$chatId."&text=".urlencode($message);
        file_get_contents($url);
 
}
 
?>

De esta manera, podemos responder a cada comando que hayamos definido en el BotFather de manera personalizada.

6 respuestas a «Telegram bot»

Buenas tardes.
Y si una vez entrando a un case del switch, dentro del case quisiera volver a actualizar para tomar otra decisión, que se podría hacer? Intente hacer un loop para que se actualizara pero por mas mensajes que vuelvo a enviar no cacha el último y se queda trabado. Sería como hacer un sub menu.

Hola Adrián,

En del case del switch puedes hacer lo que mejor se ajuste a tus necesidades. Puedes utilizar condicionales o incluso más switch statements. Para mantener la legibilidad del código yo sugeriría usar otro switch ya que de ese modo es fácil entender cuál es el proceso completo de decisión.

Échale un vistazo a este ejemplo:
https://www.php.net/manual/pt_BR/control-structures.switch.php#21520

Saludos,
Rubén

Gracias por tu pronta respuesta!
La parte del switch la tengo clara, lo que no entiendo cómo resolver es la parte de volver a leer la información que el usuario ingrese en el bot. Lo intente volviendo a poner el file_get_contents y JSON decode pero se traba y no me lee nuevos mensajes…

Si estás utilizando el webhook, Telegram hará una llamada al archivo cada vez que haya actividad en el bot. De ese modo, lo que necesitarías es mantener el valor de una variable entre diferentes llamadas. Esto se debería poder conseguir en PHP mediante variables estáticas. Prueba a encapsular la toma de decisiones (el switch) dentro de una función y guarda cada valor recibido en una variable que hayas declarado como static. De ese modo deberías poder acceder tanto al valor anterior (primera decisión) como al actual (segunda decisión). Este método debería ser extensible a cualquier número de decisiones anteriores utilizando un array o diferentes variables declaradas como static.

Puedes encontrar más información aquí:
https://www.php.net/manual/en/language.variables.scope.php#language.variables.scope.static

Saludos,
Rubén

Hola Rubén, seguí todos los paso ejecute el webhook, etc. Pero al mandarle a mi bot /comando1 no responde nada. ya cree los comandos y todo como detallas. podrías ayudarme con esto ? (también controle el token)

Deja una respuesta

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

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.