Criando um bot de bate-papo simples no VK no Python 3

A criação da base do bot consistirá nas seguintes etapas:


  1. Criando um bot no VK
  2. Geração de chave da API
  3. Criando um programa de bot através do LongPoolVK

Para quem é este artigo?


O artigo foi desenvolvido para programadores iniciantes. O método de trabalho do programa é muito simples e qualquer pessoa que conheça a sintaxe Python e conheça um pouco de POO poderá implementá-lo de acordo com suas necessidades. Mas, em princípio, mesmo sem conhecer nenhum princípio de OOP, acho que você pode aprender como adicionar funções simples ou, pelo menos em casos extremos, usar fontes prontas do GitHub.

O que há neste artigo?


Criando a base do bot. Depois disso, pode ser programado como quiser. Automatize alguma rotina ou use como interlocutor.

Melhorado (versão ligeiramente complicada do bot). Decidi introduzir primeiro um código processual simples do bot e depois complicá-lo um pouco, adicionando funções que melhoram significativamente o bot.

Adicionando a função de transferência climática. Ensinaremos o bot a nos dizer o tempo.

Criando um bot no VK


Começaremos criando um bot, ou seja, um grupo no VK.

Para fazer isso, vá para "grupos" → "criar uma comunidade".

Selecione qualquer tipo de comunidade e insira um nome, tema de grupo.

Na página de configurações que é aberta, selecione "Trabalhar com API"

Em seguida, você precisa criar uma chave de API.

Em seguida, selecione os parâmetros necessários para acessar sua chave de API.

Provavelmente, você precisará confirmar a ação no VK usando seu telefone celular. Em seguida, copie a chave da API resultante em algum lugar do arquivo. Nós ainda precisamos disso.

Então você precisa permitir mensagens. Para fazer isso, vá para a "mensagem" e ative-os.

Vamos para a parte do programa do bot


Não o implementaremos através de solicitações ao VC ou, para ser mais preciso, apenas usamos a biblioteca VkLongPool, que fará isso por nós.

Isso requer a biblioteca vk_api. Instale-o via pip:

python -m pip instala vk_api

Mas, pessoalmente, trabalho com o ambiente virtual da Anaconda. Isso geralmente causa problemas durante o primeiro trabalho. Normalmente, o problema é que o sistema não reconhece o comando python. E esse problema é resolvido adicionando-o ao PATH.

Vamos ao código em si:

Importamos os módulos necessários:

import vk_api from vk_api.longpoll import VkLongPoll, VkEventType 

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

A função write_msg recebe o ID do usuário VK <ID do usuário>, para o qual enviará a mensagem e a própria mensagem.

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

Efetuando login como uma comunidade e configurando o longpool:

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

Nele, verificaremos ciclicamente os eventos. E podemos obter o tipo de evento com event.type.

Depois disso, após receber uma mensagem do usuário, poderemos enviar a ele uma carta correspondente usando a função já criada write_msg.

Então, criamos um bot muito simples no VK com a mesma implementação simples. E a lógica do bot pode ser programada como você desejar.

Listagem de códigos GH

Agora vamos começar com uma programação mais real.


Crie uma classe VkBot no arquivo 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 = ["", "", "", ""] 

E adicione um método lá com o qual você pode obter o nome de usuário via 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] 

Isso é feito usando beatifulsoup4.

Instale se não estiver:
python -m pip install bs4
Existem artigos suficientes que merecem ser estudados. Ao usá-lo, criaremos mais alguns métodos:

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

Altere o parâmetro _get_weather para a cidade desejada; posteriormente, esse método pode ser chamado com a cidade e, por padrão, será o valor especificado.

Usando esses métodos, podemos obter tempo e clima. Esses métodos são retirados do meu projeto principal de bot. Você deve organizá-los em pacotes e classes separados, usando herança. Mas, como exemplo de trabalho, decidi encaixar tudo isso em uma classe de bot, o que certamente é ruim.

Criamos o método principal new_message, que processará a mensagem do usuário e retornará uma resposta:

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

Agora, de volta ao arquivo executável:

Importe a classe do nosso bot:

 from vk_bot import VkBot 

Vamos mudar nosso loop 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) 

Ou seja, agora transmitiremos a mensagem recebida ao objeto bot, que retornará a resposta desejada para nós.

Esta complicação do programa é simplesmente necessária se você quiser melhorar ainda mais a funcionalidade do bot:

Crie pacotes e classes separados para cada função _get_time e _get_weather. Organize a herança da classe geral. E defina cada nova função em classes separadas, é melhor, é claro, também dividir em pacotes.

Adicione um dicionário com uma chave de ID do usuário e um valor de objeto bot. Portanto, não é necessário criar um objeto bot todas as vezes em um ciclo. Além disso, isso garantirá o uso de vários usuários ao mesmo tempo em projetos complexos.

Assim, escolhendo uma boa arquitetura de código, você pode criar um bot multifuncional.

Por exemplo, eu ensinei meu bot a tocar música em um computador, sites abertos enquanto estava sentado no telefone. Envie receitas para o café da manhã, almoço, jantar.

Você pode editar o bot por si mesmo.

Bot do artigo

Projeto principal de bot (avançado) no GH

Ficarei feliz com suas idéias. Para qualquer dúvida, escreva.

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


All Articles