Enviar mensajes a Telegram desde Laravel

Conozco a Telegram desde hace tiempo, pero nunca lo he usado tanto como hoy. En un proyecto surgió la oportunidad de poder enviar mensajes a Telegram desde Laravel, con la finalidad que los usuarios recibieran sus notificaciones personalizadas en Telegram.

Existe una manera de enviar notificaciones por Slack, de hecho está en la misma documentación de Laravel te explican como hacerlo, pero aún así quería intentar con Telegram.

Instalación

Lo primero que tenemos que hacer es instalar un paquete que tiene soporte para Laravel ‘out of the box’. Para instalar el paquete a tu proyecto es con el siguiente comando:

composer require irazasyed/telegram-bot-sdk

En el proyecto en el que trabajaba y se quería recibir mensajes en Telegram desde Laravel, use la versión 5.5, y como es bien sabido con esta versión no necesitas agregar Service Provider ni Alias.

Laravel 5.4 o anteriores

Si tu versión de Laravel es inferior a la 5.4, tienes que agregar servive providers y alias en tu archivo config/app.php

Para agregar el Service Provider tienes que agregar esta linea de código en el archivo config/app.php:

Telegram\Bot\Laravel\TelegramServiceProvider::class,

Ahí mismo tienes agregar el Alias:

'Telegram' => Telegram\Bot\Laravel\Facades\Telegram::class,

Publicar archivo de configuración

Para “publicar” y editar el archivo de configuración del paquete de Telegram, podemos ingresar este código en la consola:

php artisan vendor:publish --provider="Telegram\Bot\Laravel\TelegramServiceProvider"

De esta manera aparecerá un archivo nuevo llamado telegram.php en tu carpeta de config/ de tu proyecto Laravel.

Crear bot en la aplicación Telegram

Esto lo puedes hacer desde tu aplicación en tu smartphone, página web o la aplicación de escritorio de Telegram. En mi caso usaré la aplicación de escritorio.

Lo primero que tenemos que hacer es buscar el bot que hace bots (si se escucha algo raro), pero este bot te ayuda a crear nuevos bots en Telegram. Su nombre es BotFather. Después de encontrar a BotFather, intentas hablar con el, y en la parte de abajo te dice un botón para “Iniciar”.

Una vez que inicio, te aparecen una serie de comandos, el que nos interesa a nosotros es /newbot. Cuando envíes el comando, te pregunta que como quieres llamar tu bot, yo lo llamare: alertsluisramirez.

Al ingresar el nombre, te dirá que tienes que ingresar un “username”, para que normalmente muchos le ponen el nombre + bot al final. Yo haré lo mismo quedando de esta manera: alertsluisramirezbot.

Una vez que termines estos 2 pasos anteriores, te dirá que has creado correctamente tu bot de Telegram, aparte de que te otorga el token para acceder a la HTTP API.

bot-telegram-laravel-1

El token creado, por BotFather, lo usaremos para ingresarlo en nuestro archivo de configuración, lo recomendado es siempre usar este tipo de tokens en el archivo .env:

TELEGRAM_BOT_TOKEN=569049476:AAGKfU3taw9Q8KhxS7uZJgrNPY2Yb5CZNVA

En lo particular yo cree un Canal de Telegram, para recibir estas notificaciones aparte de que agregué otras personas para que estuviera recibiendo notificaciones.

canal-telegram-administrador

En este Canal de Telegram que cree, agregué como administrador al bot creado anteriormente (@alertsluisramirezbot) con la finalidad de que pueda enviar mensajes a este mismo grupo.

agregar-bot-telegram-laravel

Modificar archivo de configuración

En el archivo de configuración de telegram.php, existe un fragmento de código que es lo que vamos a editar:

'bots' => [
    'mybot' => [
        'username'            => 'alertsluisramirezbot',
        'token'               => env('TELEGRAM_BOT_TOKEN', 'YOUR-BOT-TOKEN'),
        'certificate_path'    => env('TELEGRAM_CERTIFICATE_PATH', 'YOUR-CERTIFICATE-PATH'),
        'webhook_url'         => env('TELEGRAM_WEBHOOK_URL', 'YOUR-BOT-WEBHOOK-URL'),
        'commands'            => [
            //Acme\Project\Commands\MyTelegramBot\BotCommand::class
        ],
    ],

En primero lugar tenemos que editar el username y donde dice token, pero recuerden que esto lo hicimos desde el archivo .env. Si ustedes gustan también puede crear una variable para que el username también este en .env.

Siempre cuando editamos algo relacionado con los archivos de configuración es recomendable, usar el siguiente comando para borrar cache de configuraciones:

php artisan config:cache

Obtener el ID de CHAT

Para que nuestro bot, pueda enviar mensajes en el Grupo de Chat que creamos, necesitamos indicarle el ID del Chat.

Primero enviamos un mensaje nosotros con nuestra cuenta personal de Telegram al Grupo de Chat, con la finalidad de que el bot pueda ver si existe una actualización en el chat donde esta. Como nota a veces es recomendable enviar varias pruebas o esperar un tiempo, en lo que registrar esta actividad.

mensaje-canal-telegram-laravel

Una vez enviado el mensaje de prueba, tenemos que hacer un nuevo método en el controlador donde usaras tu bot de Instagram:

public function updatedActivity()
{
    $activity = Telegram::getUpdates();
    dd($activity);
}

Y también creamos una ruta para ver este nuevo metodo que creamos:

Route::get('/activity', 'TelegramController@updatedActivity');

Al visitar la ruta /activity en nuestro navegador vemos un array, en mi caso tuve que realizar 2 mensajes, por que no reflejaba el primer mensaje de prueba.

array2-telegram-laravel

Lo que importa de esto es el ID de chat. Este también, lo ingresas en tu archivo .env.

TELEGRAM_CHANNEL_ID=-1001213984783

No olvides que si editas tu archivo .env, uses el comando:

php artisan config:cache

Enviar notificaciones ó mensajes a Telegram Messenger desde Laravel

Ya con esto tendríamos completado la configuración del bot, ahora podemos enviar notificaciones por medio de tu lógica de programación.

Por ejemplo si quieres recibir notificaciones cuando un usuario se registra en tu aplicación de Laravel, cuando se corre un comando de artisan o cualquier cosa que te imagines.

Lo único que tienes que hacer es agregar este pedazo de código:

$text = 'Aquí adjunta lo quieras enviar.';

Telegram::sendMessage([
    'chat_id' => env('TELEGRAM_CHANNEL_ID', ''),
    'parse_mode' => 'HTML',
    'text' => $text
]);

Caso de estudio

Hace poco realice una plataforma para un cine, y en esta plataforma querían recibir notificaciones por medio de sus smartphones, pero no tenían suficiente presupuesto para comprar un servicio de SMS, entonces pensé en Telegram.

Las notificaciones tenía que tener determinada información para saber que responsable de sala iba a participar en cada película y horario. Entonces los administradores querían recibir un mensaje algo parecido a esto:

Registro completo Responsable:

Luis Ramirez Película:

Star Wars Fecha y Hora:

Viernes 20 Febrero del 2018

El cual cada vez que el usuario se registrara en esa película y en ese horario generaría esa alerta para Telegram, y mi lógica quedo algo como:

$text = "<b>Registro completo:</b>:\n"
. "<b>Respnsable: </b>\n"
. "$user->name\n"
. "<b>Pelicula: </b>\n"
. "$movie->title\n"
. "<b>Fecha y Hora: </b>\n"
. "$schedule->date";

Telegram::sendMessage([
        'chat_id' => env('TELEGRAM_CHANNEL_ID'),
        'parse_mode' => 'HTML',
        'text' => $text
]);

El resultado fue este:

telegram-notificacion-enviada-laravel

Conclusión

Es bueno saber que se puede realizar esto, por que si te pones analizar puedes hacer infinidad de notificaciones para tus plataformas, con la finalidad de también dejar atrás los correos electrónicos (tu bandeja de correo electrónico te lo agradecería).