Всем доброго времени суток!
Я очень долго прочесывал интернет в поисках рабочего варианта бота для ВК, разработанного на 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 будут строгими. Т.Е. если вы сделаете ключевым слово «Ап», то слова «Апостроф», «Аптека» и даже «ап» не будут найдены.
Всем удачи!