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.

Selecionamos o tipo de comunidade "Grupo de interesse".

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

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.

Vá para gerenciamento de grupo:

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

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

A chave de acesso resultante é o nosso token:

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.

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.