Un bot de Telegram con PHP

Este es uno de los capítulos del tutorial Exprimiendo Telegram. Crea tu propio bot para Telegram.. Encontrarás los enlaces a todos los de capítulos, al final de este artículo.

Si bien en el capítulo siete del tutorial traté como integrar Telegram con WordPress, es cierto que no todos utilizan este espectacular CMS, pero si quieren desarrollar su bot de Telegram con PHP. Es cierto, que el desarrollo de un bot de Telegram con PHP es realmente muy sencillo. Es mas, me atrevería a decir, que mas sencillo incluso que con Python, al que le he dedicado muchos capítulos de este tutorial. Sin embargo, entiendo que lo mejor es verlo para comprender tanto su manejo, como su funcionamiento.

Así, en este nuevo capítulo del tutorial sobre crear tu propio bot de Telegram, podrás seguir paso a paso, la implementación de un bot de Telegram con PHP.

Bot de Telegram con PHP

Bot de Telegram con PHP

Creación del BOT

Evidentemente lo primero es crear el bot. Esta parte es completamente agnóstica del lenguaje de programación que utilices. Por supuesto, también del framework, en caso de que hagas uso de uno de ellos para facilitarte el trabajo.

Para este primer paso de creación del bot, tienes que seguir el capítulo de introducción de crear tu propio bot para Telegram. Necesitarás recurrir al bot creador de bots, a BotFather, y utlizar el comando /newbot.

Tal y como comento en ese capítulo del tutorial, te recomiendo que personalices el bot. Es decir, definas una descripción, el acerca de y sobre todo una imagen. Al final son cuatro cosillas, pero le dan mas empaque a tu bot.

El webhook

Una vez creado nuestro bot utilizando a BotFather, tenemos que definir el webhook. El webhook, no es mas que una dirección, una url, a la que llamará Telegram cada vez que se produzca una actualización en el grupo. Me refiero al grupo donde hayas unido a tu bot. Ten en cuenta, que para recibir determinadas actualizaciones, es necesario que tu bot sea administrador. Es decir, no es suficiente con que tengas al bot en el grupo que quieres administrar, es necesario que ese bot, sea administrador.

¿Como definimos el webhook? Para definir el webhook, tenemos que hacer una llamada de tipo GET a la API de Telegram. Una llamada como esta,

curl --request GET \
  --url 'https://api.telegram.org/<TOKEN>/setWebhook?url=<URL>

Donde debes sustituir,

  • <TOKEN> por el token obtenido en el proceso de creación del bot con botFather
  • <URL> la dirección donde está alojado tu bot. Esta dirección es a la que llamará Telegram cada vez que se produzca una actualización en el grupo en el que se encuentra el bot. El grupo o los grupos.

Para deshabilitar el webhook, tenemos otra llamada a la API de Telegram,

curl --request GET \
  --url https://api.telegram.org/bot<TOKEN>/deleteWebhook

Donde debes sustituir, <TOKEN> conforme a lo indicado en el procedimiento anterior.

Por último, además de habilitar y deshabilitar el webhook, también es posible obtener información de la situación del token. En este caso, la llamada a la API es la siguiente,

curl --request GET \
  --url https://api.telegram.org/bot<TOKEN>/getWebhookInfo

Procediendo de igual forma que en pasos anteriores.

Sobre el webhook

Es interesante que la dirección del webhook sea relativamente compleja. ¿Porque? Para evitar llamadas inoportunas a esa dirección. No tiene mucho sentido que la dirección sea webhook.php. Lo conveniente sería una dirección como f8cea65d-8b64-4daa-a166-7a409abe7cab.php.

Implementando el bot de Telegram con PHP

Lo primordial para que tu bot de Telegram con PHP se comporte como tal es que sepa procesar cada llamada que provenga de Telegram. Así la parte importante del archivo f8cea65d-8b64-4daa-a166-7a409abe7cab.php es la siguiente,

$request = file_get_contents("php://input");
$request = json_decode($request);

La primera línea lee la llamada de Telegram, mientras que la segunda línea la trata como un json. A partir de ese momento se puede tratar como un objeto.

¿Que le llega a nuestro bot de Telegram con PHP?

Cada vez que hay una llamada de Telegram, nuestro bot recibirá un contenido similar al que puedes ver a continuación,

{
    "update_id":5432101,
    "message":{
        "message_id":123,
        "from":{
            "id":123345697,
            "is_bot":false,
            "first_name":"Nombre",
            "last_name":"Apellido"
        },
        "chat":{
            "id":-987654321,
            "id":-365821568,
            "title":"Bot Prueba",
            "type":"group",
            "all_members_are_administrators":false
        },
        "date":1551878388,
        "left_chat_participant":{
            "id":716851483,
            "is_bot":true,
            "first_name":"El nombre del bot",
            "username":"username_bot"
        },
        "left_chat_member":{
            "id":765432101,
            "is_bot":true,
            "first_name":"El nombre del bot",
            "username":"username_bot"
            "username":"linux_center_bot"
        }
    }
}

En particular este mensaje se corresponde con el de salida de un miembro del grupo. Para el caso de un mensaje, sería algo similar a este otro,

{
   {
   "update_id":5432102,
   "message":{
        "message_id":124,
        "from":{
            "id":123345698,
            "is_bot":false,
            "first_name":"pepe",
            "username":"gotera",
            "language_code":"es"
        },
        "chat":{
            "id":-987654321,
            "id":-365821568,
            "title":"Bot Prueba",
            "type":"group",
            "all_members_are_administrators":false
        },
        "date":1551766912,
        "text":"texto de prueba"
   }
}

En esta segunda actualización, ya ves un mensaje. Se identifica el emisor, dejando claro si es un bot o no lo es, el chat, en el que se produce la actualización, así como el contenido del mensaje y la fecha en la que se produce.

Con todos estos datos ya puedes tomar diferentes acciones en función de lo que quieras que haga tu bot.

Log

Es conveniente habilitar un Log, un registro. Al menos inicialmente, para comprobar que el bot se comporta como esperas, de otra forma estarás completamente perdido. Esto de habilitar el log, es tan sencillo como añadir un par de líneas de código,

$request = file_get_contents("php://input");
$fecha = date('Y-m-d H:i:s');
file_put_contents("registro_de_actualizaciones.log", $fecha.' - '.$request, FILE_APPEND);
$request = json_decode($request);

De esta manera tan sencilla, cada vez que se produzca una actualización la podremos inspeccionar. Además, esto lo podemos hacer en tiempo real, ejecutando la siguiente instrucción en un terminal,

tail -f registro_de_actualizaciones.log

Enviar un mensaje

Para enviar un mensaje, puedes utilizar la misma función que utilizaste en el capítulo de integrar Telegram con WordPress. Allí definí la función http_post($url, $json). Esto lo combinaremos con la URL a la que tenemos que atacar combinada con el token proporcionado por BotFather,

$TOKEN = "123456789:AbCdEfgfewq43erq32q90qaewfdsaeqw890";
$URL = "https://api.telegram.org/bot$TOKEN"; 

Así la función para enviar mensajes queda conforme sigue,

function sendMessage($chat_id, $text)
{
    global $URL;
    $json = ['chat_id'       => $chat_id,
             'text'          => $text,
             'parse_mode'    => 'HTML'];
    return http_post($URL.'/sendMessage', $json);
}

Un bot echo

Un ejemplo combinando las distintas partes que hemos visto, sería el siguiente,

sendMessage($request->message->chat->id, $request->message->text);

El objeto de este bot es repetir cada uno de los mensajes que se producen en el grupo. Como has visto de las actualizaciones, toda esta información la sacamos de allí. En particular, el id del chat que queda definido como $request->message->chat->id. De la misma forma el mensaje de texto contenido en la actualización $request->message->text.

Recibiendo nuevo usuarios

Siguiendo con los ejemplos, un bot mas práctico, nos permitiría dar la bienvenida a cada nuevo usuario. Esto, simplificando sería algo como

$message = "Hola $first_name, bienvenido a tu grupo".
sendMessage($request->message->chat->id, $message);

Respecto a esto tienes que identificar el tipo de mensaje que se produce cuando entra un usuario nuevo en el grupo. Y también tendrías el problema de que le darías la bienvenida a un usuario que se hubiera ido del grupo y que ahora vuelva. En este caso, sería mas interesante darle otro tipo de recibimiento, pero para eso, es necesario guardes la información de los usuarios en una base de datos…, pero esto ya es harina de otro costal.

Conclusiones

Como ves es muy similar este procedimiento al que utilicé en la integración con WordPress. Allí, por supuesto, tenemos el framework propio, que nos permite hacer las cosas de una manera mas elegante. Pero el procedimiento es exactamente el mismo.

Deja un comentario

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