Wie ich einen Python-Cart-Chatbot geschrieben und an einem Tag auf einem Remote-Computer bereitgestellt habe

Hallo alle! Mein Name ist Katya und ich bin Backend-Entwicklerin. Ich schreibe hauptsächlich in Java, manchmal in Kotlin. Eines schönen Tages hatte ich die Idee, einen Chatbot für einen Einkaufswagen zu schreiben. Aufgrund der Besonderheiten meiner Arbeit begann ich damit, eine Spring-Boot-Anwendung in Java zu schreiben, dann wurde ich in das Anhängen der Datenbank hineingetragen, langsam floss alles in das Thema, einen Dienst als solchen zu erstellen, und es erreichte den Moment nicht Telegramme wurden tatsächlich vom Bot aufgerufen 😅.

Beim nächsten Ansatz dachte ich: Warum Java, nehmen wir Python. Ich hatte wenig Erfahrung mit dem Schreiben in dieser Sprache – und ich entschied mich – ich beginne noch einmal mit “Hallo Welt!” nur sofort im Rahmen des Telegramm-Chatbot-Projekts. Im Internet habe ich eine coole Bibliothek mit klangvollem Namen gefunden Natascha. Die Idee des Bots ist folgende: Sie laden Ihren Chat von einem derzeit gesperrten Messenger herunter und geben diese .txt-Datei an den Bot. Es findet die TOP 10 Substantive und Verben aus Ihrem Chat 🤓. Als nächstes gehen wir die Schritte durch.

Organisatorischer Teil

  1. Benutzer im Telegramm finden Er ist der Gott aller Bots.

  2. Geben Sie ihm den Befehl /newbot, um einen neuen Bot zu erstellen. Benennen Sie Ihren Bot und stellen Sie sicher, dass der Name mit Bot endet. Mein Name ist analyzeYourChatBot

  3. In der Antwortnachricht sendet Ihnen der Vater der Bots ein API-Zugriffstoken.

  4. Sie können auch sofort eine Beschreibung für Ihren Bot festlegen, indem Sie den Befehl /setdescription aufrufen und auch einen Avatar /setuserpic einfügen

Bot-Funktionalität

Kehren wir zur Idee des Bots zurück: Nehmen Sie eine .txt-Datei, lesen Sie den Inhalt, löschen Sie den Text von unnötigen Dingen, brechen Sie ihn in Wörter auf, verstehen Sie, welche davon Substantive und welche Verben sind, zählen Sie die Anzahl der einzelnen und Anzeige der TOP 10.

Der Hauptteilnehmer an den Aktionen ist also die Analysefunktion, die den Inhalt der Datei aufnimmt. Zeile für Zeile weiter:
46 – Wandelt alle Wörter in Kleinbuchstaben um
47 – Entfernen Sie den Text mit dem Datumsmuster und dem Absender der Nachricht [16.09.2021, 17:10:20] Katerina: Und was bleibt heute übrig? Getestet das Muster in einem praktischen Online-Dienst Regex101
48 – Lassen Sie nur russische Wörter und Leerzeichen im Text
49 – Mehrere Leerzeichen zu einem zusammenklappen
51-61 – Kopieren und Einfügen von Code aus Beispielen für die Verwendung der Bibliothek Natascha. Ganz kurz haben wir den Text in Wörter unterteilt und festgestellt, welches Wort ein Substantiv und welches ein Verb ist.
Als nächstes bilden wir eine Datenstruktur mit Substantiven und Verben, finden die Anzahl jedes Vorkommens, sortieren und verlassen die TOP 10.

#!/usr/bin/env python3 import re from string import whitespace from collections import defaultdict from natasha import ( Segmenter, MorphVocab, NewsEmbedding, NewsMorphTagger, NewsSyntaxParser, Doc ) CYRILLIC_LETTERS = u”abvgdeejjjjklmnoprstufxchshchjyueya” TOP_COUNT = 10 def strip(text): Allowed_chars = CYRILLIC_LETTERS + Whitespace return “”.join([c for c in text if c in allowed_chars]) def sort(data): result_dict = defaultdict(int) for key in data: result_dict[key]+=1 return sorted(result_dict.items(), key=lambda kv: kv[1]reverse=True) def make_str(data): result = “” top_data = data[:TOP_COUNT]
for key, value in top_data: result += key result += “: ” result += str(value) result += “\n” return result def find(data, type): result = []
für Artikel in Daten: if (item.pos == type): result.append(item) return result def analyze(data): text = data.lower() text = re.sub(r’\[\d{2}\.\d{2}\.\d{4}\, \d{2}:\d{2}:\d{2}\] .+?:’, ”, text, flags=re.MULTILINE) text = strip(text) text = re.sub(‘ +’, ‘ ‘, text) segmenter = Segmenter() morph_vocab = MorphVocab() emb = NewsEmbedding() morph_tagger = NewsMorphTagger(emb) doc = Doc(text) doc.segment(segmenter) doc.tag_morph(morph_tagger) für Token in doc.tokens: token.lemmatize(morph_vocab) nouns_dict = find(doc.tokens, ‘NOUN ‘) verbs_dict = find(doc.tokens, ‘VERB’) nouns_lemmas = [_.lemma for _ in nouns_dict]
verbs_lemmas = [_.lemma for _ in verbs_dict]

sorted_nouns_dict = sort(nouns_lemmas) sorted_verbs_dict = sort(verbs_lemmas) res_nouns = make_str(sorted_nouns_dict) res_verbs = make_str(sorted_verbs_dict) result = “TOP ” + str(TOP_COUNT) + ” Substantive in deinem Chat:\n” result += res_nouns result + = “\n” Ergebnis += “TOP ” + str(TOP_COUNT) + ” Verben in Ihrem Chat:\n” Ergebnis += res_verbs Ergebnis zurückgeben

Aufrufen der Bot-Funktionalität

Handler-Methoden (Empfänger bestimmter Befehle) werden in einer separaten Datei im Projektordner gesammelt. Ich habe mich für die Bibliothek entschieden pyTelegramBotAPI um schneller und effizienter mit der Warenkorb-API zu interagieren.

9 definieren wir eine Konstante mit einem Token, das uns der Vater der Bots geschickt hat
11 Erstellen Sie eine Instanz des Telebot-Objekts
64 starten Sie diese Instanz, damit sie funktioniert
Wir schreiben einfache Funktionen für die /start- und /help-Befehle, die einfach mit einem Textblatt antworten. Der Hauptbeitragende hier ist get_document. In der Funktion erhalten wir ein Dokument, prüfen, ob es im .txt-Format vorliegt, lesen dann den Inhalt daraus und rufen die Funktion aus der bereits vorbereiteten Datei aus dem vorherigen Schritt auf.

#!/usr/bin/env python3 import telebot import reviews import analyze_chat import uuid import os TOKEN = “blablabla” bot = telebot.TeleBot(TOKEN) @bot.message_handler(commands=[‘start’]) def send_welcome(message): bot.send_message( message.chat.id, ‘Hallo!✌️ Ich bin ein Bot, der Ihre WhatsApp-Konversation analysiert \n’ + ‘(gehört zu Meta, einer in Russland anerkannten extremistischen Organisation). \n’ + ‘Laden Sie den Dialog herunter (nur auf Russisch 🇷🇺) und senden Sie ihn im .txt-Format an den Bot.\n’ + ‘Um zu sehen, wie Sie den gesamten Dialog herunterladen können, gehen Sie zu /help.\n’ + ‘⚡️ Achtung! Ihre Dialoge werden nicht auf der Anwendungsseite gespeichert, ‘ + ‘sie können jedoch möglicherweise von Angreifern über das Netzwerk abgefangen werden!’ ) @bot.message_handler(commands=[‘help’]) def get_help(message): bot.send_message( message.chat.id, ‘1) Gehen Sie von WhatsApp ‘ + ‘ (gehört zu Meta, einer in der Russischen Föderation anerkannten extremistischen Organisation) zu dem Chat, den Sie analysieren möchten. \n’ + ‘2) Gehen Sie zu den Chat-Einstellungen \n’ + ‘3) Klicken Sie auf “Chat exportieren” -> Keine Medien -> Auf Ihrem Computer speichern\n’ + ‘4) Entpacken und senden Sie den Inhalt des Archivs an the bot (jeweils eine Datei, wenn es mehrere gibt)’ ) @bot.message_handler(content_types=[‘document’]) def get_document(message): if (message.document.mime_type != ‘text/plain’): bot.reply_to(message, “Sie haben die Datei gesendet, aber sie ist nicht im .txt-Format 🥴 Korrigieren Sie bitte dieses Missverständnis”) else : return analyze(message) def analyze(message): file_info = bot.get_file(message.document.file_id) response = reviews.get(‘ file_info.file_path)) random_file_name = “response_” + str(uuid.uuid4() ) + “.txt” mit open(random_file_name, “wb”) als f: f.write(response.content) text = get_text_from_file(random_file_name) result = analyze_chat.analyze(text) os.remove(random_file_name) bot.reply_to( message , result) def get_text_from_file(file_name): f = open(file_name, “r”, encoding=”utf-8″) text = f.read() Rückgabetext @bot.message_handler(func=lambda message: True) def echo_all (Nachricht): bot.reply_to(Nachricht, “Ich kann nur eine .txt-Datei akzeptieren 🥺 Scheint nicht so zu sein”) bot.infinity_polling()

Setzen Sie das Ganze ein

Wir haben also den Code, aber er funktioniert nur, wenn Sie Ihren Laptop geöffnet haben (lol). Gehen wir einen Schritt zurück und ich sage Ihnen, dass Sie zwei Bibliotheken installieren müssen, damit der Code funktioniert:

pip installiere pyTelegramBotAPI pip installiere natasha

Und natürlich muss Python installiert sein 👽. Stellen Sie sich nun vor, dass all dies auf einem Remote-Computer installiert werden muss. Denken wir an Docker. Und nutzen Sie die Leistungsfähigkeit der Docker-Datei. Ich füge ein Dockerfile im Projektordner hinzu und schreibe Folgendes:
1 Ich mache ein Bild basierend auf dem offiziellen aus Python
2.3 Ich füge Dateien mit zwei Skripten hinzu, die in den vorherigen Schritten geschrieben wurden
3.4 Installieren Sie die erforderlichen Bibliotheken, damit die Anwendung funktioniert
6 Code ausführen

VON python:3 HINZUFÜGEN chatbot.py . HINZUFÜGEN analyze_chat.py . RUN pip install pyTelegramBotAPI RUN pip install natasha CMD python3 ./chatbot.py

Als Nächstes erstellen wir ein benutzerdefiniertes Anwendungs-Image basierend auf der Docker-Datei:

docker build -t vrestles/analyze-chat-bot:latest -f Dockerfile .

Ich übertrage dieses Bild auf Docker-Hub als Privatbild:

docker login -u vrestles -p ***** docker push vrestles/analyze-chat-bot:latest

Beachten Sie, dass ich mich zuerst angemeldet und dann das Bild gepusht habe.

Als nächstes gehe ich zur Remote-Maschine – Docker ist dort bereits installiert. Und er ist übrigens der Einzige. Und alles, was ich tun muss, ist, mich erneut beim Docker anzumelden und das private Image auszuführen:

docker run -d vrestles/analyze-chat-bot:latest

Übrigens wird er beim Start selbst verstehen, dass das Bild nicht heruntergeladen wurde, und ihm selbst folgen. Der Start erfolgt im Touch-Modus, was bedeutet, dass er im Hintergrund gestartet wird und nur die Container-ID angibt. Sie können laufende Container mit dem Befehl docker ps anzeigen

Letztes Wort

Im Allgemeinen habe ich es wirklich genossen, in Python zu schreiben – es ist schnell und sehr spannend. Docker-Regeln wie immer. Danke für deine Aufmerksamkeit und du kannst mich in den Kommentaren mit Tomaten bewerfen 💋.

Similar Posts

Leave a Reply

Your email address will not be published.