Бот-викторина для ВКонтакта

от автора

Администраторам сообществ по "Смешарикам"

Пожалуйста, не используйте этого бота в своих пабликах — пусть это будет нашей изюминкой.

Введение

Месяца три назад мы с друзьями по сети «ВКонтакте» в общем чате (беседе) играли в угадайку — игру по мультфильму «Смешарики», который мы все любим. Правила: ведущий пишет цитаты персонажей мультика, игроки угадывают из какой серии эта цитата. Я решил сделать игру более интересной, и назначить на роль ведущего бота.

Создание группы

Для того, чтобы создать группу или же сообщество для нашего бота, нужно зайти в раздел «Сообщества» в ВКонтакте и нажать на кнопку «Создать сообщество» в правом верхнем углу.

image

Выбираем тип сообщества «Группа по интересам».

image

Придумываем название, выбираем тематику, тип группы оставляем открытой.

image

Теперь нам потребуется узнать ID и создать токен группы.

Если же ID можно узнать в адресной строке после слова «club», то с токеном нужно будет немного запариться.

image

Заходим в управление группой:

image

Выбираем раздел «Работа с API» и включаем там «Long Poll API» для работы бота.

image

Далее переходим в «Ключи доступа», создаём ключ доступа с такими настройками:

image

Получившийся ключ доступа и есть наш токен:

image

Осталось разве что разрешить добавлять группу в беседы.

Заходим в раздел «Сообщения -> Настройки для бота», включаем «Возможности ботов» и жмем на «Разрешить добавлять сообщество в беседы». Сохраняем.

image

Установка модуля vk_api

Для того, чтобы установить модуль для работы с «Вконтакте API» нужно прописать в командную строку следующую команду:

pip3 install vk_api

Ещё нужно создать в директории бота файл «points.pickle».

Базовые функции

Переходим к программной части:
Подключаем нужные плагины: pickle, random, requests и библиотеку vk_api, благодаря которой можно работать с «ВКонтакте».

import random import pickle import requests from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType  #подключаемся к BotLongpoll - он нам нужен для работы именно с беседами. 

Создаем словарь с цитатами и словари для хранения информации:

series = {"серия":["цитата 1", "цитата 2"], "серия":["цитата 1", "цитата 2"]} series_in_chats = {}  quotes_in_chats = {} points = {} 

Сами цитаты заключены в списки в ключах словаря «series» для того, чтобы на одну серию приходилось много цитат.

Переменная «series_in_chats» нужна для хранения информации о серии в отдельной беседе, переменная «quotes_in_chats» аналогично, только для хранения информации о цитате.

Теперь подключаемся к группе:

vk_session = vk_api.VkApi(token="Ваш токен") #токен и ID группы longpoll = VkBotLongPoll(vk_session, "ID Вашей группы") #мы нашли ранее vk = vk_session.get_api()

Можно создать функцию для более удобной отправки сообщений:

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

Аргументы:

ch_id #определяет ID чата, в который нужно отправить сообщение msg #определяет само сообщение
vk.messages.send(chat_id, random_id, message)

Метод для отправки сообщений.

Обязательные параметры:

chat_id - ID чата, из которого прилетело сообщение, random_id - случайный идентификатор сообщения, если честно сам не очень понимаю что это, message - текст сообщения.

Подробнее о методе тут.

Обработка сообщений

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 - если вдруг случится какая-нибудь ошибка         #бот не сломается, а продолжит работу 

Теперь мы можем обрабатывать сообщения полученные группой, отправлять сообщения от имени группы и многое другое.

Внедряем очки

Этот код нужно вставить после проверки «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                         #мы его туда добавляем                         

Угадайка

Делаем проверку: если полученное в беседе сообщение будет равняться слову «угадайка», бот будет отвечать цитатой, которую нужно угадать (все это после проверки «if isinstance»):

 if text == "угадайка":     send(chat_id, "Отгадайте, из какой серии эта цитата: "+ quotes_in_chats.get(chat_id)) 

Осталось только сделать проверку на правильность серии — если в сообщении будет присутствовать название серии, бот ответит, что серия была угадана:

 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}) #обновляем словарь для хранения      

Заключение

По итогу, бот будет работать как-то так:

Разумеется, на этой основе можно создать практически любого бота — не только угадайку.

Созданный бот можно увидеть в сообществе ВКонтакте "Обитель Квестов | Смешарики".

Он, кстати, работает не только в чатах, но и в личных сообщениях.

А ещё в нем есть несколько штучек, о которых я здесь не рассказал.

ссылка на оригинал статьи https://habr.com/ru/post/515864/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *