Бот VK на Python 2020 года с ответами в беседу
Всем доброго времени суток!
Я очень долго прочесывал интернет в поисках рабочего варианта бота для ВК, разработанного на Python. Никак не мог найти ни одной нормальной, целой статьи — в одной устаревший метод, в другой непонятные ошибки и так далее…
Друзья, я решил поделиться с вами всеми теми знаниями которые приобрел и сейчас мы с вами шаг за шагом напишем хорошего рабочего бота ВК для текущего, 2020, года. Впрочем надеюсь статья не потеряет актуальности и позже.
С чего начать?
Начнем с установки необходимых библиотек. Естественно открываем cmd.exe ( в некоторых случаях может понадобиться запустить от имени администратора) и прописываем туда следующее:
pip install vk
pip install vk_api
Мы установили две библиотеки для работы нашего Python-а с сервисом VK.
Теперь запускаем IDLE и начинаем писать код.
Объясняю: импортируем установленные ранее библиотеки и модули для работы с ними.
Авторизация
Авторизовались как группа. Важно создать такой токен, который будет разрешать отправку, прием, обработку сообщений и, в принципе, все что нам захочется.
Импортируем модуль longpool для работы с чатами.
Нюансы
Дело в том, что в одной программе нельзя одновременно запустить бота для ответов на ЛС и для работы в беседе, поскольку для этого используются два разных модуля longpool и как только запускается прослушивание longpool-ом на канале «ЛС»(Личные Сообщения) прослушивание другого канала, т.е. чата недоступно, пока не завершится первый процесс прослушивания. Проще говоря задачи могут выполняться исключительно последовательно, а не параллельно. Поэтому в целом коде я деактивирую часть с ЛС, заключив ее в »’ кавычки.
Теперь импортируем то же самое, но для ЛС.
Кнопки
Теперь объявим пару функций для кнопок, которые наш бот в будущем будет выдавать по требованию. К ним мы обратимся вскоре ещё раз.
Прием-отправка сообщений из беседы
А теперь будем слушать longpool на предмет новых сообщений. event — переменная в которой будет храниться само сообщение и некоторые данные о нем.
Перевод того, что выше: Если слово «Привет» или «. » или «. » содержится в переменной event, тогда:
Проверяем куда направлен наш event. Если в чат тогда вызываем метод отправки сообщений «vk.messages.send».
Внимание
… переменные key, server и ts необходимо заполнить. Эти переменные нужны для установки связи с сервером VK. Чтобы узнать эти переменные, а они у всех свои, нужно авторизованным перейти на сайт VK разработчикам и во вкладке «Пример запроса» ввести ID своей группы.
random_id — это случайный id сообщения, который в новых версиях VK_API теперь обязателен.
chat_id — это идентификатор беседы, из которой пришел event или иначе говоря сообщение.
if ‘Клавиатура’ in str(event):
Теперь, если пользователь напишет «Клавиатура«, то наш бот щедро предоставит кнопки, о которых мы говорили ранее.
Часть с Личными Сообщениями
Теперь отпишем вторую часть для ЛС без особых подробностей.
Поздравляю! Мы с вами разобрали бота на Python 2020 года. А сейчас я приведу весь код целиком.
Создание и интегрирование бота VK в группу через VkBotLongPoll [Python]
В этой статье мы создадим бота и интегрируем его в группу VK на Python 3.x
Для кого эта статья?
Для тех, кто хочет написать простого бота для своего сообщества, умеющего определять команды и выводить соответствующий ответ
Основные стадии
Создание группы-бота
Начнем мы с создания бота, а именно группы в ВК.
Для это нужно зайти в «группы» → «создать сообщество».
Выберите любой тип сообщества и введите название, тематику группы.
На открывшейся странице настроек, выберите «Работа с API».
Далее, необходимо создать API-ключ.
Затем выберите нужные вам параметры с доступом для вашего API-ключа.
Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится.
Там же разрешим добавить сообщество в группы, если мы хотим чтобы бот мог получать сообщения из группы.
Настройка Long Poll
Для работы с Long Poll API используем библиотеку vk_api. Установить его можно через pip.
Перед работой сохраним наш API-токен в файл config.py оттуда мы будем загружать наш ключ.
Создадим наш первый скрипт. Назовем server.py, который будет основным скриптом сервера.
Импортируем нужные нам модули:
Теперь создадим файл server_manager.py, в котором будет управлять разными серверами. Пока для тестов пропишем лишь вызов класса Server:
Важно!
Бот может писать сообщения только тем пользователям, которые разрешили боту присылать сообщения. Сделать это можно на странице сообщества или же первым написать боту
Если все сделано правильно, то бот пришлет нам личное сообщение.
Теперь добавим бота в группу и научим его обрабатывать сообщения.
Для добавления бота в группу нужно нажать «Пригласить в беседу» в правом меню сообщества.
Запустим его через server_manager.py:
Теперь, если напишем сообщение в группу, то сможем увидеть объект event’a:
Из этих данных нам следует обратить внимание на type, object.from_id, object.id, object.peer_id, object.text. Данные полученные из сообщений и из группы ничем сильно не отличаются, кроме object.peer_id и object.id.
Если присмотреться, object.id у всех сообщений из группы равен 0, а сообщения из личных нет. Таким образом, можно разделить сообщения получаемые из группы и из личных.
Обработаем полученные данные внутри класса Server:
Напишем боту два сообщения: один из группы, один в личку. Тогда получим:
Username: Артур
From: Санкт-Петербург
Text: [club172998024|@club172998024] this is a message from group
Type: group message
—
Username: Артур
From: Санкт-Петербург
Text: this is a private message
Type: private message
—
Примечание
Как вы могли заметить перед сообщением в группе есть [club172998024|@club172998024], для правильной обработки команды следует избавиться от всего содержимого в квадратных скобках, либо разрешить боту доступ ко всей переписке
Как мы видим, vk_api позволяет нам легко использовать методы VK API. К примеру, сейчас мы использовали метод users.get
Список всех методов доступен по ссылке: vk.com/dev/methods
Советую изучить и поэкспериментировать с методами, которые вас заинтересуют. Благо VK предоставило нам очень хорошую документацию, еще и на русском языке.
Чтобы закрепить материал, давайте добавим функцию отправки сообщения через метод messages.send:
— идентификатор назначения. Чтобы ответить на чье-то сообщение, в качестве параметра peer_id укажем event.object.peer_id. То есть, пошлем сообщение туда, откуда пришел запрос.
Изменим метод start:
Теперь, если бот примет сообщение, то он нам ответит в таком стиле:
Артур, я получил ваше сообщение!
server.py
server_manager.py
Задачка для закрепления материала:
Создайте функцию, которая принимает параметр peer_id и посылает пользователю фотографию загруженную в сообщество. Полезный док: vk.com/dev/messages.send
Нас интересует лишь выделенная часть: photo-172998024_456239017. Передадим её в качестве аргумента метода messages.send:
Добавим его в метод start и получим:
Вот и все основы. Главное, научиться пользоваться vk_api, используя различные методы, весь их список: vk.com/dev/methods. Если вы научитесь работать с документацией VK API, то сможете создавать ботов различной сложности и назначений. Пример моего бота для учебной группы: github.com/AppLoidx/GroupAssistant/tree/master
Теперь приступим к созданию логики бота
Создадим commander.py, который будет принимать команды и возвращать ответ, передаваемый пользователю Vk:
Построим архитектуру нашей программы:
Чтобы определить режим и команду, создадим два файла command_enum.py и mode_enum.py. С помощью них мы будем определять режимы и команды через методы класса Enum:
command_enum.py:
mode_enum.py:
Для смены режимов используем [слэш(«/»)+ ], а все остальные команды примем как команды.
Пишем чат бота для ВКонтакте на python с помощью longpoll
Сейчас боты стали обыденностью и находятся на каждом шагу, но если тебе нужен свой бот в социальной сети вконтакте, то это легко реализовать.
Ну прям совсем для новичков
Как оно работает?
Long Polling — это технология, которая позволяет получать данные о новых событиях с помощью «длинных запросов». Сервер получает запрос, но отправляет ответ на него не сразу, а лишь тогда, когда произойдёт какое-либо событие (например, придёт новое сообщение), либо истечёт заданное время ожидания.
Говоря русским языком, мы отправляем на сервер запрос, а он в свою очередь тыкает вконтакте если там произойдёт что либо, например, нам придёт сообщение он бежит и говорит об этом нам. От этого и будем плясать.
Техническая реализация
Для начала нам нужно доказать вконтакту что мы — это мы, а не кто-либо ещё. Делается это очень просто.
Замечание, ребята из ВК рекомендуют использовать в качестве логина номер телефона т.к. иначе можно нарваться на проверку антиробот, ту самую где тебя просят ввести недостающие цифры из номера телефона.
Если бот будет сидеть в группе то авторизация выглядит по другому.
— Что такое токен?
— Такая штука из циферок и буковок которую нужно получить в настройках группы. Для этого достаточно открыть раздел «Управление сообществом» («Управление страницей», если у Вас публичная страница), выбрать вкладку «Работа с API» и нажать «Создать ключ доступа».
Теперь вызовем longpool.
В сообщениях может быть не только заданный вами текст. Например:
А ещё можно прикреплять картинки.
Можно придумать ещё много всего интересного, но тут подумайте сами, а я лишь скажу что: ссылки можно делить на части. Например:
и никто не запретил нам получать ответ от пользователя на примере Википедии:
Ссылки на примеры и документацию
На этом я с вами попрощаюсь. Хорошего кодинга.
Создание простого чат-бота в VK на Python 3
Создание основы для работы бота будет состоять из следующих этапов:
Для кого эта статья?
Статья рассчитана для начинающих программистов. Метод работы программы очень прост и любой, кто умеет разбираться в синтаксисе Питона и немного знающий ООП сможет его реализовать для своих нужд. Но в принципе даже не зная никаких принципов ООП, думаю можно научиться добавлять простые функции или хотя бы в крайнем случае использовать готовые исходники из GitHub.
Что есть в этой статье?
Создание основы бота. После этого его можно будет запрограммировать как-угодно. Автоматизировать какую-то рутину или использовать как собеседник.
Улучшенная (слегка усложненная версия бота). Я решил сначала представить простой процедурный код бота, а затем слегка усложнить его, добавив функции, значительно улучшающие работу бота.
Добавление функции передачи погоды. Научим бота говорить нам погоду.
Создание бота в ВК
Начнем мы с создания бота, а именно группу в ВК.
Для это нужно зайти в «группы» → «создать сообщество».
Выберите любой тип сообщества и введите название, тематику группы.
На открывшейся странице настроек, выберите «Работа с API»
Далее, необходимо создать API-ключ.
Затем выберите нужные вам параметры с доступом для вашего API-ключа.
Скорее всего, вам придётся подтверждать действие в ВК с помощью мобильного телефона. Затем скопируйте полученный API-ключ где-нибудь в файл. Он нам еще понадобится.
Затем нужно разрешить сообщения. Для этого переходим в «сообщения» и включаем их.
Приступим к программной части бота
Мы не будем реализовывать его через запросы к ВК, а если быть точнее, просто используем библиотеку VkLongPool, которая сделает это за нас.
Для этого необходима библиотека vk_api. Установим его через pip:
Но лично я работаю с виртуальным окружением Anaconda. С этим зачастую возникают проблемы при первой работе. Обычно проблема в том, что система не распознают команду «python». А решается эта проблема путем добавления его в PATH.
Приступим к самому коду:
Импортируем нужные модули:
Авторизовавшись как сообщество и настроив longpool:
В нем мы циклически будем проверять на наличие event-ов. А получить тип event-а сможем с помощью event.type.
После этого получив сообщение от пользователя сможем отправить ему соответствующее письмо с помощью уже созданной функции write_msg.
Итак, мы создали очень простого бота в ВК с такой же простой реализацией. А логику бота можно программировать как душе угодно.
Теперь приступим к более реальному программированию
Создадим класс VkBot в файле vk_bot.py, который будет служить нам ботом.
И добавим туда метод с помощью которого можно получить имя пользователя через vk id.
Это делается с помощью beatifulsoup4.
Устанавливаем если его нет:
На него есть достаточное количество статей, которые стоит изучить. С помощью него же создадим еще несколько методов:
Измените параметр _get_weather на нужный город, в последствии этот метод можно будет вызывать с указанием города, а по умолчанию будет ваше указанное значение.
С помощью этих методов мы сможем получить время и погоду. Эти методы вырезаны из моего основного проекта бота. Следует организовать их в отдельных пакетах и классах, применяя наследование. Но ради примера работы, я решил вместить все это в один класс бота, что конечно плохо.
Создадим основной метод new_message, который будет обрабатывать сообщение пользователя и возвращать ответ:
Теперь вернемся к запускаемому файлу:
Импортируем класс нашего бота:
Изменим основной наш цикл:
То есть теперь мы будем передавать полученное сообщение объекту бота, который вернет нам нужный ответ.
Это усложнение программы просто необходимо, если вы хотите дальше улучшить функционал бота:
Создайте отдельные пакеты и классы для каждой функции _get_time и _get_weather. Организуйте наследование с общего класса. И каждую новую функцию определяйте в отдельных классах, лучше всего, конечно, еще и разделить на пакеты.
Добавьте словарь с ключом идентификатора пользователя и значением объекта бота. Таким образом, не придется каждый раз в цикле создавать объект бота. К тому же, это обеспечит пользование несколькими пользователями сразу в сложных конструкциях.
Таким образом, выбрав хорошую архитектуру кода, вы сможете создать многофункционального бота.
К примеру, я научил своего бота проигрывать музыку на компьютере, открывать сайты сидя с телефона. Присылать рецепты блюд на завтрак, обед, ужин.
Вы же можете редактировать бота под себя.
Буду рад вашим идеям. По любым вопросам пишите.
Как написать чат-бота для vk.com за 3 минуты
К сожалению, на данный момент нет хороших библиотек на Python2, для того, чтобы быстро создать чат-бота. Ниже я покажу, как легко можно написать примитивного чат бота для VK, используя API VK.
Статья написана для новичков, чтобы показать, что ничего сложного в написании ботов на Python нет.
Авторизация
Нам понадобится библиотека vk_api. Авторизоваться в вк можно двумя способами:
— Как пользователь
— Как сообщество
В первом случае надо будет ввести логин и пароль. Во втором случае в группе надо включить «Сообщения сообщества» и создать ключ доступа к API:
Авторизация в две строчки:
Отправка сообщений
Теперь напишем короткую функцию, которая отправляет сообщение выбранному человеку.
P.S. Сообщество может отправлять сообщения только ранее писавшим пользователям.
В vk.method мы можем вызывать любой метод из VK API и передавать параметры в виде словаря.
В данном случае мы вызываем метод messages.send и в качестве параметров передаем id пользователя и текст сообщения.
Прием сообщений
Отлично! Отправлять сообщения мы научились, осталось научиться их принимать. Для этого нам нужен метод messages.get.
Несколько параметров, на которые стоит обратить внимание:
1) out — если этот параметр равен 1, сервер вернет исходящие сообщения.
2) count — количество сообщений, которое необходимо получить.
3) time_offset — максимальное время, прошедшее с момента отправки сообщения до текущего момента в секундах.
4) last_message_id — идентификатор сообщения, полученного перед тем, которое нужно вернуть последним (при условии, что после него было получено не более count сообщений)
В нашем случае этот метод вернет все полученные сообщения за последние 60 сек, если их конечно было меньше 100, а если больше, то последние 100.
В итоге мы получаем список items:
Если объяснять простыми словами, то items — это то, что можно выделить в диалоге.
Финальный аккорд, делаем вечный цикл, где на каждое сообщение будем отвечать «Привет, Хабр!».