Crear un bot de Telegram con Nutgram – mensajes más elegantes

Seguimos con la serie de bots y Telegram que empezó aquí.

En el último post nos quedamos con un código que era capaz de responder a mensajes recibidos por el bot:

<?php
require __DIR__ . '/vendor/autoload.php';
require 'config.php';

use SergiX44\Nutgram\Nutgram;
use SergiX44\Nutgram\Configuration;
use SergiX44\Nutgram\RunningMode\Polling;

$config = new Configuration(
    clientTimeout: 10,
);

$botToken = BOT_TOKEN;
$bot = new Nutgram($botToken, $config);

$bot->setRunningMode(Polling::class);

$bot->onMessage(function (Nutgram $bot) {
    $bot->sendMessage('Me encanta que me escribas aunque no te entienda');
});

$bot->run();

Pero ¿qué es lo que hace este código? Vamos a verlo por partes.

Este post es posible gracias a Urlan Heat – empresa de desarrollo especializada en PHP.

El modo polling y el modo WebHook

Lo primero que hace es ponerse en modo Polling:

$bot->setRunningMode(Polling::class);

El modo pollin básicamente quiere decir que se va a consultar a la API de Telegram a ver si hay nuevos mensajes.

Existe otro modo que es el de WebHook. Para usar este modo necesitamos un servidor web que atienda a las llamadas que nos mande la API de Telegram. Cuando un usuario envía un mensaje a nuestro bot la API nos lo comunicará a través de un WebHook.

Ya hablaremos de Webhooks más adelante.

¿Puedo usar el modo «polling» en producción?

El modo polling es muy cómodo para aprender y para hacer pruebas, pero no es lo recomendado para producción.

En un servidor de producción deberíamos usar el modo «webhook». Pero, insisto, por ahora no te preocupes de ésto.

El modo polling en acción

Lo siguiente que hace nuestro código es definir qué acciones se tienen que realizar cuando el usuario haga algo.

Eso es lo que hacemos aquí:

$bot->onMessage(function (Nutgram $bot) {
    $bot->sendMessage('Me encanta que me escribas aunque no te entienda');
});

Cuando el bot mande algún mensaje (sea lo que sea) esta función anónima se encargará de atenderlo.

Y lo que hará será enviar un tonto mensaje.

Por último hacemos que nuestro script entre en un bucle infinito que se dedica a comprobar si hay mensajes nuevos:

$bot->run();

Mensajes más elegantes: negrita, curviva, tachado, etc.

Los mensajes que estamos mandando son una birria absoluta. En el soso y aburrido texto plano.

Pero podemos hacer que nuestro bot envíe mensajes más elegantes.

Por ejemplo, podemo usar

Lo podemos conseguir usando markdown v2, markdown legacy o html.

Yo soy más de markdown v2… manías que tiene uno.

Aquí tienes el listado completo de elementos que puedes usar en markdown. Es lo suficientemente confuso para que te salga a la primera.

Un primer ejemplo con markdown:

$bot->onMessage(function (Nutgram $bot) {
$bot->sendMessage("*negrita* _cursiva_ *_negrita curvisa_* ~tachado~ __subrayado__ ||ofuscado||", parse_mode: ParseMode::MARKDOWN,);
});

que se vería así:

El ofuscado también lo llaman «spoiler» y está oculto hasta que «toques» el texto:

Ojito que hay algunos elementos que te van a mostrar un error si los añades al mensaje.

Por ejemplo, si añades un punto te va a dar un error. Sí, un puñetero punto te va a dar un error:

$bot->sendMessage("Este maltido puntito.", parse_mode: ParseMode::MARKDOWN,);

Este error:

Next SergiX44\Nutgram\Telegram\Exceptions\TelegramException: Bad Request: can't parse entities: Character '.' is reserved and must be escaped with the preceding '\' in /var/www/html/vendor/nutgram/nutgram/src/Telegram/Client.php:369

¿Y cómo lo evitas? Pues «escapándolo» (añandiendo la dichosa ‘\’):

$bot->sendMessage("Este maltido puntito\.", parse_mode: ParseMode::MARKDOWN,);

Esto es porque algunos caracteres están reservados.

Bloques

También podemos usar el carácter «>» para indicar que algo se muestre como un bloque:

Para mostrar este bloque usaríamos algo así:

$bot->sendMessage(">Un bloque\n>en dos líneas", parse_mode: ParseMode::MARKDOWN,);

Cuidadín, que el símbolo «>» debe ser el primero de la línea. Por ejemplo, esto daría error:

$bot->sendMessage(">Un bloque>en dos líneas", parse_mode: ParseMode::MARKDOWN,);

(la diferencia es que he quitado el salto de línea).

Y si añadimos un espacio (o cualquier cosa) antes del «>» también tendremos un error:

$bot->sendMessage(" >Un bloque\n>en dos líneas", parse_mode: ParseMode::MARKDOWN,);

Código PHP

Y ahora algo absolutamente innecesario pero no me he podido resistir… ¿cómo «pintar» código PHP en Telegram?

Pues así:

$bot->sendMessage("```php\n\$var=3;```", parse_mode: ParseMode::MARKDOWN,);

Y quedaría así de bonito:

Emojis

Y por último los inevitables emojis. Lo de los emojis tiene un poco de truco, pero, por ir a lo fácil y rápido puedes copiarte de esta tabla el emoji que quieras y listo: https://apps.timwhitlock.info/emoji/tables/unicode

Este código:

$bot->sendMessage("😂", parse_mode: ParseMode::MARKDOWN,);

Mostará ésto:

Y como me ha quedado un poco largo lo dejo por hoy. El próximo día hablamos de los comandos en Telegram.

No te pierdas las novedades, apúntate a nuestra newsletter o síguenos en Linkedin.

Deja un comentario