Русский
Русский
English
Статистика
Реклама

Из песочницы Бот-викторина для ВКонтакта

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

Введение


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

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


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

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

Заключение


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



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

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

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

А ещё в нем есть несколько штучек, о которых я здесь не рассказал.
Источник: habr.com
К списку статей
Опубликовано: 20.08.2020 00:09:36
0

Сейчас читают

Комментариев (0)
Имя
Электронная почта

Python

Вконтакте api

Логические игры

Вконтакте

Вк

Вконтакте бот

Угадайка

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru