Crear un bot de chat simple en VK en Python 3

Crear la base para el bot consistirá en los siguientes pasos:


  1. Crear un bot en VK
  2. Generación de clave API
  3. Crear un programa bot a través de LongPoolVK

¿Para quién es este artículo?


El artículo está diseñado para programadores principiantes. El método de trabajo del programa es muy simple y cualquiera que conozca la sintaxis de Python y conozca un poco de OOP podrá implementarlo según sus necesidades. Pero, en principio, incluso sin conocer los principios de OOP, creo que puede aprender cómo agregar funciones simples o, al menos en casos extremos, usar fuentes ya preparadas de GitHub.

¿Qué hay en este artículo?


Creando la base del bot. Después de eso, se puede programar a su gusto. Automatiza alguna rutina o úsala como interlocutor.

Mejorado (versión ligeramente complicada del bot). Decidí introducir primero un código de procedimiento simple del bot, y luego complicarlo un poco agregando funciones que mejoran significativamente el bot.

Agregando la función de transferencia del clima. Le enseñaremos al bot a decirnos el clima.

Crear un bot en VK


Comenzaremos creando un bot, es decir, un grupo en VK.

Para hacer esto, vaya a "grupos" → "crear una comunidad".

Seleccione cualquier tipo de comunidad e ingrese un nombre, tema de grupo.

En la página de configuración que se abre, seleccione "Trabajar con API"

A continuación, debe crear una clave API.

Luego seleccione los parámetros que necesita con acceso para su clave API.

Lo más probable es que tengas que confirmar la acción en VK usando tu teléfono móvil. Luego copie la clave API resultante en algún lugar a un archivo. Aún lo necesitamos.

Entonces necesitas permitir mensajes. Para hacer esto, vaya al "mensaje" y actívelos.

Pasemos a la parte del programa del bot


No lo implementaremos a través de solicitudes al VK, o para ser más precisos, solo usaremos la biblioteca VkLongPool, que lo hará por nosotros.

Esto requiere la biblioteca vk_api. Instalarlo a través de pip:

python -m pip install vk_api

Pero personalmente, trabajo con el entorno virtual de Anaconda. Esto a menudo causa problemas durante el primer trabajo. Por lo general, el problema es que el sistema no reconoce el comando python. Y este problema se resuelve agregándolo a PATH.

Vayamos al código mismo:

Importamos los módulos necesarios:

import vk_api from vk_api.longpoll import VkLongPoll, VkEventType 

Entonces el código:

 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, "   ...") 

La función write_msg recibe el ID de usuario VK <user_id>, al que enviará el mensaje y el mensaje mismo.

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

Iniciar sesión como comunidad y configurar Longpool:

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

En él, verificaremos cíclicamente los eventos. Y podemos obtener el tipo de evento con event.type.

Después de eso, después de haber recibido un mensaje del usuario, podremos enviarle una carta correspondiente utilizando la función ya creada write_msg.

Entonces, creamos un bot muy simple en VK con la misma implementación simple. Y la lógica del bot se puede programar como lo desee.

Listado de código GH

Ahora comencemos con una programación más real.


Cree una clase VkBot en el archivo vk_bot.py, que nos servirá como bot.

 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 = ["", "", "", ""] 

Y agregue un método allí con el que pueda obtener el nombre de usuario a través de vk id.

 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] 

Esto se hace usando beatifulsoup4.

Instalar si no es:
python -m pip install bs4
Hay suficientes artículos al respecto que vale la pena estudiar. Al usarlo, crearemos algunos métodos más:

 #  : 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 

Cambie el parámetro _get_weather a la ciudad deseada, luego se puede llamar a este método con la ciudad y, de forma predeterminada, será su valor especificado.

Usando estos métodos, podemos obtener el tiempo y el clima. Estos métodos están cortados de mi proyecto de bot principal. Debe organizarlos en paquetes y clases separados, utilizando la herencia. Pero en aras de un ejemplo de trabajo, decidí encajar todo esto en una clase de bot, lo que sin duda es malo.

Creamos el método principal new_message, que procesará el mensaje del usuario y devolverá una respuesta:

 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 "    ..." 

Ahora de vuelta al archivo ejecutable:

Importa la clase de nuestro bot:

 from vk_bot import VkBot 

Cambiemos nuestro bucle principal:

 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) 

Es decir, ahora transmitiremos el mensaje recibido al objeto bot, que nos devolverá la respuesta deseada.

Esta complicación del programa es simplemente necesaria si desea mejorar aún más la funcionalidad del bot:

Cree paquetes y clases separados para cada función _get_time y _get_weather. Organizar la herencia de la clase general. Y defina cada nueva función en clases separadas, es mejor, por supuesto, también dividir en paquetes.

Agregue un diccionario con una clave de ID de usuario y un valor de objeto bot. Por lo tanto, no es necesario crear un objeto bot cada vez en un ciclo. Además, esto garantizará el uso de varios usuarios a la vez en diseños complejos.

Por lo tanto, al elegir una buena arquitectura de código, puede crear un bot multifuncional.

Por ejemplo, le enseñé a mi bot a reproducir música en una computadora, abrir sitios mientras estaba sentado en el teléfono. Enviar recetas para el desayuno, almuerzo, cena.

Puedes editar el bot por ti mismo.

Bot del artículo

Proyecto bot principal (avanzado) sobre GH

Estaré encantado de tus ideas. Para cualquier consulta, escribe.

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


All Articles