Всем привет! В этой статье мы разберём, как сделать сделать бота для ВКонтакте с помощью Python. Наш бот будет получать сообщение от пользователя и, если оно совпадает с заданным значением, отправлять ответ.
Что понадобится
- Python версии 3.0+
- Любая среда разработки или редактор кода (мы используем PyCharm 2020.2.3 Pro)
- Любое сообщество Vk, к которому вы имеете доступ от имени администратора.
1) Вконтакте
Для начала нужно зайти в группу Vk и найти нужный нам токен сообщества. Токен - уникальный код, который предоставляет право управлять сообществом владельцу этого токена. Так что не размещайте его на публичных страницах, доступных для всех.
Для этого нам нужно перейти на страницу сообщества, "Управление" => "Работа с API". Что такое API объясняется подробнее в этой статье. Далее нажимаем создать ключ, выбираем все галочки и копируем готовый токен.
2) Код программы
Первым делом проверяем наличие Python на компьютере. Для этого открываем терминал (Консоль разработчика на Windows) и пишем слово "python". В случае успеха, в ответ вы получаете информацию об установленной версии языка. Если терминал выдает ошибку, то нужно установить Python на компьютер. Как это сделать описано здесь.
После установки ЯП, переходим к файлам: нам их потребуется два. Первый файл назовём "tokens.py". В нём будут содержаться токены сообществ, если мы будем использовать не одну группу. Второй файл называется "main.py", в нём будет сам бот.
Как и в любой программе, сначала импортируем библиотеки. Мы будем использовать библиотеку Vk API. Для её установки заходим в терминал и пишем
pip3 install vk_api
После установки библиотеки, нам следует импортировать её и несколько отдельных модулей внутрь самого нашего файла. Для этого пишем
import vk_api
from vk_api.longpoll import VkEventType, VkLongPoll
from tokens import main_token
Следующий шаг - авторизация бота. Здесь-то нам и понадобится наш токен (полный код программы внизу).
vk_session = vk_api.VkApi(token =main_token)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)
Затем стоит создать функцию отправки сообщений и указать нужные нам параметры (как добавить вложения в сообщение будет указано в конце статьи).
def sender (id, text):
vk_session.method('messages.send' , {'user_id' : id,
'message' : text,
'random_id' : 0 })
Функция принимает 2 значения: "id" и "text". "id" отвечает за внутренний айди пользователя. Его мы берём у него, когда тот пишет в сообщество, а позже ему же отправляем сообщение, за которое отвечает "text".
Хочется заметить наличие параметра "random_id". Этот параметр просто необходим для корректной работы бота, поэтому его просто нужно прописать и присвоить ему значение нуля.
Последний этап программы - прослушка поступления новых сообщений. Пока бот запущен, он будет безостановочно проверять, не появилось ли новое сообщение, а если появилось - отправит заданный ответ пользователю. Так, например, если бот получит сообщение "Привет!", то отправит в ответ "Привет, Мир!". Но пользователь может написать кодовое слово как с большой буквы, так и с маленькой. Для того чтобы избежать ошибок в работе бота, используется встроенный метод Пайтона lower(), который переводит весь текст в нижний регистр.
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
if event.to_me:
vk = vk_session.get_api()
msg = event.text.lower()
id = event.user_id
user_get = vk.users.get(user_ids =id)
user_get = user_get[0]
if msg == "привет!" :
sender(id, "Привет, Мир!")
На этом создание бота закончено, дальше вы можете дорабатывать его до совершенства, добавляя новые функции, используя новые методы и возможности vk_api. Документацию библиотеки можно найти здесь.
Бонус: как прикрепить фотографию к сообщению
Делается это очень просто: в функции, которая отвечает за отправку сообщений, нужно добавить новый параметр "attachment" и значением для него сделать ссылку на изображение внутри Vk.
def sender (id, text):
vk_session.method('messages.send' , {'user_id' : id,
'message' : text,
'attachment' : 'photo1_456264771' ,
'random_id' : 0 })
Полный код программы
import vk_api
from vk_api.longpoll import VkEventType, VkLongPoll
from tokens import main_token
vk_session = vk_api.VkApi(token =main_token)
session_api = vk_session.get_api()
longpoll = VkLongPoll(vk_session)
def sender (id, text):
vk_session.method('messages.send' , {'user_id' : id,
'message' : text,
'random_id' : 0 })
for event in longpoll.listen():
if event.type == VkEventType.MESSAGE_NEW and event.to_me:
if event.to_me:
vk = vk_session.get_api()
msg = event.text.lower()
id = event.user_id
user_get = vk.users.get(user_ids =id)
user_get = user_get[0]
if msg == "привет!" :
sender(id, "Привет, Мир!")