Бот VK на Python 2020 года с ответами в беседу

Всем доброго времени суток!


Я очень долго прочесывал интернет в поисках рабочего варианта бота для ВК, разработанного на Python. Никак не мог найти ни одной нормальной, целой статьи — в одной устаревший метод, в другой непонятные ошибки и так далее…

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

С чего начать?


Начнем с установки необходимых библиотек. Естественно открываем cmd.exe ( в некоторых случаях может понадобиться запустить от имени администратора) и прописываем туда следующее:

pip install vk
pip install vk_api


Мы установили две библиотеки для работы нашего Python-а с сервисом VK.

Теперь запускаем IDLE и начинаем писать код.

import vk_api, vk
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from vk_api.utils import get_random_id

Объясняю: импортируем установленные ранее библиотеки и модули для работы с ними.

Авторизация


vk_session = vk_api.VkApi(token='#ВСТАВЬ СЮДА ТОКЕН ГРУППЫ СО ВСЕМИ РАЗРЕШЕНИЯМИ')

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

from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID вашей группы без кавычек')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType

Импортируем модуль longpool для работы с чатами.

Нюансы


Дело в том, что в одной программе нельзя одновременно запустить бота для ответов на ЛС и для работы в беседе, поскольку для этого используются два разных модуля longpool и как только запускается прослушивание longpool-ом на канале «ЛС»(Личные Сообщения) прослушивание другого канала, т.е. чата недоступно, пока не завершится первый процесс прослушивания. Проще говоря задачи могут выполняться исключительно последовательно, а не параллельно. Поэтому в целом коде я деактивирую часть с ЛС, заключив ее в ''' кавычки.
Теперь импортируем то же самое, но для ЛС.

Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

Кнопки


Теперь объявим пару функций для кнопок, которые наш бот в будущем будет выдавать по требованию. К ним мы обратимся вскоре ещё раз.

keyboard = VkKeyboard(one_time=True)
keyboard.add_button('Привет', color=VkKeyboardColor.NEGATIVE)
keyboard.add_button('Клавиатура', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_location_button()
keyboard.add_line()
keyboard.add_vkpay_button(hash="action=transfer-to-group&group_id=183415444")

Прием-отправка сообщений из беседы


А теперь будем слушать longpool на предмет новых сообщений. event — переменная в которой будет храниться само сообщение и некоторые данные о нем.

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:

if 'Ку' in str(event) or 'Привет' in str(event) or 'Хай' in str(event) or 'Хелло' in str(event) or 'Хеллоу' in str(event):
Перевод того, что выше: Если слово «Привет» или "..." или "..." содержится в переменной event, тогда:

if event.from_chat:
    vk.messages.send(
    key = (''),
    server = (''),
    ts=(''),
    random_id = get_random_id(),
    message='Привет!',
    chat_id = event.chat_id
    )

Проверяем куда направлен наш event. Если в чат тогда вызываем метод отправки сообщений «vk.messages.send».

Внимание


… переменные key, server и ts необходимо заполнить. Эти переменные нужны для установки связи с сервером VK. Чтобы узнать эти переменные, а они у всех свои, нужно авторизованным перейти на сайт VK разработчикам и во вкладке «Пример запроса» ввести ID своей группы.

random_id — это случайный id сообщения, который в новых версиях VK_API теперь обязателен.

chat_id — это идентификатор беседы, из которой пришел event или иначе говоря сообщение.

if 'Клавиатура' in str(event):

         	
if event.from_chat:
    vk.messages.send(
        keyboard = keyboard.get_keyboard(),
        key = ('21b7e67abf6b938c8223242c37b4ff873efe1453'),
        server = ('https://lp.vk.com/wh183415444'),
        ts=('3539'),
        random_id = get_random_id(),
        message='Держи',
        chat_id = event.chat_id
        )


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

На сложном всё.

Часть с Личными Сообщениями


Теперь отпишем вторую часть для ЛС без особых подробностей.

for event in Lslongpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
        vars1 = ['Привет', 'Ку', 'Хай', 'Хеллоу']
        if event.text in vars1:
            if event.from_user:
                Lsvk.messages.send(
                    user_id = event.user_id,
                    message = 'Привет)',
                    random_id = get_random_id()
                    )
            vars2 = ['Клавиатура', 'клавиатура']
        if event.text in vars2:
            if event.from_user:
                Lsvk.messages.send(
                    user_id = event.user_id,
                    random_id = get_random_id(),
                    keyboard = keyboard.get_keyboard(),
                    message = 'Держи'
                    )

Поздравляю! Мы с вами разобрали бота на Python 2020 года. А сейчас я приведу весь код целиком.


import random, vk_api, vk
from vk_api.keyboard import VkKeyboard, VkKeyboardColor
from vk_api.utils import get_random_id
vk_session = vk_api.VkApi(token='ВСТАВИТЬ ТОКЕН СЮДА')
from vk_api.bot_longpoll import VkBotLongPoll, VkBotEventType
longpoll = VkBotLongPoll(vk_session, 'ID группы без кавычек')
vk = vk_session.get_api()
from vk_api.longpoll import VkLongPoll, VkEventType
Lslongpoll = VkLongPoll(vk_session)
Lsvk = vk_session.get_api()

keyboard = VkKeyboard(one_time=True)
keyboard.add_button('Привет', color=VkKeyboardColor.NEGATIVE)
keyboard.add_button('Клавиатура', color=VkKeyboardColor.POSITIVE)
keyboard.add_line()
keyboard.add_location_button()
keyboard.add_line()
keyboard.add_vkpay_button(hash="action=transfer-to-group&group_id=еще_раз_ID_группы")

for event in longpoll.listen():
    if event.type == VkBotEventType.MESSAGE_NEW:
        if 'Ку' in str(event) or 'Привет' in str(event) or 'Хай' in str(event) or 'Хелло' in str(event) or 'Хеллоу' in str(event):
            if event.from_chat:
                vk.messages.send(
                    key = (''),          #ВСТАВИТЬ ПАРАМЕТРЫ
                    server = (''),
                    ts=(''),
                    random_id = get_random_id(),
              	    message='Привет!',
            	    chat_id = event.chat_id
                    )
        if 'Клавиатура' in str(event):
            if event.from_chat:
                vk.messages.send(
                    keyboard = keyboard.get_keyboard(),
                    key = (''),          #ВСТАВИТЬ ПАРАМЕТРЫ
                    server = (''),
                    ts=(''),
                    random_id = get_random_id(),
              	    message='Держи',
             	    chat_id = event.chat_id
            	    )
'''
for event in Lslongpoll.listen():
    if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text:
        vars1 = ['Привет', 'Ку', 'Хай', 'Хеллоу']
        if event.text in vars1:
            if event.from_user:
                Lsvk.messages.send(
                    user_id = event.user_id,
                    message = 'Привет)',
                    random_id = get_random_id()
                    )
        vars2 = ['Клавиатура', 'клавиатура']
        if event.text in vars2:
            if event.from_user:
                Lsvk.messages.send(
                    user_id = event.user_id,
                    random_id = get_random_id(),
                    keyboard = keyboard.get_keyboard(),
                    message = 'Держи'
                    )
'''

P.S. Ключевые слова, по которым ведется поиск в переменной event будут строгими. Т.Е. если вы сделаете ключевым слово «Ап», то слова «Апостроф», «Аптека» и даже «ап» не будут найдены.

Всем удачи!
Теги:
python, vk, vk api, вк, бот, bot, беседы, чат-бот, чат-боты

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.