[Из песочницы] Пишем чат бота для ВКонтакте на python с помощью longpoll
Сейчас боты стали обыденностью и находятся на каждом шагу, но если тебе нужен свой бот в социальной сети вконтакте, то это легко реализовать.
Нам понадобятся:
- Python
- VK Api
- Желание
Ну прям совсем для новичков
В текстовый документ с расширением .py
Через командную строку.python путь до папки с файлом\файл.py
Как оно работает?
Всё очень просто, в vk api есть такая штука, называется longpool работает она так:
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» и нажать «Создать ключ доступа».
Теперь вызовем longpool.
from vk_api.longpoll import VkLongPoll, VkEventType
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
Ссылки на примеры и документацию
Пример бота работающего на DuckDuckGo api
Примеры использования VK api (общие)
Документация по VK api Раз, Два
На этом я с вами попрощаюсь. Хорошего кодинга.