Как сделать вк бота на python
Перейти к содержимому

Как сделать вк бота на python

  • автор:

Делаем многоуровневого бота для ВК с Long Poll VK API, Python, MySQL и решаем вопрос многопоточности c помощью threading

Создание ботов — довольно заезжанная тема, но все уроки, статьи и различного рода документация дают информацию только о том, как построить бота в один уровень без возможности создания древа из различных всплывающих меню (клавиатур).
А это нужно для создания:

Сложных ботов с несколькими уровнями «глубины» (различные меню/клавиатуры)

Ботов, созданных одновременно для групповых чатов и для лички сообщества

Ботов, с повторяющимися ключевыми командами в различных меню, которые необходимо разделять

Можно сделать многоуровневого бота на Python сразу (без, например, библиотеки threading и без базы данных), но он будет адекватно работать только для одного пользователя в текущий момент времени, потому что одна клавиатура и текущее положение пользователя будет сохраняться в MainThread (основном треде) для всех.

Предварительная подготовка

Устанавливаем MySQL на необходимую машину:

Или через терминал (для Linux):

Если у Вас не установлены необходимые библиотеки — то устанавливаем их через терминал:

В базе данных нам предварительно нужно создать базу данных в MySQL с названием vktest с таблицей user и полями — iduser и position. Я создаю БД с кодировкой utf8mb4:

Базовый алгоритм

Основная идея алгоритма в том, что основной тред будет занят слушанием longpoll, который при появлении нового сообщения будет создавать новый тред. В этот новый тред, как аргументы, будут отсылаться айди пользователя и текст сообщения и далее обрабатываться.

В новосозданном треде бот сразу берет текущее положение пользователя в БД, в зависимости от этого положения происходит обработка сообщения и после обновляется положение пользователя в БД на новое и выполняются нужные инструкции.

Для начала представим этот алгоритм для основной функции, которая и будет создавать эти треды (код составлен для сообщений в личку сообщества):

Весь код в основной функции завернут в while True из-за того, что раньше каждую ночь (возможно также и сейчас) примерно в 4:30 по МСК переставал отвечать VK на запросы и бот падал (видимо перезагружали серверы).

Основная идея тренировочного бота — это сделать три меню, где Основное меню 1 будет иметь возможность попасть в Меню 2 и в Меню 3, а они, в свою очередь, могли вернуться обратно в Основное меню 1:

В формате меню в самом ВКонтакте хочется представить это так:

У нас 3 клавиатуры, которые нужно создать в виде файлов с расширением .json в папке с main.py. Первый файл keyboard_main.json будет с кодом:

Второй файл keyboard_durov.json с кодом:

Третий, практически идентичный — keyboard_zuckerberg.json:

Значение target у нас processing_message, поэтому создаём функцию в main.py с именем processing_message и c аргументами в виде id юзера и его сообщения:

Весь алгоритм этой функции построен на том, что мы сразу берем текущую позицию пользователя и в зависимости от неё обрабатываем сообщение пользователя. Если number_position — это 0 (функция take_position(id_user) вернула 0, то есть в базе данных она не нашла пользователя), то она сразу добавляет его в БД с позицией 1 через функцию add_new_line(id_user), перемещая таким образом его в главное меню и открывая ему клавиатуру keyboard_main.json.

Если number_position от 1 до 3 — то бот выполняет код в соответствующем для него ветвлении if-elif-else.

Функция take_position(id_user) выглядит таким образом:

В свою очередь add_new_line(id_user) выглядит так:

Когда пользователь имеет свою строку в БД — он уже может приступать к взаимодействию с ботом. И обновление его положения — это функция update_position(id_user, new_position), которая выглядит таким образом:

Эти три функции не будут работать без основной функции для БД (которую необходимо добавить практически в самое начало, сразу после импорта библиотек) и вписать ваши данные от БД. Я изменяю только название БД и кодировку на те, которые мы создали в самом начале:

И одна из самых важных функций — отправка сообщения пользователю. Я вывел её в отдельную функцию send_message, так как это нерационально возить такую махину постоянно по всему коду:

Ничего не забыли? Ах да, нам же нужны крутые цитаты Дурова и Цукерберга:

durov_quote() и zuckerberg_quote()

Для них мы использовали встроенные списки Python и подключили библиотеку random.

И весь код main.py (целиком) под спойлером для удобства:

Заключение

Этой статьей я поделился с массами адекватным, как мне кажется, решением для создания многоуровневого бота. Надеюсь, это защитит многих на старте от решений в виде цикла longpoll в цикле longpoll и в ещё одном longpoll, из которых довольно трудно выйти. Всем удачи.

Немного о написании бота VK и не только (взгляд новичка)

Немного о написании бота VK и не только (взгляд новичка) главное изображение

Всем привет! Моя первая попытка написать статью на Хекслете обернулась успехом, она уже набрала 8 лайков. Этот факт замотивировал написать еще одну на какую-нибудь интересную тему.

Снова предыстория

Когда я только начал знакомство с Python, я хотел написать что-нибудь, чем можно пользоваться. Эти амбиции были оправданы тем, что с кодом я знаком еще с

11 лет, тогда я писал ботов для IRC (об этом я также планирую написать статейку). Первой мыслью было написать простого бота для VK, который будет реагировать на текст. По гайдам я смог слепить такого бота, но в итоге своей работы я видел некоторое количество магии: я не до конца понимал как работает Long Poll и библиотека Requests.

Хочу сразу обратить внимание на заголовок, тут будет описываться взгляд новичка. Это значит, что все описанное ниже лишь мое понимание темы и мой опыт. Ни в коем случае не претендую на какую-то истинность и научность 🙂

Также хочу сразу предупредить, тут не будет кода, который относится к написанию бота. Самое идеальное применение этой статье — создать машину времени, вернуться на 4 месяца назад и показать её самому себе. Примеры кода вы легко сможете найти в гугле, я сам по ним писал бота и не понимал что происходит.

Как нам получить данные из VK

Для себя я сделал вывод, что работа программиста — это работа с данными. Мы хотим использовать магию и получать данные из VK, после чего обрабатывать их в своем Python терминале. Не буду теоретизировать о различных вариантах реализации, скажу сразу, для этого нам нужно API.

Чтобы понять что такое API, нужно четко понимать что такое интерфейс и абстракции в контексте программирования. Понимать что такое абстракции очень важно, они везде. Изучить и даже создать их вы успеете при прохождении курсов, по крайней мере в курсе Python-программиста они есть. После изучения этих тем расшифровка аббревиатуры "Application Programming Interface" даст исчерпывающее объяснение что такое API.

Как работает магия

Если у меня получится в кротчайшие сроки собрать машину времени и показать эту статью самому себе 4 месяца назад, я не хочу, чтобы у молодого меня заболела голова от большого количества новой информации, поэтому объяснение работы протокола HTTP оставим профессионалам из Hexlet. Сейчас мы запустим на абстрактном сервере не менее абстрактную программу на Python, вот её код:

Теперь можно потыкать нашу абстрактную программу, которую мы (гипотетически) разместили по адресу http://myserver.home/

Все запросы выполняем в строке браузера, хотя это не обязательно, но об этом далее.

В коде нашей программы можно указать сколько угодно функций, обращаться к ним нужно будет также из адресной строки: enter image description hereКак видно из картинки, в функцию можно передать сколько угодно переменных через амперсанд, но не забывайте, что если в функцию передать больше аргументов, чем она сможет обработать, функция вернет ошибку.

Работа с API VK

Теперь вернемся из абстрактного мира в реальный. В официальном гайде разработчики VK приводят такой пример взаимодействия с API: enter image description hereТеперь мы понимаем, что программа, отдающая нам данные, находится по адресу https://api.vk.com/method/ В качестве примера разработчики предлагают нам использовать их функцию users.get, куда мы передадим переменную user_id равную 210700286 и v=5.52.

Вы без проблем можете ввести этот адрес в браузер и отправить самый настоящий запрос к API VK и получить самые настоящие данные вида JSON, где вам вежливо откажут в выполнении этого метода. Откажут потому, что API VK не позволяет пользоваться своими методами неавторизованным пользователям. Чтобы получить доступ к методам, вы должны получить токен, как его получить также без проблем подскажет гугл, либо сам VK. Этот токен вы передаете в запрос как обычную переменную через амперсанд.

Отправляем запросы из Python

Для представления мне все таки придется совсем чуть-чуть тронуть тему HTTP. Когда мы жмем Enter после ввода адреса в строку, браузер посылает запрос по этому адресу. Обычно сервера отвечают нам HTML документами и некоторыми другими статическими файлами, которые наш браузер умеет исполнять и отображать в привычном для нас виде. Те же самые запросы мы можем посылать через Python с помощью библиотеки requests. Чтобы понять как это работает, вам предстоит пройти курсы «Введение в веб-разработку» и Протокол HTTP

Итак, импортируем requests, для теста отправляем get запрос по адресу google.com, выглядеть это будет примерно так: enter image description here

На взгляд новичка мы получили объект, поняли мы это потому что строка обрамлена в угловые скобки. Попробуем вызвать метод text, получим много строк HTML кода. По сути мы сделали абсолютно то же, что и делает браузер, только браузер умеет работать с HTML, а наш терминал просто отображает данные как есть.

Адрес, на который мы отправили запрос, подразумевает, что им будут пользоваться браузеры, поэтому нам работать с этими данными не удобно. Что касается API, тут все наоборот. В браузере нам непривычно видеть обычный голый текст, уж тем более в JSON формате, но от Python мы хотим именно этого. Нам просто нужны данные, которые мы потом обработаем и используем в своих целях.

Я надеюсь, что на момент прочтения этого абзаца вы уже получили API токен и успели поиграться с методами в строке браузера. Ничего особо нового я тут не открою, вам всего лишь нужно отправить запрос с помощью библиотеки requests и получить те же самые данные, которые вы видели в браузере. Далее эти данные необходимо распарсить, в этом вам поможет встроенная библиотека json.

Как получать уведомления о новых событиях

Для этого используется Long Polling. Это точно такой же запрос, только ответ мы получаем не сразу, а после того, как на сервере произойдет событие. Чтобы получать события постоянно, Long Poll запросы нужно посылать постоянно, например в бесконечном цикле.

Завершение

Я не стал в очередной раз описывать работу библиотек requests, json. Каждая из них требует отдельного внимания, а requests — знания протокола HTTP. Примеры кода для создания бота также можно найти на просторах интернета, я постарался описать свое видение этой темы, объяснить как этот код работает.

shablbot 2.0.4

�� Бот написанный на Python для социальной сети Вконтакте, работающий через VkBotLongPull.

�� О проекте

Данный проект разрабатывался с целью облегчить создание ботов для людей, которые мало/плохо знакомы с программированием. Бот устроен таким образом, что Вам нужно написать минимальное количество кода, чтобы добавить новый функционал. В последствии бот будет дорабатываться и развиваться.

�� Установка

Можете воспользоваться командой pip:

Или же использовать poetry:

:dizzy: Инициализация

Чтобы начать работу с ботом необходимо выполнить инициализацию компонентов бота:

Для этого нужно выполнить команду:

После чего будет в папке, откуда был вызван скрипт будет созданы каталоги с следующей структурой:

После этого можно перейти к настройке бота.

⏳ Стартовая настройка

Настройка бота производится с помощью редактирования файла settings.py, находящегося в папке settings, созданной на шаге выше.

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

  1. TOKEN — ключ доступа к сообществу вконтакте, ключ должен быть с правами к сообщениям сообщества. Как получить токен для бота?
  1. BOT_CHAT_ID — id страницы вконтакте сообщества, от лица которого будет работать бот.
  1. DEFAULT_REACTION_TEMPLATES — слова на которые бот будет всегда как-либо реагировать.
  1. ADMIN_ID — id страницы вконтакте человека, от лица которого будет происходить администрирование бота.

Остальные параметры для начального запуска бота менять не нужно.

�� Советую для хранения токена и id-ов использовать .env файл. К примеру используйте python-dotenv.

�� Запуск бота

Для запуска бота мы используем файл manager.py, созданный на первом шаге.

Если вы все правильно сделали, то в консоли увидите следующее сообщение:

:card_file_box: Модульность бота

То, как бот обрабатывает команды и сообщения от Вас спрятано. По этому Вам доступны 5 типов модулей, для расширения и настройки бота:

commands

Модуль отвечающий за команды управления ботом. Нужен для администрирования. Делятся на два типа:

  1. private — доступные только администратору бота
  2. public — доступные всем пользователям

:bell: Команды нужно подключать в настройках бота. Переменная ACTIVE_COMMANDS.

Для добавления новой команды вам нужно создай файл в папке private/public с *название_команды*.py.

В созданном файле нужно создать переменную command_settings с следующей структурой:

Функция выключения бота в чате:

keyboards

Модуль отвечающий за варианты клавиатуры бота. Нужен для настройки сообщений, если вы хотите использовать клавиатуру в сообщениях бота.

:bell: Клавиатуры нужно подключать в настройках бота. Переменная KEYBOARDS.

:warning: Обязательно для работы бота нужны, «clear.json» и «default.json»

modules

Модуль отвечающий за пользовательские модули для бота. К таким модулям можно отнести:

  • Игры
  • Утилиты (Погода, время, конвертирование валюты)

:bell: Модули нужно подключать в настройках бота. Переменная ACTIVE_MODULES.

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

Для создания модуля Вам необходимо создать файл с названием модуля и добавить туда переменную settings с следующей структурой:

Входная точка модуля должна иметь такую структуру, но не ограничена этим:

phrases

Модуль отвечающий за фразы, на которые бот реагирует. Содержит в себе файлы .json формата.

:bell: Все фразы из папки подгружаются автоматически. Вы можете исключить ненужные фразы используя в настройках переменную EXCLUDED_PHRASES.

json файл должен содержать следующую структуру:

:warning: Значения с пометкой «_comment» в реальном файле не должны пристутствовать.

settings

Модуль отвечающий за настройки бота. Все настройки производятся в файле settings.py. В файле для каждой переменной имеются комментарии, поясняющие, что в них хранится.

�� Пример работы

�� CLI Shablbot

Для бота разработано CLI. Доступные методы:

Для старта работы с ботом вы можете воспользоваться методом «—init» таким образом:

❔ Как получить токен для работы бота?

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

Там вы заполняете всю необходимую вам информацию, со всем соглашаетесь и попадаете на страницу группы. Там нам нужно найти вкладку «Управление«. В меню справа найдите «Настройки«->»Работа с API«.

На той странице будет 3 вкладки. Из них нам нужны только 1 и 3:

  1. Нажимаем кнопку «Создать ключ«, выбираем все необходимые нам доступы (желательно все) и нажимаем «Создать«. Данный ключ нужен для переменной TOKEN в настройках бота.
  2. Не нужна, пропускаем ее.
  3. На данной вкладке вам нужно выбрать версию API, бот тестировался на самом последней версии в момент написания (5.131), советую выбирать самую свежую. Так же вам нужно установить «Long Poll API» в значение «Включено«. После этого переходим на вкладку «Тип событий» и выбираем нужные вам значения. Минимальные для работы бота:
    1. Входящее сообщение
    2. Исходящее сообщение

    После этого ваш бот готов к работе, можете начинать его тестировать, удачи!

    Гайд Бот для беседы Python за 10 Минут! 1 Часть

    Это моя первая статья (помидоры придержите) , по этому тут будет все кратко и понятно:yesmate:

    дальше заходишь в cmd и пишешь:

    Перейдем к главному!
    Бота мы будем писать с помощью longpoll, по этому трудностей не должно быть.
    Подробнее о longpoll можете прочитать тут.

    Для начала импортим либы

    Ну это так скажем, ключ авторизации твоей группы.

    Так как же его получить?

    Заходим в свою группу, нажимаем сюда:

    Дальше кликаем сюда:

    Дальше нажимаем на все галочки и "Cоздать"

    Теперь надо, чтобы бот брал random id и мог писать в беседу

    Пишем id группы

    Теперь сделаем главный фикс для будущих функций. ( json )

    А вот и самая интересная часть. Делаем vk.metod с ответами на твои сообщения

    Пример самого просто словаря:

    Молодец! За 10 минут ты научился писать бота, а теперь иди и делай 1000 триггеров на все слова!

    Надеюсь что было понятно. Если понравится первая часть, оставляйте реакцию и пишите аргументированную критику (Она помогает мне улучшать свой контент)!

    1. Писать первые функции.
    2. Пофиксим возможные баги.
    3. Научим бота отправлять сообщения в определенный срок.
    4. Сделаем парсер сайтов для бота.
    5. Использовать vk клавиатуру.
    • 220
    • 98

    Похожие темы

    • Статья
    • Статья
    • Закрыта
    • Статья
    • Статья

    На данном сайте используются файлы cookie, чтобы персонализировать контент и сохранить Ваш вход в систему, если Вы зарегистрируетесь.
    Продолжая использовать этот сайт, Вы соглашаетесь на использование наших файлов cookie.

    You may choose not to have a unique web analytics cookie identification number assigned to your computer to avoid the aggregation and analysis of data collected on this website.

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

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