Как написать бота для вк на питоне

С Создание основы для работы бота будет состоять из следующих этапов:

  1. Создание бота в ВК
  2. Генерирование API- ключа
  3. Создание программы бота через LongPoolVK

Д Для кого эта статья?

Статья рассчитана для начинающих программистов. Метод работы программы очень прост и любой, кто умеет разбираться в синтаксисе Питона и немного знающий ООП сможет его реализовать для своих нужд. Но в принципе даже не зная никаких принципов ООП, думаю можно научиться добавлять простые функции или хотя бы в крайнем случае использовать готовые исходники из GitHub.

Ч Что есть в этой статье?

Создание основы бота. После этого его можно будет запрограммировать как-угодно. Автоматизировать какую-то рутину или использовать как собеседник.

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

Добавление функции передачи погоды. Научим бота говорить нам погоду.

С Создание бота в ВК

Начнем мы с создания бота, а именно группу в ВК.

Для это нужно зайти в «группы» → «создать сообщество».

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

На открывшейся странице настроек, выберите «Работа с API»

Далее, необходимо создать API-ключ:

Затем выберите нужные вам параметры с доступом для вашего API-ключа:

Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится. Выглядит он так:

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

П Приступим к программной части бота

Мы не будем реализовывать его через запросы к ВК, а если быть точнее, просто используем библиотеку VkLongPool, которая сделает это за нас.

Для этого необходима библиотека vk_api. Установим его через pip:

Но лично я работаю с виртуальным окружением Anaconda. С этим зачастую возникают проблемы при первой работе. Обычно проблема в том, что система не распознают команду «python». А решается эта проблема путем добавления его в PATH.

Приступим к самому коду:

Импортируем нужные модули:

Затем пропишем легкий и понятный код:

Функция write_msg получает id пользователя ВК , которому оно отправит сообщение и собственно само сообщение .

Авторизовавшись как сообщество и настроив longpool:

Войдем в основной цикл:

В нем мы циклически будем проверять на наличие event-ов. А получить тип event-а сможем с помощью event.type.

После этого получив сообщение от пользователя сможем отправить ему соответствующее письмо с помощью уже созданной функции write_msg.

Итак, мы создали очень простого бота в ВК с такой же простой реализацией. А логику бота можно программировать как душе угодно.

Т Теперь приступим к более реальному программированию

Создадим класс VkBot в файле vk_bot.py , который будет служить нам ботом.

И добавим туда метод с помощью которого можно получить имя пользователя через vk id.

Это делается с помощью beatifulsoup4.

Устанавливаем если его нет:

На него есть достаточное количество статей, которые стоит изучить. С помощью него же создадим еще несколько методов:

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

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

Читайте также:  Как настроить группировку в excel

Создадим основной метод new_message, который будет обрабатывать сообщение пользователя и возвращать ответ:

Теперь вернемся к запускаемому файлу:

Импортируем класс нашего бота:

Изменим основной наш цикл:

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

Это усложнение программы просто необходимо, если вы хотите дальше улучшить функционал бота:

Создайте отдельные пакеты и классы для каждой функции _get_time и _get_weather. Организуйте наследование с общего класса. И каждую новую функцию определяйте в отдельных классах, лучше всего, конечно, еще и разделить на пакеты.

Добавьте словарь с ключом идентификатора пользователя и значением объекта бота. Таким образом, не придется каждый раз в цикле создавать объект бота. К тому же, это обеспечит пользование несколькими пользователями сразу в сложных конструкциях.

Таким образом, выбрав хорошую архитектуру кода, вы сможете создать многофункционального бота.

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

Вы же можете редактировать бота под себя.

Основной проект бота (улучшенный) на GH:

Также, может быть, если надо сделаю статьи на тему «Управлением через ВК компьютером», «Архитектуру бота», «Хостинг сервера с телефона». Все эти упомянутые функции есть в основном проекте. Если есть вопросы можете писать, отвечу по мере желания. О желаемых статьях также пишите в личку.

vk = vk_api.VkApi(token=api_token)
long_poll = VkBotLongPoll(vk, group_id)
vk_api = vk.get_api()

# api_token — API токен, который мы ранее создали
# group_id — id сообщества-бота

смотрим, что получилось

for event in self.long_poll.listen():
print(event)

Советую делать на callback. В настройках группы указываешь, что можно добавлять бота в беседы. Версию бота ставь 5.80+. В беседе дай боту администратора. Теперь тебе на сервер будет прилетать примерно такой json

from_id — id человека
peer_id — id беседы
обработал сообщение, и отправил его в peer_id. Как-то так

Но для callback нужно иметь сервер или хостинг, да и питон на нем трудно запустить, поэтому советую присмотреться к этой библиотеке на php. И вот кстати в этой статье можешь посмотреть как настраивается callback

Чат-боты стали уже очень распространенным явлением, и появляются во всех мессенджерах ежедневно.

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

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

Для создания бота я использовал Python 3.5 (вероятно, подойдут и другие версии 3-го питона) и дополнительные библиотеки Flask и VK. Их надо будет установить. По установке Flask есть много статей на русском. Если у вас стоит Pycharm, то он, скорее всего, установился вместе с ним.

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

В разделе управление сообществомработа с API необходимо создать ключ с доступом к сообщениям сообщества.

Для работы с Callback нужно иметь веб-сервер, который будет принимать запросы о каких-либо событиях от API, обрабатывать их и посылать ответные запросы. То есть мы напишем «сайт», который будет только отвечать на посылаемые ему запросы и посылать свои.

Поскольку пишем на питоне, самое простое, что можно использовать, — это хостинг для питона. Я пользовался бесплатным хостингом для Python. Там нужно зарегистрироваться, а затем создать приложение для питона 3.5 на Flask (создать можно в разделе Web). Будет создан начальный файл:

Единственная функция, которая сейчас есть в файле, отвечает за наполнение страницы по адресу, выданному при регистрации. Если перейти в браузере по адресу username.pythonanywhere.com (со своим ником), то можно увидеть только текст «Hello from Flask!».

Читайте также:  Как на андроиде открыть документ word

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

Итак, БЛОК 1.
Для обработки запросов, посылаемых сайту, добавим в конце документа следующий код:

Где вместо иксов подставляем «строку, которую должен вернуть сервер». Она указана в управлении группой в разделе Callback API.

Эта функция позволит нам подключить наш сайт для уведомлений к группе.

Теперь можем проверить работу. Только необходимо перезагрузить приложение. На хостинге после того, как файлы были изменены и сохранены, чтобы сайт стал работать с новыми данными, нужно его перезагрузить во вкладке Web. После добавления этого кода можем ввести соответствующий адрес username.pythonanywhere.com в строку адреса сервера в группе ВКонтакте и нажать «Подтвердить».

Должно появиться зеленое уведомление о том, что адрес сервера успешно подключен.

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

БЛОК 2
Можем переходить к следующему шагу. Добавим возможность писать сообщения от имени сообщества. Пришло время установить на хостинге библиотеку VK. В разделе Consoles запускаем bash-консоль и исполняем команду (или соответствующую для выбранной версии питона):

Как устанавливать модули описано здесь.

Изменим код нашей функции по обработке входящих запросов:

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

Структура входящего запроса, оповещающего о новом сообщении, такова:

Вконтакте передает нашему сайту три объекта: «type», «object», «group_id», а внутри «object» хранится информация о самом сообщении.

Все запросы можно посмотреть в документации ВКонтакте.

Также добавляем новые «import» в начало файла:

Мы создали новый файл в этой же папке settings.py, в котором сохранены необходимые данные для входа:

Их надо заменить на ваши токены. Первый мы создали в начале статьи, второй – код подтверждения, чтобы соединить группу с сервером.

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

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

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

БЛОК 3
Если все прошло хорошо, и бот с вами поздоровался в ответ на ваше сообщение, переходим к следующему шагу. Вынесем все взаимодействие с библиотекой vk в другой файл, я назвал его vkapi:

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

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

Осталось подключить наши новые файлы к основному. Изменяем функцию обработки запросов в главном файле:

И добавляем соответствующий импорт в начало файла:

Можем проверить, что у нас получилось, перезагрузив приложение.

БЛОК 4
Приступим к созданию команд. Создадим класс команд.

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

Читайте также:  Как проверить сеть через командную строку

Поле description будем использовать для выдачи информации по командам бота. Функция process будет исполняться для формирования ответного сообщения.

Есть общий список, в который сохраняются все команды при их инициализации. Он находится снаружи класса. Этот список будем использовать для поиска команды, которую запросил пользователь своим сообщением.

Теперь создадим несколько команд для нашего бота. Для удобства загрузки будем помещать файлы, в которых инициализируем команды, в папку «commands».

Я создам несколько файлов, но можно и разместить команды и в одном файле

Для команды, отправляющей котика, нам понадобится новый токен и новая функция и в файле «vkapi», которая возвращает случайную картинку со стены группы или пользователя. В данном случае будем получать случайную фотографию со стены паблика с котами.

Начнем с получения токена. Нам нужен сервисный ключ доступа. Для этого надо создать новое Standalone-приложение. Его можно создать по ссылке. Далее когда приложение будет создано, нужно перейти в его настройки и скопировать то, что находится в поле «Сервисный ключ доступа».
Это нужно внести в наш файл с токенами.
«settings.py»

Теперь перейдем к созданию нового метода vkapi. Здесь немного расширяем спектр используемых методов API.

Этот метод выглядит так:

Дописываем его в файл «vkapi». Также в начало файла «vkapi» надо добавить необходимый импорт:

И последняя команда

Окончательная иерархия файлов:


botFlask — главный файл, который принимает входящие запросы.

Теперь, когда мы описали команды, нужно позаботиться о том, чтобы наш лист команд был наполнен, и мы могли понять, к какой из команд обращался пользователь, так как список “command_list” заполняется только в момент запуска файлов с конкретными командами.

Мы будем автоматически запускать на исполнение все файлы из папки «commands» при запуске нашего бота.

Для этого в файле «messageHandler.py» дописываем функцию:

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

Вызов этой функции добавляем в «create_answer». Теперь изменим функцию «get_answer» так, чтобы она вызывала соответствующий ответ.

Итоговый вид файла:

Все, наш бот готов! Теперь вы знаете, как создать основу для бота и добавить для него новые команды.

БЛОК 5
Дальнейшая часть статьи будет про одно улучшение, которое я считаю необходимым. Однако бот будет работать и без этого.

Приблизительное распознавание команд

Если пользователь допустил ошибку в одном символе, скорее всего, он имел в виду максимально похожую команду. Поэтому было бы хорошо, если бы наш бот все равно давал ответ, а не говорил «не понимаю тебя».

Для приблизительного распознавания будем использовать расстояние Дамерау-Левенштейна. Оно показывает, за сколько операций удаления, вставки, замены и перемещения символов можно перейти от одной строки к другой.

Алгоритм нахождения этого расстояния изложен, например, в Википедии.

Добавляем в файл “messageHandler.py” функцию:

Она реализует алгоритм нахождения этого расстояния, при желании вы можете его изменить или улучшить.

По данным строкам она будет выдавать количество операций для преобразования одной в другую. Теперь изменим метод «get_answer»:

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

На этом все, рабочий (на момент написания статьи) код выложен на гитхабе.

Надеюсь, эта статья немного облегчит вам жизнь, если вы решили создать своего бота для VK.

Adblock
detector