Найти тему
Tsumiki

Как легко написать бота для VK на python или как лекго взаимодествовать с любым API

Оглавление

Когда я только начинал осваивать Python хотелось написать своего бота для VK, но я считал официальную документацию не понятной для меня и ограничивался роликами на Ютубе.

Сейчас я вам расскажу как взаимодействовать с документацией, написав простого бота для VK на на языке Python на одной библиотеке requests

1. Сделаем самое простое - почитаем документацию

Все нужные методы и способы получения событий (сообщения например) написаны в документации https://vk.com/dev/manuals

Чтобы получать события нам нужен Bots Long Poll API, а чтобы отправлять сообщения будет использовать метод messages.send

2. Настраиваем сообщество

Создайте сообщество, далее перейдите в "Управление" > "Сообщения" и включите сообщения сообщества.

Далее включите возможности ботов в пункте "Настройки для бота"

После этого перейдите в пункт "Настройки" > "Работа с API" тут создайте ключ сообщества с доступом к управлению и сообщениям сообщества и скопируйте его куда то. Он нам будет нужен позже

-2

Далее перейдите в Long Poll API и в "Типы событий" включите "Входящее сообщение" и "Действие с сообщением"(необязательно)

-3

Готово! Осталось написать код

3. Получаем информацию о входящем сообщении

Чтобы получать события сообщества нам нужно получить адрес сервера и ключ. Для этого изучим метод https://vk.com/dev/groups.getLongPollServer
Чтобы получить нужную нам информацию мы должны отправить запрос на
api.vk.com с методом и нужными значениями, в ответ мы получим json ответ с ошибкой или результатом .

При запросе к почти любым методам нужен ключ, который мы ранее скопировали, для удобства мы запишем его в переменную "token", также нам нужен будет id сообщества. Его мы можем узнать в Настройках сообщества в поле "Адрес" - цифры в адресе это наш ID, если вы ранее меняли адрес, то оригинальный адрес будет указан ниже этого поля, так же запишем его в переменную "idpub":

-4

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)" вывести получившейся результат, мы получим подобный словарь со значениями:

-5

Ура. Теперь мы можем получать события.
Для этого вынесем нужные нам значения в отдельную переменные:

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
Остались вопросы? Жду ваших комментариев!

Получившейся код
Получившейся код
Что в итоге?
Что в итоге?

Наука
7 млн интересуются