Construire votre premier bot Telegram : un guide étape par étape

Publié: 2022-03-11

Les chatbots sont souvent présentés comme une révolution dans la façon dont les utilisateurs interagissent avec la technologie et les entreprises. Ils ont une interface assez simple par rapport aux applications traditionnelles, car ils ne nécessitent que des utilisateurs pour discuter, et les chatbots sont censés comprendre et faire tout ce que l'utilisateur leur demande, du moins en théorie.

De nombreuses industries transfèrent leur service client vers des systèmes de chatbot. C'est à cause de l'énorme baisse du coût par rapport aux humains réels, et aussi à cause de la robustesse et de la disponibilité constante. Les chatbots offrent un certain degré d'assistance aux utilisateurs sans coût supplémentaire substantiel.

Aujourd'hui, les chatbots sont utilisés dans de nombreux scénarios, allant des tâches subalternes telles que l'affichage de l'heure et des données météorologiques à des opérations plus complexes telles que le diagnostic médical rudimentaire et la communication/l'assistance client. Vous pouvez concevoir un chatbot qui aidera vos clients lorsqu'ils poseront certaines questions sur votre produit, ou vous pouvez créer un chatbot assistant personnel capable de gérer des tâches de base et de vous rappeler quand il est temps de vous rendre à une réunion ou à la salle de sport.

Il existe de nombreuses options pour déployer votre chatbot, et l'une des utilisations les plus courantes sont les plateformes de médias sociaux, car la plupart des gens les utilisent régulièrement. La même chose peut être dite des applications de messagerie instantanée, mais avec quelques mises en garde.

Telegram est l'une des plates-formes de messagerie instantanée les plus populaires aujourd'hui, car elle vous permet de stocker des messages sur le cloud au lieu de simplement votre appareil et il offre une bonne prise en charge multiplateforme, car vous pouvez avoir Telegram sur Android, iOS, Windows et à peu près toute autre plate-forme pouvant prendre en charge la version Web. Construire un chatbot sur Telegram est assez simple et nécessite quelques étapes qui prennent très peu de temps. Le chatbot peut être intégré dans des groupes et des canaux Telegram, et il fonctionne également de manière autonome.

Dans ce didacticiel, nous allons créer un bot Telegram qui vous donne une image d'avatar d'Adorables Avatars. Notre exemple impliquera de créer un bot à l'aide de Flask et de le déployer sur un serveur Heroku gratuit.

Pour terminer ce didacticiel, vous aurez besoin de Python 3 installé sur votre système ainsi que de compétences en codage Python. De plus, une bonne compréhension du fonctionnement des applications serait un bon ajout, mais pas indispensable, car nous allons passer en revue la plupart des choses que nous présentons en détail. Vous devez également installer Git sur votre système.

Bien sûr, le tutoriel nécessite également un compte Telegram, qui est gratuit. Vous pouvez vous inscrire ici. Un compte Heroku est également requis et vous pouvez l'obtenir gratuitement ici.

Donnez vie à votre bot Telegram

Pour créer un chatbot sur Telegram, vous devez contacter le BotFather, qui est essentiellement un bot utilisé pour créer d'autres bots.

La commande dont vous avez besoin est /newbot qui mène aux étapes suivantes pour créer votre bot :

Tutoriel du bot Telegram - exemple de capture d'écran

Votre bot doit avoir deux attributs : un nom et un nom d'utilisateur. Le nom apparaîtra pour votre bot, tandis que le nom d'utilisateur sera utilisé pour les mentions et le partage.

Après avoir choisi votre nom de bot et votre nom d'utilisateur - qui doit se terminer par "bot" - vous recevrez un message contenant votre jeton d'accès, et vous devrez évidemment enregistrer votre jeton d'accès et votre nom d'utilisateur pour plus tard, car vous en aurez besoin.

Codez la logique du chatbot

Nous utiliserons Ubuntu dans ce tutoriel. Pour les utilisateurs de Windows, la plupart des commandes ici fonctionneront sans aucun problème, mais si vous rencontrez des problèmes avec la configuration de l'environnement virtuel, veuillez consulter ce lien. En ce qui concerne les utilisateurs de Mac, ce tutoriel devrait fonctionner correctement.

Commençons par créer un environnement virtuel. Il aide à isoler les exigences de votre projet de votre environnement Python global.

 $ python -m venv botenv/

Nous aurons maintenant un botenv/ qui contiendra toutes les bibliothèques Python que nous utiliserons. Allez-y et activez virtualenv à l'aide de la commande suivante :

 $ source botenv/bin/activate

Les bibliothèques dont nous avons besoin pour notre bot sont :

  • Flask : un micro framework Web construit en Python.
  • Python-telegram-bot : un wrapper Telegram en Python.
  • Requêtes : une bibliothèque HTTP Python populaire.

Vous pouvez les installer dans l'environnement virtuel à l'aide de la commande pip comme suit :

 (telebot) $ pip install flask (telebot) $ pip install python-telegram-bot (telebot) $ pip install requests

Parcourons maintenant notre répertoire de projets.

 . ├── app.py ├── telebot │ ├── credentials.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

Dans le fichier credentials.py nous aurons besoin de trois variables :

 bot_token = "here goes your access token from BotFather" bot_user_name = "the username you entered" URL = "the heroku app link that we will create later"

Revenons maintenant à notre app.py et parcourons le code étape par étape :

 # import everything from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL
 global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN)

Nous avons maintenant l'objet bot qui sera utilisé pour toute action que nous demandons au bot d'effectuer.

 # start the flask app app = Flask(__name__)

Nous devons également lier des fonctions à des routes spécifiques. En d'autres termes, nous devons dire à Flask quoi faire lorsqu'une adresse spécifique est appelée. Des informations plus détaillées sur Flask et les itinéraires peuvent être trouvées ici.

Dans notre exemple, la fonction route répond à une URL qui est essentiellement /{token} , et c'est l'URL que Telegram appellera pour obtenir des réponses pour les messages envoyés au bot.

 @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok'

La façon intuitive de faire fonctionner cette fonction est que nous l'appelons toutes les secondes, afin qu'elle vérifie si un nouveau message est arrivé, mais nous ne le ferons pas. Au lieu de cela, nous utiliserons Webhook qui nous permet de laisser le bot appeler notre serveur chaque fois qu'un message est appelé, de sorte que nous n'avons pas besoin de faire souffrir notre serveur dans une boucle while en attendant qu'un message arrive.

Nous allons donc créer une fonction que nous devons nous-mêmes appeler pour activer le Webhook de Telegram, en disant essentiellement à Telegram d'appeler un lien spécifique lorsqu'un nouveau message arrive. Nous n'appellerons cette fonction qu'une seule fois, lors de la première création du bot. Si vous modifiez le lien de l'application, vous devrez exécuter à nouveau cette fonction avec le nouveau lien que vous avez.

L'itinéraire ici peut être n'importe quoi; c'est toi qui l'appelleras :

 @app.route('/setwebhook', methods=['GET', 'POST']) def set_webhook(): # we use the bot object to link the bot to our app which live # in the link provided by URL s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) # something to let us know things work if s: return "webhook setup ok" else: return "webhook setup failed"

Maintenant que tout est configuré, créons simplement une page d'accueil sophistiquée pour que nous sachions que le moteur est en marche.

 @app.route('/') def index(): return '.' if __name__ == '__main__': # note the threaded arg which allow # your app to have more than one thread app.run(threaded=True)

Jetons un coup d'œil à la version complète de app.py :

 import re from flask import Flask, request import telegram from telebot.credentials import bot_token, bot_user_name,URL global bot global TOKEN TOKEN = bot_token bot = telegram.Bot(token=TOKEN) app = Flask(__name__) @app.route('/{}'.format(TOKEN), methods=['POST']) def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # the first time you chat with the bot AKA the welcoming message if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id) return 'ok' @app.route('/set_webhook', methods=['GET', 'POST']) def set_webhook(): s = bot.setWebhook('{URL}{HOOK}'.format(URL=URL, HOOK=TOKEN)) if s: return "webhook setup ok" else: return "webhook setup failed" @app.route('/') def index(): return '.' if __name__ == '__main__': app.run(threaded=True)

C'est le dernier bout de code que vous écrirez dans notre tutoriel. Nous pouvons maintenant passer à la dernière étape, lancer notre application sur Heroku.

Lancez notre application sur Heroku

Nous avons besoin de quelques éléments avant de créer notre application.

Heroku ne peut pas savoir quelles bibliothèques votre projet utilise, nous devons donc l'indiquer à l'aide du fichier requirements.txt (un problème courant est que vous avez mal orthographié les exigences, alors soyez prudent) pour générer le fichier requirements à l'aide de pip :

 pip freeze > requirements.txt

Vous avez maintenant votre fichier d'exigences prêt à l'emploi.

Maintenant, vous avez besoin du Procfile qui indique à Heroku où commence notre application, alors créez un fichier Procfile et ajoutez ce qui suit :

 web: gunicorn app:app

Une étape de rebond : vous pouvez ajouter un fichier .gitignore à votre projet afin que les fichiers inutiles ne soient pas téléchargés dans le référentiel.

Depuis votre tableau de bord Heroku, créez une nouvelle application. Une fois que vous l'avez fait, il vous dirigera vers la page Déployer . Ensuite, ouvrez l'onglet Paramètres dans une nouvelle fenêtre et copiez le domaine de l'application qui ressemblera à https://appname.herokuapp.com/ et collez-le dans la variable URL à l'intérieur credentials.py .

Capture d'écran du tableau de bord Heroku

Maintenant, revenez à l'onglet Déployer et suivez les étapes :

Remarque : les utilisateurs Windows et macOS peuvent suivre les étapes décrites ici.

Connectez-vous à Heroku :

 $ heroku login

Veuillez noter que cette méthode est parfois bloquée en waiting for login , si cela vous arrive, essayez de vous connecter en utilisant :

 $ heroku login -i

Initialisez un dépôt Git dans notre répertoire :

 $ git init $ heroku git:remote -a {heroku-project-name}

Déployez l'application :

 $ git add . $ git commit -m "first commit" $ git push heroku master

À ce stade, vous verrez la progression de la construction dans votre terminal. Si tout s'est bien passé, vous verrez quelque chose comme ceci :

 remote: -----> Launching... remote: Released v6 remote: https://project-name.herokuapp.com/ deployed to Heroku remote: remote: Verifying deploy... done.

Allez maintenant sur la page de l'application (le lien du domaine que vous avez copié auparavant) et ajoutez à la fin du lien /setwebhook afin que l'adresse ressemble à https://appname.herokuapp.com/setwebhook . Si vous voyez webhook setup ok , cela signifie que vous êtes prêt à commencer !

Allez maintenant parler à votre bot

Version en direct du chatbot Telegram
Une version live du bot

Touches finales, trucs et astuces

Vous avez maintenant votre bot Telegram opérationnel, 24h/24 et 7j/7, sans aucune intervention de votre part. Vous pouvez ajouter la logique que vous voulez au bot, ainsi, par exemple, vous pouvez rendre votre bot plus réaliste en ajoutant un statut de « saisie » et en envoyant un statut de photo comme suit :

L'extrait de code suivant de la fonction respond() :

 if text == "/start": # print the welcoming message bot_welcome = """ Welcome to coolAvatar bot, the bot is using the service from http://avatars.adorable.io/ to generate cool looking avatars based on the name you enter so please enter a name and the bot will reply with an avatar for your name. """ # send the welcoming message bot.sendChatAction(chat_id=chat_id, action="typing") sleep(1.5) bot.sendMessage(chat_id=chat_id, text=bot_welcome, reply_to_message_id=msg_id) else: try: # clear the message we got from any non alphabets text = re.sub(r"\W", "_", text) # create the api link for the avatar based on http://avatars.adorable.io/ url = "https://api.adorable.io/avatars/285/{}.png".format(text.strip()) # reply with a photo to the name the user sent, # note that you can send photos by url and telegram will fetch it for you bot.sendChatAction(chat_id=chat_id, action="upload_photo") sleep(2) bot.sendPhoto(chat_id=chat_id, photo=url, reply_to_message_id=msg_id) except Exception: # if things went wrong bot.sendMessage(chat_id=chat_id, text="There was a problem in the name you used, please enter different name", reply_to_message_id=msg_id)

Comme vous pouvez le voir dans l'extrait de code, nous avons ajouté une action de frappe lorsque nous sommes sur le point d'envoyer les informations sur le bot au format texte, et ajouté une action de téléchargement de photo lorsque nous sommes sur le point d'envoyer une photo pour rendre le bot plus réaliste . Plus d'actions peuvent être trouvées ici.

Vous pouvez également modifier l'image et la description du bot du canal BotFather pour le rendre plus convivial.

De nombreux exemples plus simples de robots télégrammes peuvent être trouvés sur la page python-telegram-bot sur GitHub.

Vous pouvez vous appuyer sur notre bot et en faire le prochain super bot IA - tout ce que vous avez à faire est d'intégrer votre logique dans la fonction respond() . Par exemple, votre logique peut être dans un module séparé et peut être appelée à l'intérieur de la fonction respond() comme ceci :

 . ├── app.py ├── telebot │ ├── credentials.py │ ├──ai.py │ | . │ | you can build your engine here │ | . │ └── __init__.py └── botenv

Et à l'intérieur de ai .py :

 def generate_smart_reply(text): # here we can do all our work return "this is a smart reply from the ai!"

Importez-le maintenant dans l' application .py :

 import re from time import sleep from flask import Flask, request import telegram From telebot.ai import generate_smart_reply from telebot.credentials import bot_token, bot_user_name,URL

Ensuite, appelez-le simplement à l'intérieur du code respond() .

 def respond(): # retrieve the message in JSON and then transform it to Telegram object update = telegram.Update.de_json(request.get_json(force=True), bot) chat_id = update.message.chat.id msg_id = update.message.message_id # Telegram understands UTF-8, so encode text for unicode compatibility text = update.message.text.encode('utf-8').decode() # for debugging purposes only print("got text message :", text) # here call your smart reply message reply = generate_smart_reply(text) bot.sendMessage(chat_id=chat_id, text=reply, reply_to_message_id=msg_id)

Maintenant, vous pouvez faire fonctionner votre bot comme vous le souhaitez - allez-y et créez la prochaine grande chose !

J'espère que vous vous êtes amusé à créer votre premier bot Telegram.

Ressources supplémentaires

  • Construire un chatbot en utilisant Telegram et Python
  • Configurer votre Telegram Bot WebHook en toute simplicité
  • Référentiel Python-telegram-bot
  • Déploiement avec Git sur Heroku
  • Documentation Python Telegram Bot
En relation : Créer un chatbot WhatsApp, pas une application