Erstellen eines einfachen Chat-Bots in VK unter Python 3

Das Erstellen der Basis für den Bot besteht aus den folgenden Schritten:


  1. Erstellen eines Bots in VK
  2. API-Schlüsselgenerierung
  3. Erstellen eines Bot-Programms über LongPoolVK

Für wen ist dieser Artikel?


Der Artikel richtet sich an Programmierer für Anfänger. Die Arbeitsweise des Programms ist sehr einfach und jeder, der die Python-Syntax kennt und ein wenig OOP kennt, kann sie für seine Bedürfnisse implementieren. Aber im Prinzip, auch ohne Kenntnis der OOP-Prinzipien, können Sie lernen, wie man einfache Funktionen hinzufügt oder zumindest in extremen Fällen vorgefertigte Quellen von GitHub verwendet.

Was ist in diesem Artikel?


Basis des Bots erstellen. Danach kann es nach Belieben programmiert werden. Automatisieren Sie eine Routine oder verwenden Sie sie als Gesprächspartner.

Verbessert (etwas komplizierte Version des Bots). Ich beschloss, zuerst einen einfachen Verfahrenscode für den Bot einzuführen und ihn dann durch Hinzufügen von Funktionen, die den Bot erheblich verbessern, etwas zu komplizieren.

Wetterübertragungsfunktion hinzufügen. Wir werden dem Bot beibringen, uns das Wetter mitzuteilen.

Erstellen eines Bots in VK


Wir werden zunächst einen Bot erstellen, nämlich eine Gruppe in VK.

Gehen Sie dazu zu "Gruppen" → "Community erstellen".

Wählen Sie einen beliebigen Community-Typ aus und geben Sie einen Namen und ein Gruppenthema ein.

Wählen Sie auf der sich öffnenden Einstellungsseite "Mit API arbeiten" aus.

Als Nächstes müssen Sie einen API-Schlüssel erstellen.

Wählen Sie dann die Parameter aus, die Sie für den Zugriff auf Ihren API-Schlüssel benötigen.

Höchstwahrscheinlich müssen Sie die Aktion in VK mit Ihrem Mobiltelefon bestätigen. Kopieren Sie dann den resultierenden API-Schlüssel irgendwo in eine Datei. Wir brauchen es noch.

Dann müssen Sie Nachrichten zulassen. Gehen Sie dazu zur "Nachricht" und schalten Sie sie ein.

Fahren wir mit dem Programmteil des Bots fort


Wir werden es nicht durch Anfragen an die VK implementieren, oder genauer gesagt, wir verwenden einfach die VkLongPool-Bibliothek, die es für uns erledigt.

Dies erfordert die Bibliothek vk_api. Installieren Sie es über pip:

python -m pip installiere vk_api

Aber ich persönlich arbeite mit der virtuellen Umgebung von Anaconda. Dies führt häufig zu Problemen bei der ersten Arbeit. Normalerweise besteht das Problem darin, dass das System den Python-Befehl nicht erkennt. Und dieses Problem wird gelöst, indem es zu PATH hinzugefügt wird.

Kommen wir zum Code selbst:

Wir importieren die notwendigen Module:

import vk_api from vk_api.longpoll import VkLongPoll, VkEventType 

Dann der Code:

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk) #   for event in longpoll.listen(): #     if event.type == VkEventType.MESSAGE_NEW: #      (   ) if event.to_me: #    request = event.text #    if request == "": write_msg(event.user_id, "") elif request == "": write_msg(event.user_id, "((") else: write_msg(event.user_id, "   ...") 

Die Funktion write_msg empfängt die VK-Benutzer-ID <Benutzer-ID>, an die sie die Nachricht und die Nachricht selbst sendet.

 def write_msg(user_id, message): vk.method('messages.send', {'user_id': user_id, 'message': message}) 

Als Community anmelden und Longpool einrichten:

 # API-   token = "6a9c267cd469388709a9e9acaddbe0aa81a0abbf12239b3e597a31729ffbddb9c88e80a443554c918b8f7" #    vk = vk_api.VkApi(token=token) #    longpoll = VkLongPoll(vk)    : #   for event in longpoll.listen(): 

Darin werden wir zyklisch nach Ereignissen suchen. Und wir können den Ereignistyp mit event.type abrufen.

Nachdem wir eine Nachricht vom Benutzer erhalten haben, können wir ihm mit der bereits erstellten Funktion write_msg einen entsprechenden Brief senden.

Also haben wir in VK einen sehr einfachen Bot mit derselben einfachen Implementierung erstellt. Und die Logik des Bots kann nach Ihren Wünschen programmiert werden.

Auflistung des GH-Codes

Beginnen wir jetzt mit einer realeren Programmierung.


Erstellen Sie eine Klasse VkBot in der Datei vk_bot.py, die uns als Bot dient.

 class VkBot: def __init__(self, user_id): print("  !") self._USER_ID = user_id self._USERNAME = self._get_user_name_from_vk_id(user_id) self._COMMANDS = ["", "", "", ""] 

Fügen Sie dort eine Methode hinzu, mit der Sie den Benutzernamen über die vk-ID abrufen können.

 def _get_user_name_from_vk_id(self, user_id): request = requests.get("https://vk.com/id"+str(user_id)) bs = bs4.BeautifulSoup(request.text, "html.parser") user_name = self._clean_all_tag_from_str(bs.findAll("title")[0]) return user_name.split()[0] 

Dies geschieht mit beatifulsoup4.

Installieren Sie, wenn dies nicht der Fall ist:
python -m pip install bs4
Es gibt genug Artikel, die es wert sind, studiert zu werden. Damit erstellen wir einige weitere Methoden:

 #  : def _get_time(self): request = requests.get("https://my-calend.ru/date-and-time-today") b = bs4.BeautifulSoup(request.text, "html.parser") return self._clean_all_tag_from_str(str(b.select(".page")[0].findAll("h2")[1])).split()[1] #   def _get_weather(city: str = "-") -> list: request = requests.get("https://sinoptik.com.ru/-" + city) b = bs4.BeautifulSoup(request.text, "html.parser") p3 = b.select('.temperature .p3') weather1 = p3[0].getText() p4 = b.select('.temperature .p4') weather2 = p4[0].getText() p5 = b.select('.temperature .p5') weather3 = p5[0].getText() p6 = b.select('.temperature .p6') weather4 = p6[0].getText() result = '' result = result + (' :' + weather1 + ' ' + weather2) + '\n' result = result + (' :' + weather3 + ' ' + weather4) + '\n' temp = b.select('.rSide .description') weather = temp[0].getText() result = result + weather.strip() return result #       @staticmethod def _clean_all_tag_from_str(string_line): """   stringLine      :param string_line:   :return:   """ result = "" not_skip = True for i in list(string_line): if not_skip: if i == "<": not_skip = False else: result += i else: if i == ">": not_skip = True return result 

Ändern Sie den Parameter _get_weather in die gewünschte Stadt. Später kann diese Methode mit der Stadt aufgerufen werden. Standardmäßig ist dies Ihr angegebener Wert.

Mit diesen Methoden können wir Zeit und Wetter ermitteln. Diese Methoden stammen aus meinem Haupt-Bot-Projekt. Sie sollten sie mithilfe der Vererbung in separaten Paketen und Klassen organisieren. Aber um ein Beispiel für die Arbeit zu geben, habe ich beschlossen, all dies in eine Bot-Klasse einzuteilen, was sicherlich schlecht ist.

Wir erstellen die Hauptmethode new_message, die die Nachricht des Benutzers verarbeitet und eine Antwort zurückgibt:

 def new_message(self, message): #  if message.upper() == self._COMMANDS[0]: return f"-, {self._USERNAME}!" #  elif message.upper() == self._COMMANDS[1]: return self._get_weather() #  elif message.upper() == self._COMMANDS[2]: return self._get_time() #  elif message.upper() == self._COMMANDS[3]: return f"-, {self._USERNAME}!" else: return "    ..." 

Nun zurück zur ausführbaren Datei:

Importieren Sie die Klasse unseres Bots:

 from vk_bot import VkBot 

Lassen Sie uns unsere Hauptschleife ändern:

 print("Server started") for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW: if event.to_me: print('New message:') print(f'For me by: {event.user_id}', end='') bot = VkBot(event.user_id) write_msg(event.user_id, bot.new_message(event.text)) print('Text: ', event.text) 

Das heißt, jetzt senden wir die empfangene Nachricht an das Bot-Objekt, das uns die gewünschte Antwort zurückgibt.

Diese Komplikation des Programms ist einfach notwendig, wenn Sie die Funktionalität des Bots weiter verbessern möchten:

Erstellen Sie separate Pakete und Klassen für jede _get_time- und _get_weather-Funktion. Organisieren Sie die Vererbung von der allgemeinen Klasse. Und definieren Sie jede neue Funktion in separaten Klassen. Am besten teilen Sie sie natürlich auch in Pakete auf.

Fügen Sie ein Wörterbuch mit einem Benutzer-ID-Schlüssel und einem Bot-Objektwert hinzu. Daher ist es nicht erforderlich, jedes Mal in einem Zyklus ein Bot-Objekt zu erstellen. Darüber hinaus wird dadurch sichergestellt, dass in komplexen Designs mehrere Benutzer gleichzeitig verwendet werden.

Wenn Sie also eine gute Codearchitektur auswählen, können Sie einen multifunktionalen Bot erstellen.

Zum Beispiel habe ich meinem Bot beigebracht, Musik auf einem Computer abzuspielen und Websites zu öffnen, während er am Telefon sitzt. Senden Sie Rezepte zum Frühstück, Mittag- und Abendessen.

Sie können den Bot selbst bearbeiten.

Bot aus dem Artikel

Hauptbot-Projekt (fortgeschritten) auf GH

Ich freue mich über Ihre Ideen. Bei Fragen schreiben Sie.

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


All Articles