En esta entrada vamos a integrar nuestra aplicación en Symfony 4 con la aplicación de mensajería Telegram, a través de los bots y la API que ofrece esta última.
Para empezar lo primero que necesitamos para integrar nuestro Telegram bot y Symfony, son una serie de datos de telegram, esta parte la vamos a obviar, ya que a través de google encontraréis mil formas para hacerlo, todas iguales. Bien, partimos de la base de que tenéis los siguientes datos y un proyecto de Symfony 4 ya creado:
- Un token para acceder al bot.
- Un chat id a quien enviar mensajes.
Lo primero que tenemos que tener en cuenta es que si no queremos utilizar bundles externos al core de Symfony, como por ejemplo guzzlehttp client, tendremos que tener nuestro proyecto de Symfony en la versión 4.3, ya que a partir de esta versión, implementa un cliente Http nativo, podéis ver las notas aquí
En el fichero services.yaml, definiremos nuestro servicio creado, en mi caso se llama BotTelegram, para ello añadiremos las siguientes líneas al fichero:
App\Service\BotTelegram:
arguments:
$token: 'NUESTRA_API_TOKEN_CODE'
$urlstart: 'https://api.telegram.org/bot'
$urlend: '/sendMessage'
$chatid: 'CHATID_DE_TELEGRAM'
En este caso, el método lo pasamos como $urlend para hacer la prueba, aunque o es la forma más óptima puesto que hay muchos métodos.
Una vez hecho esto lo que tendremos que crear es nuestro constructor para importar los argumentos, así como importar las dependencias que necesitamos utilizar
<?php
namespace App\Service;
use Symfony\Component\HttpClient\HttpClient;
use Psr\Log\LoggerInterface;
use Symfony\Component\Config\Definition\Exception\Exception;
class BotTelegram
{
//Telegram Bot data
private $token;
private $urlstart;
private $urlend;
private $chatid;
//LoggerInterface
private $logger;
public function __construct($token, $urlstart, $urlend, $chatid, LoggerInterface $logger)
{
$this->token = $token;
$this->urlstart = $urlstart;
$this->urlend = $urlend;
$this->chatid = $chatid;
$this->logger = $logger;
}
}
También deberemos crear los getters para obtener los params tras su llamada
public function getToken()
{
return $this->token;
}
public function getUrlstart()
{
return $this->urlstart;
}
public function getUrlend()
{
return $this->urlend;
}
public function getChatid()
{
return $this->chatid;
}
public function getFullurl()
{
$token = $this->getToken();
$urlstart = $this->getUrlstart();
$urlend = $this->getUrlend();
return $urlstart.$token.$urlend;
}
Ahora que tenemos implementados nuestros getters y el constructor, ya podremos llamar a nuestros métodos para construir la petición http a la API de telegram. Finalmente nuestro servicio de BotTelegram quedará de la siguiente manera:
<?php
namespace App\Service;
use Symfony\Component\HttpClient\HttpClient;
use Psr\Log\LoggerInterface;
use Symfony\Component\Config\Definition\Exception\Exception;
class BotTelegram
{
//Telegram Bot data
private $token;
private $urlstart;
private $urlend;
private $chatid;
//LoggerInterface
private $logger;
public function __construct($token, $urlstart, $urlend, $chatid, LoggerInterface $logger)
{
$this->token = $token;
$this->urlstart = $urlstart;
$this->urlend = $urlend;
$this->chatid = $chatid;
$this->logger = $logger;
}
public function getToken()
{
return $this->token;
}
public function getUrlstart()
{
return $this->urlstart;
}
public function getUrlend()
{
return $this->urlend;
}
public function getChatid()
{
return $this->chatid;
}
public function getFullurl()
{
$token = $this->getToken();
$urlstart = $this->getUrlstart();
$urlend = $this->getUrlend();
return $urlstart.$token.$urlend;
}
public function main()
{
$chatid = $this->getChatid();
$content = array (
'headers' => array("Content-Type" => "application/x-www-form-urlencoded"),
"body" => array("chat_id" => $chatid, "text" => "Este es un mensaje para Sysadm"),
);
$url = $this->getFullurl();
$httpClient = HttpClient::create();
try {
$response = $httpClient->request('GET', $url, $content);
$content = $response->getContent();
$this->logger->info($content);
}
catch (\Exception $e) {
$this->logger->critical($e);
}
return $content;
}
}
Es tan simple como pasarle el método, la url y el contenido a la función $httpClient->request. Por lo que, si utilizas Symfony, estás de enhorabuena, ya que algo tan básico a veces tenías que buscar otras alternativas no tan fáciles y directas como esta.
Para utilizar el servicio solamente tendréis que importar el servicio en vuestro controlador de Symfony y hacer la llamada como procede a un servicio.
Como veis en el apartado «text» => se ha puesto un mensaje de prueba, pues es tan fácil que solamente tendréis que pasar la salida que queréis enviar al bot, a través del controlador. Si hacéis una prueba veréis a vuestro bot enviando el mensaje pasado por el servicio.
Tan simple como esto para integrar nuestro Telegram bot y Symfony. Si todavía no has empezando con Symfony, uno de los frameworks PHP más utilizados hoy en día, todavía estás a tiempo, en la siguiente entrada te dejo una pequeña muestra de lo potente que puede ser este framework.
Sin más nos vemos en el siguiente capítulo.
¡Hasta la próxima!