
Il vous est arrivé que vous veniez au cinéma et que vous regardiez des bandes-annonces avant le début du film, tandis que certains s'accrochent à vous assez fortement et vous vous promettez de regarder ce film sinon au cinéma, puis au moins plus tard, quand il sera disponible en téléchargement ? J'ose suggérer que oui. Mais souvent, cela se termine par le fait que vous l'oubliez avec succès et, dans le meilleur des cas, que vous trouviez accidentellement ce film en faisant défiler la liste des films déjà sortis.
J'ai souvent rencontré un tel problème et j'ai décidé de le créer avec Eve - Telegram-bot, ce qui m'aide à ne pas oublier les sorties de mes films préférés. Qu'est-ce que c'est, comment cela fonctionne et comment il a été développé, vous pouvez lire sous la coupe!
Préface
Cet article n'est pas un guide détaillé sur la création de robots Telegram. Et même si au cours de l'article je ferai souvent référence à mon projet, le but de ce matériel est une histoire de développement en général, à savoir le choix des technologies, les points clés et les écueils que j'ai rencontrés.
Pourquoi?
Donc, comme je l'ai écrit ci-dessus, j'oublie souvent de regarder ces films dont j'ai aimé la bande-annonce. J'ai longtemps réfléchi à la solution à ce problème. La première chose qui m'est venue à l'esprit a été la création d'une application native pour smartphones, mais depuis Je n'ai jamais fait cela auparavant, cela prendrait beaucoup de temps et non le fait que le résultat final satisferait mes besoins, ainsi que les besoins des utilisateurs potentiels.
L'idée suivante était de créer un PWA. C’est une option assez intéressante pour se familiariser avec la technologie, mais j’ai décidé de la laisser pour l’avenir. En même temps, j'utilise Telegram depuis longtemps et pendant tout ce temps, j'ai accumulé un nombre suffisant de bots qui me rendent périodiquement la vie un peu plus facile. Finalement, après avoir pesé tous les avantages et les inconvénients, j'ai décidé que cette plate-forme est parfaite pour cette idée.
Sélection de technologies
Si vous passez par Github pour les bots Telegram, vous pouvez voir que la plupart d'entre eux sont écrits en Python. Python est vraiment un excellent langage et idéal pour cette idée, mais je voulais implémenter ce projet spécifiquement sur NodeJS + TypeScript. En appliquant les filtres appropriés, je suis tombé sur 2 outils assez populaires:
node-telegram-bot-api et
Telegraf.js .
Avant cette expérience dans le développement de robots, je n'en avais pas, donc lors du choix parmi ces deux, il n'était pas clair quels paramètres devraient être examinés. En conséquence, après avoir examiné la documentation et examiné les problèmes de chacune des bibliothèques, je me suis installé sur Telegraf.js. Le facteur décisif a été la disponibilité des middlewares, qui sont conçus de la même manière que dans le cadre populaire d'Express.js. Telegraf.js a également un historique des mises à jour plus fréquent et une documentation bien structurée, ce qui suggère que les développeurs font suffisamment d'efforts pour améliorer l'outil. De plus, il contient des extraits pour TypeScript, ce qui est certainement un avantage pour la pile sélectionnée.
Telegraf.js
Telegraf.js est la bibliothèque principale sur laquelle le projet a été écrit. Il utilise plusieurs approches intéressantes qui vous permettent de créer des bots complexes tout en conservant la simplicité du code. Voici les mécanismes les plus intéressants:
Structure du projet
On soupçonne que l'article se révélera assez volumineux et, par conséquent, afin de ne pas l'étirer encore plus, j'oublierai certains points. Par exemple, pour que le bot commence à fonctionner, vous devez commencer par obtenir le jeton d'API Telegram Bot. Vous pouvez lire comment procéder dans la
documentation officielle de Telegram ou dans la
documentation de Telegraf.js.
La structure des fichiers du projet est la suivante:
Cela fonctionne comme suit:
- src / controllers - ce sont les scènes mêmes sur lesquelles il a été écrit ci-dessus. Dans ce projet, chaque scène est un contrôleur distinct qui traite les requêtes correspondantes.
- src / locales - traductions pour différentes langues. Telegraf.js facilite l'ajout de localisation au bot à l'aide de middlewares.
- src / models - modèles pour MongoDB.
- src / types - tippings pour TypeScript. Malheureusement, toutes les bibliothèques utilisées dans le projet n'ont pas de synchronisation par défaut.
- src / util - diverses fonctions d'aide qui sont utilisées dans différentes parties du projet. Ici, vous pouvez voir comment fonctionne la disponibilité du film pour le téléchargement, la gestion des sessions, la création de claviers, les gestionnaires d'erreurs et bien plus encore.
- src / bot.ts - le fichier principal où se fait toute la préparation et le lancement du bot.
- src / telegram.ts - dans ce cas, nous créons un objet de la classe Telegram à partir de la bibliothèque Telegraf.js. En utilisant cet objet, nous pouvons d'abord envoyer des messages aux utilisateurs, en utilisant leur ID, et ne pas attendre qu'ils écrivent quelque chose. Par exemple, dans ce projet, nous envoyons à l'utilisateur un message indiquant que le film qu'il suivait peut déjà être téléchargé. Bien sûr, cet objet offre beaucoup plus de fonctionnalités.
- Tout le reste est des configurations pour différentes parties du projet qui ne seront pas discutées dans cet article.
Initialisation et lancement
Lorsque nous avons compris la structure du projet, voyons comment le bot démarre réellement. Encore une fois, afin de raccourcir l'article, je n'insérerai pas l'intégralité du code ici, mais je ne parlerai que des principaux moments, à mon avis,. Vous pouvez voir le code complet dans le référentiel, un lien vers lequel est disponible à la fin de l'article.
Tout commence par la connexion à la base de données, qui stocke des informations sur les utilisateurs et les films qu'ils suivent. Après une connexion réussie, nous enregistrons toutes les scènes utilisées dans le projet, définissons les paramètres de localisation et ajoutons plusieurs middlewares - sessions de traitement, localisation, configuration de scènes, ainsi que plusieurs des nôtres. L'un d'eux, par exemple, reçoit toutes les informations sur l'utilisateur conformément à son ID et les ajoute au contexte utilisé dans les contrôleurs. Enfin, après toutes les préparations de base, nous lançons le bot en mode développement (polling long) ou production (Webhooks).
Important: si vous utilisez différentes méthodes pour recevoir des mises à jour (interrogation longue et Webhooks), puis lors du démarrage du bot en mode interrogation longue, supprimez d'abord le Webhook d'écoute à l'aide de la demande GET sur
api.telegram.org/botYOUR_TOKEN/deleteWebhook . Sinon, le bot risque de ne pas fonctionner correctement.
Gérer l'entrée utilisateur
Hourra! Le bot fonctionne, est connecté à la base de données et est prêt à recevoir des messages des utilisateurs. Mais comment le faire correctement?
Tout d'abord, il sera pratique pour les utilisateurs d'utiliser le clavier Telegram intégré. En fait, lorsque vous cliquez sur les boutons de ce clavier, des messages sont envoyés avec le contenu de ces boutons. Ensuite, nous ajoutons simplement des gestionnaires pour ce texte et effectuons certaines actions.
Le fichier
bot.ts contient de tels gestionnaires. Étant donné que le bot prend en charge deux langues, les boutons peuvent également contenir du texte différent - en russe et en anglais. Telegraf-i18n a une fonction de correspondance qui peut gérer le fait de cliquer sur le même bouton avec différentes langues.
La plupart des gestionnaires de bot.ts remplissent une seule fonction - ils lancent l'utilisateur dans la scène correspondante. Nous avons donc plusieurs sections - recherche de films, ma collection, les paramètres et les contacts. Chaque section a sa propre scène et son propre bouton, lorsque vous cliquez dessus, l'utilisateur se déplace vers la scène correspondante.
Important: assurez-vous d'ajouter un gestionnaire qui libérera l'utilisateur de la scène, sinon il risque d'y rester pour toujours! Il sera également utile de faire une commande générale (/ saveme est utilisée dans le bot), qui sera ajoutée à chaque scène et au fichier principal. Cette commande servira de sortie de n'importe quelle scène, ainsi que de réinitialiser les paramètres utilisateur.
Et maintenant, l'utilisateur veut aller à la recherche de films. En cliquant sur le bouton approprié, nous le déplaçons vers la scène de recherche. Pour plus de commodité, chaque scène a son propre dossier avec des fichiers, chacun remplissant une fonction spécifique.
À l'intérieur de la scène, vous pouvez utiliser vos middlewares, qui se trouvent dans le fichier middlewares.ts. Par exemple, en utilisant un middleware dans la scène de recherche, nous pouvons simplement transférer toutes les informations sur le film dans les méthodes appropriées, plutôt que d'exécuter la même fonction à chaque fois à l'intérieur.
Telegram possède également un clavier en ligne. Vous avez peut-être rencontré des messages avec des votes, sous lesquels se trouvent plusieurs boutons translucides, et lorsque vous cliquez sur l'un d'eux, le nombre de votes change. Ces boutons sont le clavier en ligne
Voilà à quoi ça ressemble à Eve Chaque bouton contient des informations, lorsque vous cliquez sur le bouton, elles seront transmises au gestionnaire correspondant.
La taille des informations transmises ne doit pas dépasser 64 octets! Pour apprendre au bot à écouter les clics sur les boutons, nous devons les enregistrer à l'aide de bot.action (/ trigger /, callback). Le premier paramètre contient toutes les données liées au bouton. J'ai décidé d'utiliser quelque chose comme Actions de Redux, où un objet de la forme {a: actionName, p: payload} est attaché à chaque bouton. Lors de l'enregistrement des écouteurs, nous pouvons utiliser un simple RegExp, par exemple: bot.action (/ actionName /, callBack). Tous les gestionnaires du clavier intégré se trouvent dans les fichiers actions.ts.
De plus, dans certaines scènes, il y a des fichiers helpers.ts, qui contiennent de petites fonctions prises là-bas afin de décharger les fichiers restants. Pour la plupart, il existe des générateurs de clavier pour diverses actions de l'utilisateur.
Localisation
Puisqu'il s'agit d'un sujet important, je pense qu'il vaut la peine d'être mentionné séparément. Comme je l'ai dit plus tôt, Telegraf.js contient un assez grand nombre de middlewares, dont l'un est
telegraf-i18n . Le référentiel contient des instructions détaillées et je n'ai eu aucun problème particulier avec cela, mais néanmoins j'ajouterai quelques mots sur la façon dont cela fonctionne dans ce projet.
Il existe un dossier de paramètres régionaux dans lequel se trouvent les fichiers de localisation, qui sont un objet JSON de la forme {"clé": "traduction"}. De plus, partout où nous devons utiliser différentes langues, nous utilisons la méthode de cette bibliothèque, où nous transférons la traduction dont nous avons besoin par clé, et à la sortie, nous obtenons la traduction correspondante. Une session peut être utilisée pour stocker des informations sur la langue sélectionnée par l'utilisateur. Il convient également de mentionner à nouveau les boutons. Il existe une fonction de correspondance dans la même bibliothèque, donc si le texte sur le bouton change en fonction de la langue, cette fonction vous aidera à suspendre l'auditeur approprié.
Important: si vous allez utiliser la localisation et écrire un bot en TypeScript, n'oubliez pas d'ajouter le dossier de traduction à tsconfig.json, sinon le code ne sera pas compilé. Par exemple:
"include": ["src/locales/*.json"]
Conclusion
Merci d'avoir lu jusqu'au bout! Dans cet article, j'ai essayé de décrire le processus de création d'un bot Telegram dans son ensemble aussi détaillé que possible, sans attachement fort à mon projet. J'espère qu'après avoir lu cet article et étudié le code source d'Eve, vous pourrez facilement créer un bot qui pourra vous aider.
Comme promis, vous pouvez consulter le code source sur
GitHub et essayer Eve en action
ici . Je serai extrêmement reconnaissant pour toute critique et suggestion d'amélioration.
Je voudrais également noter la
section dans la documentation Telegraf.js avec des projets open source intéressants que vous pouvez regarder et vous inspirer de l'architecture et des solutions. À mon tour, je veux mentionner l'un d'eux -
The Guard Bot . Un bot vraiment grand et bien fait, d'où j'ai emprunté certaines des solutions pour mon développement.
Et pour le moment j'ai dit tout ce que je voulais, je serai heureux de répondre à vos questions, suggestions et commentaires!