Spanish (Español) translation by Elías Nicolás (you can also view the original English article)
Si estás leyendo esto, sabes que los robots de chat son una de las mayores tendencias tecnológicas de 2016.
La revolución bot no es sólo acerca de la inteligencia artificial. Un bot puede ser una herramienta en tu mensajero con una interfaz de chat simple que se puede utilizar para ampliar la funcionalidad de sitios o servicios o incluso puede ser una aplicación independiente. Los robots son más baratos de desarrollar y más fáciles de instalar, y otra gran característica es que los mensajeros se pueden utilizar en todo tipo de dispositivos—ordenadores portátiles, teléfonos inteligentes y tabletas. Es por eso que todo el mundo está loco por los bots ahora.
Y el mayor mensajero con una API de bot abierta es Telegram.
Qué vamos a hacer
En este artículo vamos a crear un simple cronómetro Telegram bot. Te
mostraré cómo crear tu bot, conectarte con analytics, escribir algún
código y, finalmente, agregar tu bot a una tienda de bot.
Por
cierto, ya he preparado una demostración, por lo que puedes probarlo
simplemente añadiendo @stopwatchbot a tu lista de contactos de Telegram.
Crear un Bot con BotFather
El primer paso para crear un bot es registrar la cuenta de tu bot en Telegram. Y hay un bot para eso, llamado BotFather. Sólo
tienes que añadirlo a tu lista de contactos y podrás crear y configurar
robots de Telegram , simplemente escribiendo el comando /newbot y
siguiendo las instrucciones de BotFather.



Después de registrar su nuevo bot, recibirá un mensaje de felicitación con un token de autorización. Usaremos este símbolo pronto para autorizar un bot y enviar solicitudes a la API de Bot.
Más
tarde, puedes usar BotFather para añadir descripciones o fotos a los
perfiles de tus bots, regenerar tokens, establecer listas de comandos
para usar, eliminar cuentas, etc. Para
obtener una lista completa de comandos, solo tienes que escribir /help en un chat para obtener una lista de los comandos de BotFather.
Conéctese con Botan Analytics
No hay un análisis interno en la API de Telegram Bots, pero es importante saber cuántos usuarios tiene, cómo actúan y qué comandos activan más. Por supuesto, podemos recopilar esta información usando nuestro propio motor, pero si queremos enfocarnos en la funcionalidad de bot, no métricas, solo necesitamos usar una solución lista para usar.
Y hay una herramienta simple para conectar su bot a la analítica, llamada Botan. Está basado en Yandex AppMetric y completamente gratuito. Usando Botan, puede segmentar su audiencia, obtener información sobre los perfiles de usuario, obtener el comando más utilizado y obtener bellos gráficos directamente en su mensajero, como esto:



Para empezar, necesita registrar su bot en Botan y obtener un token. Y otra vez, puedes hacerlo con un bot, BotanioBot:



Simplemente
haga clic en la tecla "Add bot" en el teclado de diálogo, escriba el
nick de su bot, y obtendrá su token de pista de bot. Ahora
Botanio está listo para rastrear sus eventos de bot, y puede obtener
estadísticas de usuarios, sesiones, retención y eventos directamente en
su mensajero.
Crear y registrar un Webhook SSL
En Telegram hay dos maneras de obtener mensajes de sus usuarios: sondeos largos y webhooks.



Básicamente,
con el sondeo largo, es necesario solicitar nuevos mensajes de la API y
con webhooks está configurando una devolución de llamada que llamará la
API de telegrama si llega un mensaje nuevo de un usuario. Yo
prefiero usar webhooks porque se parece a la comunicación en tiempo
real, por lo que en este artículo vamos a utilizar este método también. Ahora
tenemos que elegir una URL de devolución de llamada para nuestro
webhook, que debe ser alcanzado bajo el protocolo HTTPS, y tenemos que
configurarlo realmente seguro, así que ocultar su script en una ruta
secreta, como dice el manual:
Si desea asegurarse de que la solicitud Webhook proviene de Telegram, le recomendamos que utilice una ruta secreta en la URL, ej.https://www.example.com/<token>. Puesto que nadie sabe el token de tu bot, puedes estar seguro de que somos nosotros.
Si su certificado SSL es de confianza, todo lo que necesita hacer es abrir esta URL en su navegador:
1 |
https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook] |
De lo contrario, deberá generar un certificado auto-firmado. Aquí hay un ejemplo del comando en Linux para él:
1 |
openssl req -newkey rsa:2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out /path/to/certificate.crt -subj "/C=IT/ST=state/L=location/O=description/CN=yourdomain.com" |
Y no olvide abrir el puerto SSL:
1 |
sudo ufw allow 443/tcp |
Para
obtener el certificado comprobado y configurar su dominio webhook en
confianza, debe cargar su certificado de clave pública:
1 |
curl \ |
2 |
-F "url=https://yourdomain.com/path/to/script.php" \ |
3 |
-F "certificate=/path/to/certificate.key" \ |
4 |
"https://api.telegram.org/bot[token]/setwebhook" |
Por último, obtendrá una respuesta JSON como ésta:
1 |
{"ok":true,"result":true,"description":"Webhook was set"} |
Dice que el webhook fue establecido y estamos listos para arrancar el motor del bot.
Construir una base de datos
Ahora necesitamos construir una base de datos para nuestros temporizadores. ¿Qué necesitamos para almacenar? Cuando un usuario ordena que el cronómetro comience, tomaremos el ID del chat y guardaremos una fila con el ID de chat y el tiempo actual de Unix, que es el número de segundos entre ahora y el inicio de Unix Epoch, que es el 1 de enero de 1970 En UTC. En consecuencia, guardaremos una fila con el ID de chat y la marca de tiempo de entero de la hora actual de Unix.
Para mostrar el tiempo actual del cronómetro, obtendremos la marca de tiempo guardada y compararla con la marca de tiempo actual. La diferencia será el tiempo actual en segundos. Si el usuario detiene el temporizador, simplemente eliminaremos la fila con el ID de chat actual.
Así que vamos a crear una base de datos y una tabla para almacenar la información del cronómetro:
1 |
CREATE TABLE IF NOT EXISTS `stopwatch` ( |
2 |
`chat_id` int(10) unsigned NOT NULL, |
3 |
`timestamp` int(10) unsigned NOT NULL, |
4 |
PRIMARY KEY (`chat_id`) |
5 |
) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
Crear una clase de Stopwatch
Finalmente estamos listos para empezar a codificar. Vamos
a crear una clase para trabajar con la base de datos en un archivo
llamado stopwatch.php y comenzar con un constructor que establecerá dos
variables privadas, donde almacenaremos el ID de chat y la conexión
actual de MySQL:
1 |
class Stopwatch |
2 |
{
|
3 |
/** @var mysqli */
|
4 |
private $mysqli; |
5 |
/** @var int */
|
6 |
private $stopwatch_id; |
7 |
/**
|
8 |
* Stopwatch constructor
|
9 |
* @param mysqli $mysqli
|
10 |
* @param $stopwatch_id
|
11 |
*/
|
12 |
public function __construct(\mysqli $mysqli, $stopwatch_id) |
13 |
{
|
14 |
$this->mysqli = $mysqli; |
15 |
$this->stopwatch_id = intval($stopwatch_id); |
16 |
}
|
17 |
}
|
Cuando
el usuario inicia el temporizador, obtendremos el tiempo actual de Unix
y lo guardaremos en una fila con el ID de chat, así que aquí está el
método start():
1 |
public function start() |
2 |
{
|
3 |
$timestamp = time(); |
4 |
$query = " |
5 |
INSERT INTO `stopwatch` (`chat_id`, `timestamp`)
|
6 |
VALUES ('$this->stopwatch_id', '$timestamp') |
7 |
ON DUPLICATE KEY UPDATE timestamp = '$timestamp' |
8 |
"; |
9 |
return $this->mysqli->query($query); |
10 |
}
|
Si el temporizador se detiene, debemos eliminar una fila de la base de datos:
1 |
/**
|
2 |
* Delete row with stopwatch id
|
3 |
* @return bool|mysqli_result
|
4 |
*/
|
5 |
public function stop() |
6 |
{
|
7 |
$query = " |
8 |
DELETE FROM `stopwatch`
|
9 |
WHERE `chat_id` = $this->stopwatch_id |
10 |
"; |
11 |
return $this->mysqli->query($query); |
12 |
}
|
Y ahora para la parte principal de la clase. Cuando
el usuario solicita el estado del temporizador, necesitamos encontrar
la fila con el cronómetro de la conversación actual y calcular la
diferencia en segundos entre la hora Unix guardada y la hora actual. Afortunadamente, el tiempo Unix es un entero, por lo que sólo podemos restar un valor de otro. Para formatear el valor resultante como un tiempo, usaremos la función gmdate.
1 |
/**
|
2 |
* Find row with stopwatch id and return difference in seconds from saved Unix time and current time
|
3 |
* @return string
|
4 |
*/
|
5 |
public function status() |
6 |
{
|
7 |
$query = " |
8 |
SELECT `timestamp` FROM `stopwatch`
|
9 |
WHERE `chat_id` = $this->stopwatch_id |
10 |
"; |
11 |
$timestamp = $this->mysqli->query($query)->fetch_row(); |
12 |
if (!empty($timestamp)) { |
13 |
return gmdate("H:i:s", time() - reset($timestamp)); |
14 |
}
|
15 |
}
|
Como
puede ver, si no hay valor en la base de datos, el método status() no
devolverá nada y procesaremos un valor nulo como un temporizador
detenido.
Elección de una biblioteca PHP
Hay muchas bibliotecas de PHP que existen para trabajar con la API de Telegram, pero, al menos en el momento de escribir este artículo, sólo hay una que admite tanto el contenedor de API Bot de Telegram como el seguimiento de Botan. Y se llama PHP Bot API Telegram.
Utilice Composer para instalar esta biblioteca:
1 |
composer require telegram-bot/api |
Si no está interesado en el uso de análisis, pruebe Telegram Bot API PHP SDK con Lavarel integración o PHP Telegram Bot.
Iniciar la secuencia de comandos de Webhook
Y ahora empieza la parte principal—crearemos un script para procesar las devoluciones de llamada desde la API Bot de Telegram. Inicie un archivo llamado index.php e incluya la carga automática de Composer y una nueva clase Stopwatch. Abra una conexión MySQL, cree un nuevo cliente API de Telegram y ejecútelo:
1 |
require_once 'vendor/autoload.php'; |
2 |
require_once 'stopwatch.php'; |
3 |
|
4 |
// connect to database
|
5 |
$mysqli = new mysqli('database_host', 'database_user', 'database_password', 'database_name'); |
6 |
if (!empty($mysqli->connect_errno)) { |
7 |
throw new \Exception($mysqli->connect_error, $mysqli->connect_errno); |
8 |
}
|
9 |
|
10 |
// create a bot
|
11 |
$bot = new \TelegramBot\Api\Client('bot_token', 'botanio_token'); |
12 |
// run, bot, run!
|
13 |
$bot->run(); |
Crear comandos
Ahora necesitamos configurar un bot para responder en comando /start. Este
comando se utiliza para iniciar todos los bots de telegrama, y los
usuarios recibirán nuestro mensaje de bienvenida cuando comience el
primer chat.
1 |
$bot->command('start', function ($message) use ($bot) { |
2 |
$answer = 'Howdy! Welcome to the stopwatch. Use bot commands or keyboard to control your time.'; |
3 |
$bot->sendMessage($message->getChat()->getId(), $answer); |
4 |
});
|
Aquí, en el método command(), definimos un cierre para recibir un comando. Este cierre obtiene el ID del chat actual y envía un mensaje de bienvenida. Además, todos los comandos registrados se rastrean automáticamente como nombre de comando.
Para iniciar el cronómetro, definiremos el comando /go:
1 |
$bot->command('go', function ($message) use ($bot, $mysqli) { |
2 |
$stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); |
3 |
$stopwatch->start(); |
4 |
$bot->sendMessage($message->getChat()->getId(), 'Stopwatch started. Go!'); |
5 |
});
|
Esto creará una instancia de la clase Stopwatch e iniciará un temporizador llamando al método start() que ya hemos definido.
Para definir el comando /status, necesitamos hacer lo mismo. Simplemente llame al método status() y devuelva el resultado. Si el método devuelve nulo, dígale al usuario que el temporizador no se ha iniciado.
1 |
$bot->command('status', function ($message) use ($bot, $mysqli) { |
2 |
$stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); |
3 |
$answer = $stopwatch->status(); |
4 |
if (empty($answer)) { |
5 |
$answer = 'Timer is not started.'; |
6 |
}
|
7 |
$bot->sendMessage($message->getChat()->getId(), $answer); |
8 |
});
|
Y
si el usuario detiene el temporizador, necesitamos obtener el estado
primero, mostrar el tiempo resultante y detener el temporizador
utilizando el método stop().
1 |
$bot->command('stop', function ($message) use ($bot, $mysqli) { |
2 |
$stopwatch = new Stopwatch($mysqli, $message->getChat()->getId()); |
3 |
$answer = $stopwatch->status(); |
4 |
if (!empty($answer)) { |
5 |
$answer = 'Your time is ' . $answer . PHP_EOL; |
6 |
}
|
7 |
$stopwatch->stop(); |
8 |
$bot->sendMessage($message->getChat()->getId(), $answer . 'Stopwatch stopped. Enjoy your time!'); |
9 |
});
|
¡Eso es! Ahora puede cargar todos los archivos en el directorio webhook y probar su bot.
Adición de un teclado
Para sugerir al usuario cuáles comandos puede ejecutar, podemos agregar un teclado a un mensaje. Nuestro cronómetro puede estar funcionando o parado, y habrá dos para cada estado. Para mostrar un teclado al usuario, sólo necesitamos extender el método sendMessage():
1 |
$keyboard = new \TelegramBot\Api\Types\ReplyKeyboardMarkup([['/go', '/status']], null, true); |
2 |
|
3 |
$bot->sendMessage($message->getChat()->getId(), $answer, false, null, null, $keyboards); |
4 |
});
|
Ahora puedes agregar teclados a cada comando de tu bot. No voy a incluir un ejemplo completo aquí, pero se puede ver en las páginas del repositorio.
Cómo agregar su bot a una tienda
Bueno, ahora tenemos bot de trabajo, y queremos mostrarlo al mundo. La mejor manera es registrar el bot en un catálogo de bot. Por ahora, Telegram no tiene un catálogo oficial como este, pero hay algunos no oficiales, y el mayor es Storebot.me, donde miles de bots ya están registrados.
Y hay un ... bot para registrar tu bot en una tienda de bot! Agregue @storebot a su lista de contactos, escriba el comando /add y siga las instrucciones. Se
le pedirá que introduzca el nombre de usuario, el nombre y la
descripción del bot, elija una de las categorías estándar y confirme la
propiedad del bot enviando su token.



Después de un tiempo, tu robot pasará el proceso de envío y aparecerá en los gráficos de Storebot. Ahora usted y sus usuarios pueden votar, encontrar y calificar a su bot en la tienda de bot para ayudarlo a subir a la parte superior de la tabla.
Conclusion
Hemos recorrido un largo camino, desde la creación de un bot bebé hasta su registro en una tienda para estar disponible para los usuarios reales. Como puede ver, hay muchas herramientas que existen para hacer su vida más fácil con la creación y propagación de su bot, y no necesita mucho código para iniciar un bot fácil. ¡Ahora usted está listo para hacer sus los propios!
Si tiene alguna pregunta, no dude en hacer preguntas en los comentarios al artículo.



