Когда я только начинал осваивать Python хотелось написать своего бота для VK, но я считал официальную документацию не понятной для меня и ограничивался роликами на Ютубе.
Сейчас я вам расскажу как взаимодействовать с документацией, написав простого бота для VK на на языке Python на одной библиотеке requests
1. Сделаем самое простое - почитаем документацию
Все нужные методы и способы получения событий (сообщения например) написаны в документации https://vk.com/dev/manuals
Чтобы получать события нам нужен Bots Long Poll API, а чтобы отправлять сообщения будет использовать метод messages.send
2. Настраиваем сообщество
Создайте сообщество, далее перейдите в "Управление" > "Сообщения" и включите сообщения сообщества.
Далее включите возможности ботов в пункте "Настройки для бота"
После этого перейдите в пункт "Настройки" > "Работа с API" тут создайте ключ сообщества с доступом к управлению и сообщениям сообщества и скопируйте его куда то. Он нам будет нужен позже
Далее перейдите в Long Poll API и в "Типы событий" включите "Входящее сообщение" и "Действие с сообщением"(необязательно)
Готово! Осталось написать код
3. Получаем информацию о входящем сообщении
Чтобы получать события сообщества нам нужно получить адрес сервера и ключ. Для этого изучим метод https://vk.com/dev/groups.getLongPollServer
Чтобы получить нужную нам информацию мы должны отправить запрос на api.vk.com с методом и нужными значениями, в ответ мы получим json ответ с ошибкой или результатом .
При запросе к почти любым методам нужен ключ, который мы ранее скопировали, для удобства мы запишем его в переменную "token", также нам нужен будет id сообщества. Его мы можем узнать в Настройках сообщества в поле "Адрес" - цифры в адресе это наш ID, если вы ранее меняли адрес, то оригинальный адрес будет указан ниже этого поля, так же запишем его в переменную "idpub":
token='ваш ключ сообщества'
idpub='ваш id сообщества'
Далее получаем адрес сервера для получения событий, для этого в самом начале кода импортируем библиотеку requests:
import requests
Теперь обращаемся к методу groups.getLongPollServer:
r=requests.get(f'https://api.vk.com/method/groups.getLongPollServer?group_id={idpub}&access_token={token}&v=5.131').json()
Разберем код этой строки. Т.к. в ответ на запрос мы должны получить ответ в формате json, мы записываем запрос в переменную "r" и в конце объявляем модуль ".json()", для получения нужной нам информации, исходя из документации, нам нужно передать id сообщества и обязательные для почти всех методов ключ и версию API:"&access_token={token}&v=5.131').json()"
После объявления метода https://api.vk.com/method/groups.getLongPollServer через вопросительный знак мы должны передать первое значение. В нашем случае group_id, далее все остальные значения передаются через "&" это правило существует для большинства API (Требований к порядку значений нет, если хотите можете указать ключ первым значением)
Если попытаемся с помощью "print(r)" вывести получившейся результат, мы получим подобный словарь со значениями:
Ура. Теперь мы можем получать события.
Для этого вынесем нужные нам значения в отдельную переменные:
server1=r['response']['server']
key1=r['response']['key']
ts=r['response']['ts']
Теперь мы создаем вечный цикл While True и в нем отправляем на сервер запрос, передавая вышеуказанные значения:
Внимание! Соблюдайте отступы! (см. картинку ниже)
while True:
r1=requests.get(f'{server1}?act=a_check&key={key1}&ts={ts}&wait=25').json()
ts=r1['ts']
Важно! Чтобы не получать постоянно одно и тоже событие мы должны записывать переменную ts
Теперь добавим print(r1), запустим код и попробуем что-то написать сообществу:
4. Отправляем сообщение в ответ!
Ура. У нас получилось, нам вывелась информация о событии. Но что же за странные словари "{'ts': '7', 'updates': []}". Дело в том что код постоянно делает запрос на сервер, но серверу нечего ответить т.к. новых событий не было. Чтобы код не реагировал добавим "if r1['updates'] != []:" и будем писать дальнейший код там. Так же добавим "for i in r1['updates']:" т.к. за время пока код не работал могло произойти не одно событие и нам нужно обработать их всех.
Теперь исходя из получаемых событий напишем код, который будет реагировать на "Привет" с поморью метода messages.send:
Внимание! Не забывайте соблюдать отступы!
if i['type'] == 'message_new':
msg=i['object']['message']['text'].lower()
peer_id=i['object']['message']['peer_id']
if msg == 'привет':
req= requests.get(f'https://api.vk.com/method/messages.send?peer_ids={peer_id}&message=Ку&random_id=0&access_token={token}&v=5.131').json()
Разберем код:
1. if i['type'] == 'message_new': - Данное условие нужно чтобы избежать ошибки, если вы включили другие типы событий
2.
msg=i['object']['message']['text'].lower()
peer_id=i['object']['message']['peer_id']
В первую переменную мы внесли с каким текстом пришло сообщение с методом .lower(), чтобы в дальнейшем не волноваться с регистром сообщения, во вторую мы внесли ID чата
3. Далее мы просто ставим условие что если сообщение равно "привет", то отправить запрос с методом messages.send с текстом "Ку". Для этого мы передаём peer_ids - это id чата, message - это сообщение, которое надо отправить и random_id - предназначено для предотвращения повторной отправки одинакового сообщения, советую ставить значение 0 и access_token с версией API
Готово! Надеюсь я хоть чем то помог вам в написании ботов для VK
Остались вопросы? Жду ваших комментариев!