Comment démarrer un bot Telegram avec PHP

Si vous lisez ceci, vous savez que les robots de discussion sont l'une des plus grandes tendances technologiques de 2016.

La révolution bot ne concerne pas seulement l'intelligence artificielle. Un bot peut être un outil de votre messagerie avec une simple interface de discussion pouvant être utilisée pour étendre les fonctionnalités de sites ou de services, voire même être une application autonome. Les robots coûtent moins cher à développer et sont plus faciles à installer, et une autre fonctionnalité intéressante est que les messagers peuvent être utilisés sur tous les types d'appareils: ordinateurs portables, smartphones et tablettes. Voilà pourquoi tout le monde est fou de bots maintenant.

Et le plus grand messager avec une API de bot ouverte est Telegram.

Ce que nous allons faire

Dans cet article, nous allons créer un simple chronomètre, le bot Telegram. Je vais vous montrer comment créer votre bot, vous connecter à l'analytique, écrire du code et enfin ajouter votre bot à un magasin de bots.

A propos, j'ai déjà préparé une démo, vous pouvez donc la tester en ajoutant simplement @stopwatchbot à votre liste de contacts Telegram.

Créer un bot avec BotFather

La première étape pour créer un bot consiste à enregistrer le compte de votre bot dans Telegram. Et il y a un bot pour cela, appelé le BotFather. Ajoutez-le simplement à votre liste de contacts et vous pourrez créer et configurer des robots Telegram en tapant simplement le / newbot commande et en suivant les instructions de BotFather.

Après avoir enregistré votre nouveau bot, vous recevrez un message de félicitations avec un jeton d'autorisation. Nous utiliserons bientôt ce jeton pour autoriser un bot et envoyer des requêtes à son API..

Plus tard, vous pourrez utiliser BotFather pour ajouter des descriptions ou des photos aux profils de vos robots, régénérer des jetons, définir des listes de commandes à utiliser, supprimer des comptes, etc. Pour obtenir une liste complète des commandes, tapez simplement /Aidez-moi dans un chat pour obtenir une liste des commandes de BotFather.

Connectez-vous à Botan Analytics

Il n'y a pas d'analyse intégrée dans l'API de Telegram Bots, mais il est important de savoir combien d'utilisateurs vous avez, comment ils agissent et quelles commandes ils déclenchent le plus. Bien sûr, nous pouvons collecter ces informations à l'aide de notre propre moteur, mais si nous souhaitons nous concentrer sur les fonctionnalités des robots et non sur les métriques, nous devons simplement utiliser une solution prête à l'emploi..

Et il existe un outil simple pour connecter votre bot à l'analytique, appelé Botan. Il est basé sur Yandex AppMetric et est entièrement gratuit. En utilisant Botan, vous pouvez segmenter votre auditoire, obtenir des informations sur les profils utilisateur, obtenir la commande la plus utilisée et obtenir de superbes graphiques directement dans votre messagerie, comme ceci:

Pour commencer, vous devez enregistrer votre bot dans Botan et obtenir un jeton. Et encore une fois, vous pouvez le faire avec un bot, BotanioBot:

Cliquez simplement sur la touche «Ajouter un bot» sur le clavier de la boîte de dialogue, tapez le pseudo de votre bot et vous obtiendrez votre jeton de suivi de bot. Botanio est maintenant prêt à suivre vos événements bot et vous pouvez obtenir des statistiques par utilisateurs, sessions, rétention et événements directement dans votre messagerie..

Créer et enregistrer un Webhook SSL

Dans Telegram, il existe deux manières d’obtenir des messages de vos utilisateurs: longues interrogations et Webhooks..

Fondamentalement, avec une longue interrogation, vous devez demander de nouveaux messages à l'API et avec Webhook, vous définissez un rappel que l'API Telegram appellera si un nouveau message arrive d'un utilisateur. Je préfère utiliser webhooks car il ressemble à une communication en temps réel. Dans cet article, nous allons également utiliser cette méthode. Maintenant, nous devons choisir une URL de rappel pour notre Webhook, qui doit être atteint via le protocole HTTPS, et nous devons le définir de manière vraiment sécurisée. Cachez donc votre script dans un chemin secret, comme indiqué dans le manuel:

Si vous souhaitez vous assurer que la demande Webhook provient de Telegram, nous vous recommandons d’utiliser un chemin secret dans l’URL, par exemple.. https://www.example.com/. Puisque personne d'autre ne connaît le jeton de votre bot, vous pouvez être sûr que c'est nous.

Si votre certificat SSL est approuvé, il vous suffit d'ouvrir cette URL dans votre navigateur:

https://api.telegram.org:443/bot[token]/setwebhook?url=[webhook]

Sinon, vous devez générer un certificat auto-signé. Voici un exemple de commande sur Linux pour cela:

openssl req -newkey rsa: 2048 -sha256 -nodes -keyout /path/to/certificate.key -x509 -days 365 -out / path/to/certificate.crt -subj "/ C = IT / ST = état / L = emplacement / O = description / CN = votredomaine.com "

Et n'oubliez pas d'ouvrir le port SSL:

sudo ufw permettre 443 / tcp

Pour que le certificat soit vérifié et que votre domaine webhook soit approuvé, vous devez télécharger votre certificat de clé publique:

curl \ -F "url = https: //votredomaine.com/path/to/script.php" \ -F "certificate = / path / to / certificate.key" \ "https://api.telegram.org/ bot [jeton] / setwebhook "

Enfin, vous obtiendrez une réponse JSON comme ceci:

"ok": true, "résultat": true, "description": "Webhook a été défini"

Il dit que le Webhook a été défini et que nous sommes prêts à démarrer le moteur du bot.

Construire une base de données

Nous devons maintenant créer une base de données pour nos timers. Que faut-il y stocker? Lorsqu'un utilisateur donne l'ordre au chronomètre de démarrer, nous prenons l'ID du chat et sauvegardons une ligne avec l'identifiant du chat et l'heure Unix en cours, qui correspond au nombre de secondes entre le début et le début d'Unix Epoch, soit le 1er janvier 1970. à UTC. Par conséquent, nous enregistrerons une ligne avec l’ID de discussion et l’horodatage entier de l’heure Unix actuelle..

Pour afficher l'heure actuelle du chronomètre, nous allons obtenir l'horodatage enregistré et le comparer à l'horodatage actuel. La différence sera le temps actuel en secondes. Si l'utilisateur arrête le chronomètre, nous effacerons simplement la ligne avec l'identifiant de chat actuel.

Créons donc une base de données et une table pour stocker les informations du chronomètre:

CREATE TABLE IF NOT PAS EXISTS 'chronomètre' ('id_chat' int (10) non signé NON NULL, horodatage 'int (10) non signé NOT NULL, PRIMARY KEY (' identifiant chat # ') ENGINE = InnoDB DEFAULT CHARSET = utf8;

Créer une classe de chronomètre

Enfin, nous sommes prêts à commencer à coder. Créons une classe pour travailler avec la base de données dans un fichier appelé chronomètre.php et commencez avec un constructeur qui définira deux variables privées, où nous allons stocker l'ID de chat et la connexion MySQL actuelle:

class Stopwatch / ** @ var mysqli * / private $ mysqli; / ** @var int * / private $ stopwatch_id; / ** * Constructeur du chronomètre * @param mysqli $ mysqli * @param $ stopwatch_id * / public function __construct (\ mysqli $ mysqli, $ stopwatch_id) $ this-> mysqli = $ mysqli; $ this-> stopwatch_id = intval ($ stopwatch_id); 

Lorsque l'utilisateur lancera le chronomètre, nous obtiendrons l'heure Unix en cours et l'enregistrerons dans une rangée avec l'ID de discussion. Voici donc le début() méthode:

fonction publique start () $ timestamp = time (); $ query = "INSERT INTO 'chronomètre' ('id_tchat', 'horodatage') VALUES ('$ this-> id_tww', '$ timestamp') ON DUPLICATE KEY UPDATE timestamp = '$ timestamp'"; return $ this-> mysqli-> query ($ query); 

Si le chronomètre s’arrête, nous devons supprimer une ligne de la base de données:

/ ** * Supprime la ligne avec l'identifiant du chronomètre * @return bool | mysqli_result * / public function stop () $ query = "SUPPRIMER DE 'le chronomètre' WHERE 'id_du_chat' = $ this-> id_watchwatch"; return $ this-> mysqli-> query ($ query); 

Et maintenant pour la partie principale de la classe. Lorsque l'utilisateur demande l'état du minuteur, nous devons trouver la ligne avec le chronomètre dans la conversation en cours et calculer la différence en secondes entre l'heure Unix enregistrée et l'heure actuelle. Heureusement, le temps Unix est un entier, nous pouvons donc soustraire une valeur à une autre. Pour formater la valeur résultante en heure, nous utiliserons le date de sortie une fonction.

/ ** * Recherche la ligne avec l’identifiant du chronomètre et renvoie la différence en secondes entre l’heure Unix enregistrée et l’heure actuelle * chaîne @return * / public function status () $ query = "horodatage" SELECT "'DE' chronomètre 'WHERE' id_du_chat '= $ this-> stopwatch_id "; $ timestamp = $ this-> mysqli-> query ($ query) -> fetch_row (); if (! empty ($ timestamp))) return gmdate ("H: i: s", time () - reset ($ timestamp)); 

Comme vous pouvez le constater, s’il n’ya pas de valeur dans la base de données, la méthode statut() ne retournera rien, et nous traiterons une valeur nulle comme un minuteur arrêté.

Choisir une bibliothèque PHP

Il existe de nombreuses bibliothèques PHP pouvant fonctionner avec l'API Telegram, mais, au moins au moment de la rédaction de cet article, il n'y en a qu'une qui prend en charge à la fois l'encapsuleur Telegram Bot API et le suivi Botan. Et ça s'appelle PHP Telegram Bot API.

Utilisez Composer pour installer cette bibliothèque:

compositeur besoin de telegram-bot / api

Si vous ne souhaitez pas utiliser les outils d'analyse, essayez le SDK PHP API de Telegram Bot API avec intégration Lavarel ou PHP Telegram Bot..

Lancer le script Webhook

Et maintenant, la partie principale commence: nous allons créer un script pour traiter les rappels à partir de l'API de Telegram Bot. Démarrer un fichier appelé index.php et inclure le chargement automatique de Composer et une nouvelle classe Stopwatch. Ouvrez une connexion MySQL, créez un nouveau client API Telegram et exécutez-le:

require_once 'vendor / autoload.php'; require_once 'stopwatch.php'; // connexion à la base de données $ mysqli = new mysqli ('hôte_base_de_données', 'utilisateur_base_de_données', 'mot_de_passe_base_de_données', 'nom_base_de_données'); if (! empty ($ mysqli-> connect_errno)) lance new \ Exception ($ mysqli-> connect_error, $ mysqli-> connect_errno);  // créer un bot $ bot = new \ TelegramBot \ Api \ Client ('bot_token', 'botanio_token'); // cours, bot, cours! $ bot-> run ();

Créer des commandes

Maintenant, nous devons configurer un bot pour répondre à la commande /début. Cette commande est utilisée pour démarrer tous les robots Telegram, et notre message de bienvenue apparaîtra aux utilisateurs lorsque la première discussion commence..

$ bot-> commande ('start', fonction ($ message) use ($ bot) $ answer = 'Bonjour, bienvenue au chronomètre. Utilisez les commandes de touches ou le clavier pour contrôler votre temps.'; $ bot-> sendMessage ( $ message-> getChat () -> getId (), $ answer););

Ici, dans le commander() méthode, nous avons défini une fermeture pour recevoir une commande. Cette fermeture obtient l'ID du chat en cours et envoie un message de bienvenue. En outre, toutes les commandes enregistrées sont automatiquement suivies en tant que nom de commande..

Pour démarrer le chronomètre, nous allons définir le /aller commander:

$ bot-> commande ('go', fonction ($ message) utiliser ($ bot, $ mysqli) $ stopwatch = nouveau chronomètre ($ mysqli, $ message-> getChat () -> getId ()); $ stopwatch- > start (); $ bot-> sendMessage ($ message-> getChat () -> getId (), 'Le chronomètre a commencé. Allez!)));

Ceci créera une instance de la classe Stopwatch et lancera une minuterie appelant le début() méthode que nous avons déjà définie.

Pour définir le /statut commande, nous devons faire la même chose. Il suffit d'appeler le statut() méthode et retourne le résultat. Si la méthode a renvoyé la valeur null, informez l'utilisateur que le temporisateur n'est pas démarré.

$ bot-> commande ('status', fonction ($ message) utiliser ($ bot, $ mysqli) $ stopwatch = nouveau Chronomètre ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ chronomètre-> statut (); if (vide ($ réponse)) $ answer = 'Le temporisateur n'est pas démarré.'; $ bot-> sendMessage ($ message-> getChat () -> getId (), $ answer ););

Et si l'utilisateur arrête le chronomètre, nous devons d'abord obtenir l'état, afficher l'heure résultante et arrêter le chronomètre à l'aide de la touche Arrêtez() méthode.

$ bot-> commande ('stop', fonction ($ message) use ($ bot, $ mysqli) $ stopwatch = new Chronomètre ($ mysqli, $ message-> getChat () -> getId ()); $ answer = $ stopwatch-> status (); if (! empty ($ answer)) $ answer = 'Votre temps est'. $ answer. PHP_EOL; $ stopwatch-> stop (); $ bot-> sendMessage ($ message- > getChat () -> getId (), $ answer. 'Chronomètre arrêté. Profitez de votre temps!'););

C'est tout! Maintenant, vous pouvez télécharger tous les fichiers dans le répertoire webhook et tester votre bot.

Ajout d'un clavier

Pour suggérer à l'utilisateur les commandes qu'il peut exécuter, nous pouvons ajouter un clavier à un message. Notre chronomètre peut être en marche ou arrêté et il y en aura deux pour chaque état. Pour montrer un clavier à l'utilisateur, il suffit d'étendre la envoyer le message() méthode:

$ keyboard = new \ TelegramBot \ Api \ Types \ ReplyKeyboardMarkup ([['/ go', '/ status']], null, true); $ bot-> sendMessage ($ message-> getChat () -> getId (), $ réponse, false, null, null, $ claviers); );

Maintenant, vous pouvez ajouter des claviers à chaque commande de votre bot. Je ne vais pas inclure un exemple complet ici, mais vous pouvez le voir dans les pages du référentiel.

Ajout de votre bot dans un magasin

Bon, maintenant nous avons un bot qui fonctionne et nous voulons le montrer au monde entier. Le meilleur moyen est d'inscrire le bot dans un catalogue de bot. Pour l'instant, Telegram n'a pas de catalogue officiel comme celui-ci, mais il en existe quelques-uns non officiels, le plus important étant Storebot.me, où des milliers de robots sont déjà enregistrés..

Et il y a un… bot pour enregistrer votre bot dans un magasin de bot! Ajoutez @storebot à votre liste de contacts, tapez le /ajouter commande, et suivez les instructions. Vous serez invité à entrer le nom d'utilisateur, le nom et la description du bot, choisir l'une des catégories standard et confirmer la propriété du bot en envoyant son jeton..

Après un certain temps, votre bot réussira le processus de soumission et apparaîtra dans les graphiques de Storebot. Maintenant, vous et vos utilisateurs pouvez voter, trouver et évaluer votre bot dans son magasin pour le placer en haut de la liste..

Conclusion

Nous avons parcouru un long chemin, depuis la création d'un baby bot jusqu'à son enregistrement dans un magasin pour qu'il soit disponible pour de vrais utilisateurs. Comme vous pouvez le constater, de nombreux outils existent pour vous simplifier la vie avec la création et la diffusion de votre bot, et vous n'avez pas besoin de beaucoup de code pour démarrer un bot facile. Maintenant vous êtes prêt à faire votre propre!

Si vous avez des questions, n'hésitez pas à poser des questions dans les commentaires de l'article. 

Lectures complémentaires et liens connexes

  • Robots télégrammes
  • BotFather
  • Botan
  • API PHP Telegram Bot
  • Telegram Bot Store