Bot de questionário para VKontakte

Administradores da comunidade para "Smeshariki"
, — .



Introdução



Cerca de três meses atrás, meus amigos da rede VKontakte em um chat geral (conversa) jogaram um jogo de adivinhação - um jogo baseado no desenho animado "Smeshariki", que todos nós amamos. Regras: o anfitrião escreve citações de personagens de desenhos animados, os jogadores adivinham de qual série essa citação pertence. Decidi tornar o jogo mais interessante e atribuí-lo ao papel de bot líder.



Criação de grupo



Para criar um grupo ou comunidade para o nosso bot, você precisa ir até a seção "Comunidades" no VKontakte e clicar no botão "Criar uma comunidade" no canto superior direito.



imagem



Selecionamos o tipo de comunidade "Grupo de interesse".



imagem



Chegar a um nome, escolher um tema, deixar o tipo de grupo em aberto.



imagem



Agora precisamos descobrir o ID e criar um token de grupo.



Se o ID puder ser encontrado na barra de endereço após a palavra "clube", você precisará se preocupar um pouco com o token.



imagem



Vá para gerenciamento de grupo:



imagem



Selecione a seção "Trabalhando com API" e habilite "Long Poll API" para que o bot funcione.



imagem



Em seguida, vá para "Chaves de acesso", crie uma chave de acesso com as seguintes configurações:



imagem



A chave de acesso resultante é o nosso token:



imagem



A única coisa que resta é permitir que o grupo seja adicionado às conversas.



Vá para a seção "Mensagens -> Configurações para o bot", ative as "Capacidades de bots" e clique em "Permitir adicionar comunidade às conversas". Nós salvamos.



imagem



Instalando o módulo vk_api



Para instalar o módulo para trabalhar com a API Vkontakte, você precisa escrever o seguinte comando na linha de comando:



pip3 install vk_api


Você também precisa criar um arquivo "points.pickle" no diretório do bot.



Funções básicas



Seguindo para a parte do software:

Conectamos os plugins necessários: pickle, random, requests e a biblioteca vk_api, graças à qual você pode trabalhar com VKontakte.



import random
import pickle
import requests
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType 
#  BotLongpoll -        .


Criamos um dicionário com citações e dicionários para armazenar informações:



series = {"":[" 1", " 2"], "":[" 1", " 2"]}
series_in_chats = {} 
quotes_in_chats = {}
points = {}


As próprias citações são colocadas em listas nas chaves do dicionário "série", de modo que há muitas citações por série.



A variável "series_in_chats" é necessária para armazenar informações sobre a série em uma conversa separada, a variável "quotes_in_chats" é semelhante, apenas para armazenar informações sobre a citação.



Agora nos conectamos ao grupo:



vk_session = vk_api.VkApi(token=" ") #  ID 
longpoll = VkBotLongPoll(vk_session, "ID  ") #  
vk = vk_session.get_api()


Você pode criar uma função para enviar mensagens de forma mais conveniente:



def send(ch_id, msg):
    vk.messages.send(chat_id=ch_id, random_id=random.randint(1, 9999999), message=msg)


Argumentos:
ch_id # ID ,     
msg #  




vk.messages.send(chat_id, random_id, message)


Método de envio de mensagens.



Parâmetros exigidos:



chat_id - ID ,    ,
random_id -   ,        ,
message -  .


Leia mais sobre o método aqui.



Processando mensagens



while True: # 
    try: 
        for event in longpoll.listen():
	    if event.type == VkBotEventType.MESSAGE_NEW and event.from_chat:
		chat_id = int(event.chat_id) #ID ,    
                text = event.object.text.lower() # 
                man = event.obj.from_id #ID   ,  
                if chat_id not in series_in_chats:
                    episode = random.choice(series.keys()) #   
                    #  
                    quote = random.choice(series.get(episode)) #    
                    # 
                    series_in_chats.update({chat_id:episode}) #   
                    quotes_in_chats.update({chat_id:quote}) #   
                    #     ,      
                    #      .
    except:
        continue
        # try except -    - 
        #  ,   


Agora podemos processar mensagens recebidas pelo grupo, enviar mensagens em nome do grupo e muito mais.



Nós apresentamos óculos



Este código precisa ser inserido após verificar "if chat_id not in series_in_chats":




                if points == {}:
                    with open('points.pickle', 'wb') as f:
                        pickle.dump(points, f)
                    with open('points.pickle', 'rb') as f:
                        
                        points = pickle.load(f) 
                if isinstance(points.get(man), int) == False:
                    points.update({man:0})
                    with open('data.pickle', 'wb') as f:
                        pickle.dump(points, f)
                        #     points
                        #   
                       


Adivinhação



Fazemos uma verificação: se a mensagem recebida na conversa for igual à palavra "adivinhar", o bot responderá com uma citação que precisa ser adivinhada (tudo isso após verificar "if isinstance"):




if text == "":
    send(chat_id, ",     : "+ quotes_in_chats.get(chat_id))


Resta apenas verificar a exatidão da série - se a mensagem contiver o nome da série, o bot responderá que a série foi adivinhada:




if series_in_chats.get(chat_id) in text:
    
    send(chat_id, "  !")
    points.update({man:points.get(man)+1}) # 1 
    
    with open('points.pickle', 'wb') as f:
        pickle.dump(points, f) #     
    send(chat_id, "  !\n   : "+str(points.get(man)))
    #   :
    episode = random.choice(series.keys()) #   
    #  
    quote = random.choice(series.get(episode)) #    
    # 
    series_in_chats.update({chat_id:episode}) #   
    quotes_in_chats.update({chat_id:quote}) #   
    


Conclusão



Como resultado, o bot funcionará mais ou menos assim:







Claro, com base nisso, você pode criar quase qualquer bot - não apenas um palpite.



O bot criado pode ser visto na comunidade VKontakte " Abode of Quests | Smeshariki ".



Aliás, ele trabalha não só em chats, mas também em mensagens privadas.



Ele também tem algumas coisas que não abordei aqui.



All Articles