Saltar al contenido

Hora del código #20

Índice

Hace unos días le hice un nuevo cambio al chat bot cuando se usa mediante Telegram que suscribe al usuario a una lista que, luego de que los datos del día están disponibles, envía al usuario una imagen de la tabla con los datos del grupo de productos favorito:

Uso del comando /diarios en el chat bot de precios vía Telegram

Uso del comando /diarios en el chat bot de precios vía Telegram

Generación de las imágenes

Primero genero los archivos HTML de cada grupo de productos unos minutos luego de la carga de los datos en la herramienta pública. Lleva un poco de CSS nada más.

Cuando ha finalizado la generación de archivos HTML uso wkhtmltopdf mediante el wrapper imgkit en Python más o menos de la siguiente forma:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/bin/python

# -*- coding: utf-8 -*-


import imgkit

opciones = {
    'quality': 90,
    'quiet': ''
}

config = imgkit.config(wkhtmltoimage='/ubicacion/ejecutable/wkhtmltoimage')

archivo = '/ubicacion/archivos/html/archivo.html'

imgkit.from_file(archivo, '/ubicacion/archivos/jpg/archivo.jpg', config=config, options=opciones)

La línea 11 está ahí definiendo la ubicación del ejecutable wkhtmltoimage porque no coloqué la ruta en el PATH. Esto genera las imagenes de una forma muy rápida y luciendo bastante bien. Decidí generarlo en imagen porque es más fácil compartirlo y verlo en un teléfono, no todos tienen instalada una aplicación para leer PDF.

La imagen que el usuario recibe usando comando /diarios en el chat bot de precios vía Telegram

La imagen que el usuario recibe usando comando /diarios en el chat bot de precios vía Telegram

Suscripción

Es la parte más fácil de todo esto, Botman ya provee todo. Primero usé una nueva conversación donde se muestran los grupos disponibles, también la opción ninguno para cancelar la suscripción, y el usuario hace su elección al ver el menú.

$botman->group(['driver' => ['Telegram']], function($bot) {
    $bot->hears('/diarios', function ($bot) {
        $bot->startConversation(new ConversacionDiarios());
    });
});

El usuario en Telegram se llama chat_id, la información del usuario con Botman la obtuve así:

$usuario = $this->bot->getUser();

Y luego para obtener el chat_id:

$usuario->getId()

Al final tuve que procesar y almacenar los datos del usuario y la opción elegida por este.

Envío

Usé una tarea programada con cron para hacer el envío por un número limitado de usuarios por vez. Formé el siguiente arreglo por cada usuario:

$datos = [
    'chat_id' => 123456789,
    'photo' => 'imagen.jpg',
    'caption' => 'Estos son tus precios favoritos para el día de hoy'
];

Mediante CURL en PHP usé el método POST para enviar ese arreglo al URL del bot de Telegram que tiene el método sendPhoto y el token del bot, queda más o menos así:

https://api.telegram.org/botAQUIVAELTOKEN126543615243/sendPhoto

Con eso por cada usuario ahora se puede enviar de forma automática la tabla con los precios del grupo de productos favoritos de cada quién.