Anwendung für ein Framework für einen Multi-Plattform-Bot

Bild

Chatbots sind eng in unser Informationsleben eingedrungen. Alle sich selbst respektierenden sozialen Netzwerke und Instant Messenger unterstützen Bots. Sie bieten eine praktische API für ihre Entwicklung und Verwendung, alles für Benutzer und Programmierer. Um einen Bot in Telegram zu erstellen, müssen Sie nicht einmal eine Programmiersprache kennen. Es gibt Dienste, mit denen Sie einen Bot über die Weboberfläche entwerfen können. Und das ist wirklich gut, aber erst kürzlich bin ich auf ein Problem gestoßen und war überrascht, dass es bei dieser Welle der Popularität von Chatbots, die jetzt nicht nur eine coole Funktion, sondern auch ein einkommensschaffendes Werkzeug sind, praktisch keine Antwort gibt.

Und die Frage ist: Was ist, wenn ich mehr als einen Bot für einen Dienst erstellen möchte? Ich weiß zum Beispiel, dass CA in Vkontakte und Telegram sitzt. Wie kann ich mit minimalem Aufwand Bots schreiben, um dort und dort mit Leuten zu arbeiten? Wenn ich plötzlich (zum Beispiel als Besitzer eines Online-Shops) auch mit dem Publikum auf Facebook über Bots arbeiten möchte, muss ich wirklich einen neuen Bot von Grund auf neu entwickeln und die gesamte Logik dafür neu schreiben oder versuchen, in eine neue API oder Bibliothek einzutauchen. Und ich habe versucht, die Antwort unter dem Schnitt zu finden, ich frage an den Tisch.

Tatsächlich gibt es Lösungen, und es gibt viele, aber alle laufen darauf hinaus, dass Sie Ihren Bot mit einem Dienst hosten müssen, der auch eine Plattform bietet. Das heißt, Sie können keine Box-Lösung erhalten. Vielleicht irre ich mich und habe nicht vollständig untersucht, was tatsächlich existiert, aber die Tatsache, dass der erste Link in Google nicht zu einer Lösung führt, ist bereits alarmierend. Es gibt auch Botman . Dies ist eine wirklich leistungsstarke, vollwertige Open-Source-Entwicklungsbibliothek mit einer Reihe von Chips und umfassender Dokumentation. Und es ist in PHP geschrieben. Ich habe nichts gegen PHP , auf jeden Fall gebe ich es nicht öffentlich zu, um keinen unnötigen Holivar zu züchten, aber ich habe keine Lust, es zu entwickeln. Ich habe mich entschlossen, nach etwas ähnlichem wie Python zu suchen. Zusätzlich zu Python gibt es viele Bibliotheken, mit denen Sie mit der Telegramm-Bot-API arbeiten können. Und ich fand nichts, so dass ich bald zu dem Schluss kam, dass es sich lohnt, selbst zu schreiben. (Vielleicht kennt jemand die geeigneten Lösungen für Multi-Plattform-Bots mit einem offenen System, ich freue mich über jede Information)

Hier braut sich übrigens ein weiteres Problem zusammen. Ich habe absolut keine Ahnung, wo Sie die Arbeit in Form eines anderen Artikels als über Habré mit dem Publikum teilen können. Ich werde sehr gerne in dieser Angelegenheit helfen.

Der Name Botovod kam von selbst.

Im Allgemeinen werde ich mit Botovod einen kleinen Code geben und ihn kurz erklären.
Spoiler Überschrift
from 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() 



Hier definieren wir 3 Handler für eingehende Nachrichten, von denen jeder eine Antwort sendet. Das erste: "Ich habe eine Nachricht erhalten", das zweite: "Ich sehe ein Foto", das dritte sendet einfach zurück, was ich erhalten habe. Dann erstellen wir einen Bot-Manager (Botovod) und übergeben ihm die Einstellungen für die Bots, in diesem für den Bot in Telegram. Als Nächstes fügen wir nacheinander Nachrichtenhandler hinzu. Wenn eine Nachricht beim Bot eintrifft, geht sie an den ersten Handler, der sich bereit erklärt, sie zu akzeptieren. Wenn beispielsweise ein Audio an uns gesendet wurde, versucht der erste Handler, es zuerst zu akzeptieren, lehnt es jedoch ab, da dies kein Text ist. Dann wird er das zweite akzeptieren, aber auch ablehnen, da dies kein Bild ist, dann wird er das dritte akzeptieren, das keine Einschränkungen hat - auf diese Weise wird das Audio-Ortho weitergeleitet Einschränkungen werden als Dekoratoren aus dem Utils-Modul auferlegt.

Jetzt werde ich versuchen, im Detail zu sagen, was was ist:

Es gibt einen Bot-Manager - ein Objekt der Botovod-Klasse - den Namen des Bots (jeder hat seine eigene eindeutige), die Agentenklasse, die ihn verarbeitet, und die Einstellungen für den Bot werden im Konstruktor an ihn übergeben. Außerdem werden dem Bot-Manager nacheinander Handler hinzugefügt. Wenn eine Nachricht beim Bot eintrifft, überprüft der Manager diese nacheinander, bis er den Handler findet, der die NotPassed-Ausnahme auslöst. Der erste hinzugefügte Handler wird zuerst überprüft, der letzte bzw. der letzte. Wenn Sie Webhooks verwenden möchten, kann der Bot-Manager mit dem Webserver verbunden werden. Zu diesem Zweck verfügt der Bot-Manager über eine Listen-Methode, die den Bot-Namen, die Header und den Anforderungshauptteil akzeptiert. Anschließend werden diese Daten an den Agentenparser übergeben, der die generierte Nachricht zurückgibt, nachdem diese Nachricht durch die Handler gesendet wurde. Als Antwort gibt die Listen-Methode das Wörterbuch {"status": any_code, "headers": dict (), "body": "any_text"} zurück, wobei in Headern die Antwortheader und im body der Antworttext sind. Manchmal erfordert der Messenger / das soziale Netzwerk, dass der Server ein Objekt zurückgibt, daher halte ich dieses Verhalten für praktisch.

Ich werde ein Beispiel für den Vkontakte-Bot unter dem Namen "vk-bot" geben, und Botovod wird eine Verbindung zum Django-Server herstellen

 def view(request): response = manager.listen("vk-bot", request.headers, request.text) return HttpResponse(status = response["status"], headers = response["headers"], response["body"]) 


Eine gebildete Nachricht ist ein Objekt der Nachrichtenklasse. Es enthält die folgenden Felder: Text - Nachrichtentext; Bilder - eine Liste mit Bildern; Audios - eine Liste mit Audiodateien; Videos - eine Liste von Videos; Dokumente - eine Liste mit Dokumenten; Orte - eine Liste mit Orten auf der Karte; raw - der rohe Nachrichtentext oder zusätzliche Informationen dazu (Wörterbuch).

Außerdem enthält jede Liste des Nachrichtenobjekts (Bilder, Audios, Videos, Dokumente) spezielle Objekte, deren Klassen vom Anhang geerbt werden. Die Attachment-Klasse verfügt standardmäßig über die Methoden url und file_path, mit denen Agenten-Parser normalerweise Informationen über die empfangene Datei ablegen. Die Standortliste enthält Standortobjekte, an deren Konstruktor Sie Längen- und Breitengrad (Längen- und Breitengrad) übergeben müssen.

Unten finden Sie ein Beispiel für die Erstellung von Nachrichten in Handlern

 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) 


Das ist alles, was im Moment drin ist, aber ich hoffe, dass jemand an einer solchen Lösung interessiert ist und jemand mit Ratschlägen, Kommentaren, Ideen und vielleicht seiner eigenen Beteiligung an der Entwicklung helfen möchte. Vielen Dank fürs Lesen!

Github Link

Source: https://habr.com/ru/post/de422081/


All Articles