- Бот VK на Python 2020 года с ответами в беседу
- С чего начать?
- Авторизация
- Нюансы
- Кнопки
- Прием-отправка сообщений из беседы
- Внимание
- Часть с Личными Сообщениями
- Пишем чат бота для ВКонтакте на python с помощью longpoll
- Ну прям совсем для новичков
- Как оно работает?
- Техническая реализация
- Ссылки на примеры и документацию
Бот 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):
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 с помощью longpoll
Сейчас боты стали обыденностью и находятся на каждом шагу, но если тебе нужен свой бот в социальной сети вконтакте, то это легко реализовать.
Ну прям совсем для новичков
Как оно работает?
Long Polling — это технология, которая позволяет получать данные о новых событиях с помощью «длинных запросов». Сервер получает запрос, но отправляет ответ на него не сразу, а лишь тогда, когда произойдёт какое-либо событие (например, придёт новое сообщение), либо истечёт заданное время ожидания.
Говоря русским языком, мы отправляем на сервер запрос, а он в свою очередь тыкает вконтакте если там произойдёт что либо, например, нам придёт сообщение он бежит и говорит об этом нам. От этого и будем плясать.
Техническая реализация
Для начала нам нужно доказать вконтакту что мы — это мы, а не кто-либо ещё. Делается это очень просто.
import vk_api import requests session = requests.Session() login, password = 'Ваш логин, email или телефон', 'Ваш пароль' vk_session = vk_api.VkApi(login, password) try: vk_session.auth(token_only=True) except vk_api.AuthError as error_msg: print(error_msg) return
Замечание, ребята из ВК рекомендуют использовать в качестве логина номер телефона т.к. иначе можно нарваться на проверку антиробот, ту самую где тебя просят ввести недостающие цифры из номера телефона.
Если бот будет сидеть в группе то авторизация выглядит по другому.
import requests import vk_api vk_session = vk_api.VkApi(token='токен с доступом к сообщениям и фото')
— Что такое токен?
— Такая штука из циферок и буковок которую нужно получить в настройках группы. Для этого достаточно открыть раздел «Управление сообществом» («Управление страницей», если у Вас публичная страница), выбрать вкладку «Работа с API» и нажать «Создать ключ доступа».
from vk_api.longpoll import VkLongPoll, VkEventType longpoll = VkLongPoll(vk_session) vk = vk_session.get_api() for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text: #Слушаем longpoll, если пришло сообщение то: if event.text == 'Первый вариант фразы' or event.text == 'Второй вариант фразы': #Если написали заданную фразу if event.from_user: #Если написали в ЛС vk.messages.send( #Отправляем сообщение user_id=event.user_id, message='Ваш текст' ) elif event.from_chat: #Если написали в Беседе vk.messages.send( #Отправляем собщение chat_id=event.chat_id, message='Ваш текст' )
В сообщениях может быть не только заданный вами текст. Например:
import datetime vk.messages.send( user_id=event.user_id, message='Московское время: ' + str(now.strftime("%H:%M")) )
А ещё можно прикреплять картинки.
attachments = [] from vk_api import VkUpload upload = VkUpload(vk_session) image_url = 'Ссылка на картинку' image = session.get(image_url, stream=True) photo = upload.photo_messages(photos=image.raw)[0] attachments.append( 'photo<>_<>'.format(photo['owner_id'], photo['id']) ) vk.messages.send( user_id=event.user_id, attachment=','.join(attachments), message='Ваш текст' )
Можно придумать ещё много всего интересного, но тут подумайте сами, а я лишь скажу что: ссылки можно делить на части. Например:
image_url = 'http://сайт.com/uploads/' + event.text + '.png'
и никто не запретил нам получать ответ от пользователя на примере Википедии:
import wikipedia #Модуль Википедии wikipedia.set_lang("RU") if event.text == 'Википедия' or event.text == 'Вики' or event.text == 'википедия' or event.text == 'вики' or event.text == 'Wikipedia' or event.text == 'wikipedia' or event.text == 'Wiki' or event.text == 'wiki': #если нам пришло сообщение с текстом Википедия или Вики или . или wiki if event.from_user: #Если написали в KC vk.messages.send( user_id=event.user_id, message='Введите запрос' #Пишем "Введите запрос" ) elif event.from_chat: #Если написали в беседе vk.messages.send( chat_id=event.chat_id, message='Введите запрос' #Пишем "Введите запрос" ) for event in longpoll.listen(): if event.type == VkEventType.MESSAGE_NEW and event.to_me and event.text: #Пинаем longpoll if event.from_user: vk.messages.send( #Если написали в ЛС user_id=event.user_id, message='Вот что я нашёл: \n' + str(wikipedia.summary(event.text)) #Пишем "Вот что я нашёл" И то что вернёт нам api Wikipedia по запросу текста сообщения ) break #выходим из цикла elif event.from_chat: #Если написали в беседе vk.messages.send( chat_id=event.chat_id, message='Вот что я нашёл: \n' + str(wikipedia.summary(event.text)) #Пишем "Вот что я нашёл" И то что вернёт нам api Wikipedia по запросу текста сообщения ) break #выходим из цикла continue
Ссылки на примеры и документацию
На этом я с вами попрощаюсь. Хорошего кодинга.