Creación de un bot para Telegram en PHP

Creación de un bot para Telegram en PHP

Que es XAMP?

XAMPP es un paquete de instalación independiente de plataforma, software libre, que consiste principalmente en el sistema de gestión de bases de datos MySQL, el servidor web Apache y los intérpretes para lenguajes de script: PHP y Perl.

Que necesitamos para empezar con el desarrollo de nuestro bot?

Xamp: Descargar

Composer: Descargar

Descargar este repositorio de github:https://github.com/irazasyed/telegram-bot-sdk

Creación de un bot para Telegram en PHP

Una vez tenemos instalado Xamp y bajado el repositorio, procedemos a hacer lo siguiente:

  1. Debes crear una carpeta dentro de:

C:/xampphtdocs

  1. Yo creo una llamada telegram, es decir esa es mi ruta, vosotros la podeis llamar como más os guste

C:/xampphtdocstelegram

3)Después dentro de esa carpeta descomprimes el rar de la API, es decir el repositorio de github que bajaste antes.

  1. Vamos a usar composer, para ello habrimos cmd o la linea de comandos y hacemos:

cd C:/xampphtdocstelegram
composer require irazasyed/telegram-bot-sdk

⚠️Desde está url: https://packagist.org/packages/irazasyed/telegram-bot-sdk podéis ver la última versión disponible del repositorio que nos estamos descargando con composer

Al hacer esto te creará dos carpetas una llamada “src” y otra “vendor”

  1. Después crea un index.php

Dentro del index.php agrega la siguiente línea para vincular todos los scripts necesarios:
require_once vendor/autoload.php;

Puedes ver dejabajo como tendría que ser el index.php

<?php
require_once"vendor/autoload.php";//Esto carga todas las clases necesarias y ha sido creado por composer
$token="AQUI VA TU TOKEN";//Aqui debes poner el token que @botfather te haya dado
/*ESTAS FUNCIONES SE EXPLICA MAS ADELANTE*/
function isVoid($value){
if (empty($value)) {
return "esta informacion no esta disponible";
}
else {
return $value;
}
}
function tituloChat($user, $chat){
/*Comprobamos si es un chat privado*/
if (($chat->getType())=='private') {//si el chat es de tipo privado devolveremos el nick del usuario
return $user->getFirstName();
}
else {//si no es privado devolveremos el titulo del chat
return $chat->getTitle();
}
}

/*  Comenzemos con algo simple
*   Empezaremos con recibir los Updates(actualizacionies), que es un objeto
    que incluira datos que ha recibido el bot.
    Hay dos maneras de realizar esta acción:
      -getUpdates(): es la manera "mas compleja", ya que requeriria una base de datos para ir
      almacenando todos los datos e ir procesandoles.
      -getWebhookUpdates(): el servidor de telegram se encargara de enviarnos los Updates cada
      vez que el bot reciba algún dato.Es necesario tener un certificado SSL o uno semifirmado.
    Para nuestro tutorial utilizaremos getUpdates().Este metodo envia una petición al servidor
    de telegram para que nos devuelva x cantidad de mensajes recibidos por nuestro bot.
    cabe destacar que todas las respuestas serán en formato json, es decir, habra que procesarlas
    con otros metodos o bien aplicar json_decode($update,true) para transformar el Update json
    recibido en un array multidimensional.
    A continuación dejo un enlace para cada uno de los metodos:
        -getUpdates:https://telegram-bot-sdk.readme.io/reference#getupdates
        -getWebhookUpdates():https://telegram-bot-sdk.readme.io/docs/webhook-updates
*
*/

/*Comenzaremos creando el objeto de tipo API en la variable $bot*/
use TelegramBotApi;
$bot= new API($token);

/*  Ahora podemos usar todos los metodos que ofrece la clase API (src/Api.php)
*   Empezamos llamando al metodo getUpdates(), el cual retornará un objeto de tipo
    Update(src/Objects/Update.php)
*/
$updates = $bot->getUpdates([//ahora tenemos que enviar valores a este metodo
'offset'=>0,//Indicamos la primera actualización que queramos recibir. En este caso empiezo por 0 ya que todavia no he recibido ninguna otra
'limit'=>100,//Con esto indico que quiero recibir las siguientes 100 actualizaciones a partir de la número 0
'timeout'=>0//Tiempo limite para recibir las actualizaciones. Por defecto se pone en 0
]);
//Si ahora ablamos a nuestro bot y hacemos un var_dump($updates) nos mostraria los datos recibidos
//var_dump($updates);
/*Ahora tenemos un array($updates) con objetos Update desde la actualizacion 0 hasta la 100.
  Para recorrer dicho array de forma sencilla utilizaremos el metodo foreach.
  Los valores que retornará dicho getUpdate son:
array(1) { //Esto nos dice que solo ha recibido un mensaje ya que el array solo ocupa 1 dimension
[0]=> object(TelegramBotObjectsUpdate)#21 (1) { //Esta es la actualizacion numero 0 (la primera solicitada)
["items":protected]=> array(2) { //la clave item es de tipo array y de dimension 2
["update_id"]=> int(222629112)//el id de la actualizacion
["message"]=> object(TelegramBotObjectsMessage)#20 (1) { // los datos del mensaje recibido
["items":protected]=> array(5) {
["message_id"]=> int(2) //el 2 es el id del mensaje en este chat
["from"]=> object(TelegramBotObjectsUser)#38 (1) {//ahora nos da las caracteristicas del emisor del mensaje
["items":protected]=> array(3) {
["id"]=> int(400174) //el id del usuario
["first_name"]=> string(8) "Firegore" //el nick del usuario
["username"]=> string(8) "Firegore" //el nombre del usuario
}
}
["chat"]=> object(TelegramBotObjectsChat)#39 (1) { //esta informacion es a cerca del chat
["items":protected]=> array(4) {
["id"]=> int(400174) //id del chat. En este caso es el mismo id que el mio ya que es un chat privado
["first_name"]=> string(8) "Firegore" //nick del usuario
["username"]=> string(8) "Firegore" //nombre del usuario
["type"]=> string(7) "private" //tipo de chat
}
}
["date"]=> int(1485467219) //fecha en formato Unix en la que se recibio el mensaje
["text"]=> string(1) "Hola" //texto del mensaje
}
}
}
}
}

Ahora que ya sabemos los datos que recibimos os preguntareis,¿Y como narices accedo yo a estos datos?
Pues muy sencillo, como dije antes con un bucle foreach vamos accediendo a los diferentes Updates que despues podremos procesar uno a uno
*/
foreach ($updates as $update) {
$id_de_la_actualizacion=$update->getUpdateId();/*Este metodo retorna un objeto int con el id del Update*/
$objeto_mensaje=$update->getMessage();/*Este metodo retorna el objeto Message(src/Objects/Message.php) asociado a dicho Update*/

  /*  Ahora tenemos un objeto Message que contiene toda la informacion del mensaje correspondiente a dicha actualización
      Comenzaremos con algunos metodos sencillos los cuales estan descritos en el php que define dicha clase
      (src/Objects/Message.php)
  */
$mensaje_id=$objeto_mensaje->getMessageId();//devuelve la id del mensaje (tipo int)
$objeto_datos_usuario=$objeto_mensaje->getFrom();//devuelve un objeto tipo User(src/Objects/User.php) con los datos del usuario
$fecha_del_mensaje=$objeto_mensaje->getDate();//devuelve la fecha del mensaje en formato Unix
$objeto_chat=$objeto_mensaje->getChat();//devuelve un objeto tipo Chat(src/Objects/Chat.php) con los datos del chat
$texto=isVoid($objeto_mensaje->getText());//devuelve el texto del mensaje
  /*  Ahora ya tenemos tambien dos objetos nuevos, el objeto User y el Chat.
      Vamos a proceder a analizarles y a extraer sus datos usando los metodos disponibles para cada objeto correspondiente
      Comenzate por obtener los datos del usuario y despues los del chat.
      Algunos metodos pueden retornar valores vacios en caso de que el usuario no disponga de esa información, por lo que
      he creado una clase llamada isVoid que comprobara si el valor retornado esta vacio y nos devolvera un string con el
      valor "esta informacion no esta disponible"
  */

/***********************************    User    *******************************************/
$usuario_id=$objeto_datos_usuario->getId();
$usuario_nick=$objeto_datos_usuario->getFirstName();
$usuario_apellido=isVoid($objeto_datos_usuario->getLastName());
$usuario_nombre=isVoid($objeto_datos_usuario->getUsername());

/***********************************    Chat    *******************************************/
$chat_id=$objeto_chat->getId();
$chat_tipo=$objeto_chat->getType();
/*  Dependiendo del tipo de chat puede existir o no el título. Si es un chat privado no existirá el título.
  *   Para ello he creado otra funcion llamada tituloChat la cual retornara un string con un titulo siguiendo el
      siguiente patrón:
        -En caso de que sea un chat de tipo privado, el titulo del chat sera el nick del usuario
        -En caso de que no sea un chat de tipo privado retornará el nombre del chat
      A dicha funcion le enviaré los objetos User($objeto_datos_usuario) y Chat($objeto_chat)
  */
$chat_titulo=tituloChat($objeto_datos_usuario, $objeto_chat);

  /*Por ultimo si queremos obtener la hora de forma legible por el hombre podemos aplicar formato a la hora*/
$fecha_del_mensaje=date("H:i:s d-m-Y",($fecha_del_mensaje+(3600*(1))));/*le sumo 3600 ya que en España es UTF+1,
                                                                            es decir, una hora más.
                                                                            si en tu pais es diferente
                                                                            simplemente cambia el 1 que multiplica
                                                                            por tu respectiva zona horaria
                                                                          */
  /*YA TENEMOS TODOS LOS DATOS BASICOS PROCESADOS Y ALMACENADOS EN VARIABLES, AHORA PROCEDEMOS A EXPONERLOS POR PANTALLA*/
echo "************************************<strong>ACTUALIZACION Nº=".$id_de_la_actualizacion."</strong>************************************************<br>";
echo "Id del mensaje: ".$mensaje_id."<br>";
echo "Fecha a la que se recibio el mensaje: ".$fecha_del_mensaje."<br>";
echo "Texto del mensaje: ".$texto."<br>";
echo "Id del usuario: ".$usuario_id."<br>";
echo "Nick del usuario: ".$usuario_nick."<br>";
echo "Apellido del usuario: ".$usuario_apellido."<br>";
echo "Nombre del usuario: ".$usuario_nombre."<br>";
echo "Id del chat: ".$chat_id."<br>";
echo "Titulo del chat:".$chat_titulo."<br>";
echo "Tipo de chat: ".$chat_tipo."<br>";
echo "<br><br>";
/*RECORDAD QUE SI EL BOT TIENE HABILITADO LA PRIVACIDAD EN GRUPOS SOLO RECIBIRA MENSAJES QUE COMIENCEN CON EL CARACTER "/"*/

}
?>

Más información sobre la Api : https://telegram-bot-sdk.readme.io/docs/initial-setup

Grupo de Telegram para resolver las dudas sobre los Bots para Telegram en PHP: https://telegram.me/bottelegramesp