
Les chatbots sont étroitement entrés dans notre vie d'informations, tous les réseaux sociaux qui se respectent et les messageries instantanées prennent en charge les bots, ils fournissent une API pratique pour leur développement et leur utilisation, le tout pour le confort des utilisateurs et des programmeurs. Maintenant, pour créer un bot dans Telegram, il n'est même pas nécessaire de connaître un langage de programmation. Il existe des services qui vous permettent de concevoir un bot à l'aide de l'interface Web. Et c'est vraiment bien, mais récemment, j'ai rencontré un problème et j'ai été surpris de constater que sur cette vague de popularité des chatbots, qui ne sont désormais plus seulement une fonctionnalité intéressante, mais aussi un outil générateur de revenus - il n'y a pratiquement pas de réponse.
Et la question est: et si je veux créer plus d'un bot pour un service? Par exemple, je sais que CA est assis à Vkontakte et Telegram, comment puis-je écrire des bots avec un minimum d'effort pour travailler avec des gens là et là? Si soudainement (par exemple, en tant que propriétaire d'une boutique en ligne), je souhaite également travailler avec le public sur Facebook à l'aide de bots, ai-je vraiment besoin de développer un nouveau bot à partir de zéro et de réécrire toute la logique pour cela ou d'essayer de plonger dans une nouvelle API ou bibliothèque. Et j'ai essayé de trouver la réponse sous la coupe, je demande à la table.
En fait, il existe des solutions, et il y en a beaucoup, mais elles se résument toutes au fait que vous devez héberger votre bot avec un service qui fournit également une plate-forme. Autrement dit, vous ne pouvez pas obtenir une solution en boîte. Je me trompe peut-être et je n'ai pas entièrement étudié ce qui existe réellement, mais le fait que le premier lien dans Google ne mène pas à une solution est déjà alarmant. Il y a aussi
Botman . Il s'agit d'une bibliothèque open source de développement à part entière très puissante avec un tas de puces et une documentation complète. Et il est écrit en
PHP. Je n'ai rien contre
PHP , en tout cas je ne l'admets pas publiquement, afin de ne pas créer d'holivar inutile, mais je ne veux pas du tout développer dessus. J'ai décidé de chercher quelque chose de similaire à Python, en plus de Python, il existe de nombreuses bibliothèques qui vous permettent de travailler avec l'API Telegram Bot. Et je n'ai rien trouvé, alors je suis vite arrivé à la conclusion qu'il valait la peine de m'écrire.
(Peut-être que quelqu'un connaît les solutions appropriées pour les robots multi-plateformes avec un système ouvert, je serai heureux de toute information)Ici, au fait, un autre problème se prépare. Je ne sais absolument pas où vous pouvez partager votre travail avec le public sous la forme d'un article autre que sur Habré. Je serai très heureux de vous aider dans cette affaire.
Le nom
Botovod est venu tout seul.
En général, je vais donner un petit code en utilisant Botovod et l'expliquer brièvement.
En-tête de spoilerfrom botovod import Botovod, Message, utils @utils.convert_to_text def handler_message(agent, chat, text): message = Message() message.text = " " agent.send_message(chat, message) @utils.convert_to_images def handler_images(agent, chat, images): message = Message() message.text = " " agent.send_message(chat, message) def handler_echo(agent, chat, message): agent.send_message(chat, message) settings = [ { "name": "telegram", "agent": "botovod.agents.telegram", "settings": {"token": "462755273:AzBZBQ7AAnqFEXqZ_P8Z-qvCddmjqTVAYPI", "method": "polling"} }, ] botovod = Botovod(settings) botovod.add_handler(handler_message) botovod.add_handler(handler_images) botovod.add_handler(handler_echo) botovod.start()
Ici, nous définissons 3 gestionnaires pour les messages entrants, chacun envoyant quelque chose en réponse. Le premier: «J'ai reçu un message», le second: «Je vois une photo», le troisième renvoie simplement ce que j'ai reçu. Ensuite, nous créons un gestionnaire de bot (Botovod) et lui passons les paramètres pour les bots, dans celui-ci pour le bot dans Telegram. Ensuite, nous ajoutons séquentiellement des gestionnaires de messages. Si un message arrive au bot, il ira au premier gestionnaire qui accepte de l'accepter. Par exemple, si un fichier audio nous a été envoyé, le premier gestionnaire tentera de l'accepter en premier, mais refusera, car il ne s'agit pas de texte. Ensuite, il acceptera la seconde, mais refusera également, car ce n'est pas une image, puis il acceptera la troisième, qui n'a aucune restriction - de cette façon, il transmettra l'audio orthogonalement. Les contraintes sont imposées en tant que décorateurs à partir du module utils.
Maintenant, je vais essayer de dire en détail ce qui est quoi:
Il y a un gestionnaire de bot - un objet de la classe Botovod - le nom du bot (chacun a son propre unique), la classe d'agent qui le traitera et les paramètres du bot lui seront transmis dans le constructeur. En outre, les gestionnaires sont ajoutés à tour de rôle au gestionnaire de bot. Si un message arrive au bot, le gestionnaire les vérifiera à son tour jusqu'à ce qu'il trouve le gestionnaire qui lève l'exception NotPassed. Le premier gestionnaire ajouté est vérifié en premier, le dernier, respectivement, le dernier. Si vous avez l'intention d'utiliser des webhooks, le gestionnaire de bots peut être connecté au serveur Web. Pour ce faire, le gestionnaire de bot dispose d'une méthode d'écoute qui accepte le nom du bot, les en-têtes et le corps de la demande. Il transmet ensuite ces données à l'analyseur d'agent, qui renvoie le message généré, une fois ce message poussé à travers les gestionnaires. En réponse, la méthode listen renvoie le dictionnaire {"status": any_code, "headers": dict (), "body": "any_text"}, où dans les en-têtes sont les en-têtes de réponse, et dans le corps est le corps de réponse. Parfois, le messager / réseau social nécessite que le serveur retourne un objet, donc je pense que ce comportement est pratique.
Je vais donner un exemple pour le bot Vkontakte sous le nom "vk-bot", et Botovod se connectera au serveur Django
def view(request): response = manager.listen("vk-bot", request.headers, request.text) return HttpResponse(status = response["status"], headers = response["headers"], response["body"])
Un message formé est un objet de la classe Message. Il comprend les champs suivants: texte - texte du message; images - une liste d'images; audios - une liste avec des fichiers audio; vidéos - une liste de vidéos; documents - une liste de documents; emplacements - une liste avec des endroits sur la carte; raw - le corps du message brut ou des informations supplémentaires (dictionnaire).
De plus, chaque liste de l'objet Message (images, audios, vidéos, documents) contient des objets spéciaux dont les classes sont héritées de Attachment. Par défaut, la classe Attachment a les méthodes url et file_path dans lesquelles les analyseurs d'agent mettent généralement des informations sur le fichier reçu. La liste des emplacements contient des objets Emplacement, au constructeur dont vous devez transmettre la longitude et la latitude (longitude et latitude).
Voici un exemple de construction de messages dans les gestionnaires
def handler(agent, chat, message): out = botovod.Message() image = botovod.Image() image.file_path = "/tmp/1.png" location = botovod.Location() out.images.append(image) out.text = " , " agent.send_message(chat, out)
C'est tout ce qu'il y a pour l'instant, mais j'espère que quelqu'un sera intéressé par une telle solution et que quelqu'un voudra aider avec des conseils, des commentaires, des idées et peut-être leur propre participation au développement. Merci à tous d'avoir lu!
Lien Github