Немного о написании бота VK и не только (взгляд новичка)

Статья написана студентом Хекслета. Мнение автора может не совпадать с позицией редакции
Читать в полной версии →

Всем привет! Моя первая попытка написать статью на Хекслете обернулась успехом, она уже набрала 8 лайков. Этот факт замотивировал написать еще одну на какую-нибудь интересную тему.

Снова предыстория

Когда я только начал знакомство с Python, я хотел написать что-нибудь, чем можно пользоваться. Эти амбиции были оправданы тем, что с кодом я знаком еще с ~11 лет, тогда я писал ботов для IRC (об этом я также планирую написать статейку). Первой мыслью было написать простого бота для VK, который будет реагировать на текст. По гайдам я смог слепить такого бота, но в итоге своей работы я видел некоторое количество магии: я не до конца понимал как работает Long Poll и библиотека Requests.

Хочу сразу обратить внимание на заголовок, тут будет описываться взгляд новичка. Это значит, что все описанное ниже лишь мое понимание темы и мой опыт. Ни в коем случае не претендую на какую-то истинность и научность :)

Также хочу сразу предупредить, тут не будет кода, который относится к написанию бота. Самое идеальное применение этой статье - создать машину времени, вернуться на 4 месяца назад и показать её самому себе. Примеры кода вы легко сможете найти в гугле, я сам по ним писал бота и не понимал что происходит.

Как нам получить данные из VK

Для себя я сделал вывод, что работа программиста - это работа с данными. Мы хотим использовать магию и получать данные из VK, после чего обрабатывать их в своем Python терминале. Не буду теоретизировать о различных вариантах реализации, скажу сразу, для этого нам нужно API.

Чтобы понять что такое API, нужно четко понимать что такое интерфейс и абстракции в контексте программирования. Понимать что такое абстракции очень важно, они везде. Изучить и даже создать их вы успеете при прохождении курсов, по крайней мере в курсе Python-программиста они есть. После изучения этих тем расшифровка аббревиатуры "Application Programming Interface" даст исчерпывающее объяснение что такое API.

Как работает магия

Если у меня получится в кротчайшие сроки собрать машину времени и показать эту статью самому себе 4 месяца назад, я не хочу, чтобы у молодого меня заболела голова от большого количества новой информации, поэтому объяснение работы протокола HTTP оставим профессионалам из Hexlet. Сейчас мы запустим на абстрактном сервере не менее абстрактную программу на Python, вот её код:

def ping_pong(text):
    if text:
        if text == 'ping':
            return 'pong!'
        else:
            return text
    else:
        return "There's no text"

Теперь можно потыкать нашу абстрактную программу, которую мы (гипотетически) разместили по адресу http://myserver.home/

Все запросы выполняем в строке браузера, хотя это не обязательно, но об этом далее.

http://myserver.home/ping_pong
There's no text
http://myserver.home/ping_pong?text=hello
hello
http://myserver.home/ping_pong?text=ping
pong!

В коде нашей программы можно указать сколько угодно функций, обращаться к ним нужно будет также из адресной строки: Как видно из картинки, в функцию можно передать сколько угодно переменных через амперсанд, но не забывайте, что если в функцию передать больше аргументов, чем она сможет обработать, функция вернет ошибку.

Работа с API VK

Теперь вернемся из абстрактного мира в реальный. В официальном гайде разработчики VK приводят такой пример взаимодействия с API: Теперь мы понимаем, что программа, отдающая нам данные, находится по адресу https://api.vk.com/method/ В качестве примера разработчики предлагают нам использовать их функцию users.get, куда мы передадим переменную user_id равную 210700286 и v=5.52.

Вы без проблем можете ввести этот адрес в браузер и отправить самый настоящий запрос к API VK и получить самые настоящие данные вида JSON, где вам вежливо откажут в выполнении этого метода. Откажут потому, что API VK не позволяет пользоваться своими методами неавторизованным пользователям. Чтобы получить доступ к методам, вы должны получить токен, как его получить также без проблем подскажет гугл, либо сам VK. Этот токен вы передаете в запрос как обычную переменную через амперсанд.

Отправляем запросы из Python

Для представления мне все таки придется совсем чуть-чуть тронуть тему HTTP. Когда мы жмем Enter после ввода адреса в строку, браузер посылает запрос по этому адресу. Обычно сервера отвечают нам HTML документами и некоторыми другими статическими файлами, которые наш браузер умеет исполнять и отображать в привычном для нас виде. Те же самые запросы мы можем посылать через Python с помощью библиотеки requests. Чтобы понять как это работает, вам предстоит пройти курсы "Введение в веб-разработку" и Протокол HTTP

Итак, импортируем requests, для теста отправляем get запрос по адресу google.com, выглядеть это будет примерно так:

На взгляд новичка мы получили объект, поняли мы это потому что строка обрамлена в угловые скобки. Попробуем вызвать метод text, получим много строк HTML кода. По сути мы сделали абсолютно то же, что и делает браузер, только браузер умеет работать с HTML, а наш терминал просто отображает данные как есть.

Адрес, на который мы отправили запрос, подразумевает, что им будут пользоваться браузеры, поэтому нам работать с этими данными не удобно. Что касается API, тут все наоборот. В браузере нам непривычно видеть обычный голый текст, уж тем более в JSON формате, но от Python мы хотим именно этого. Нам просто нужны данные, которые мы потом обработаем и используем в своих целях.

Я надеюсь, что на момент прочтения этого абзаца вы уже получили API токен и успели поиграться с методами в строке браузера. Ничего особо нового я тут не открою, вам всего лишь нужно отправить запрос с помощью библиотеки requests и получить те же самые данные, которые вы видели в браузере. Далее эти данные необходимо распарсить, в этом вам поможет встроенная библиотека json.

Как получать уведомления о новых событиях

Для этого используется Long Polling. Это точно такой же запрос, только ответ мы получаем не сразу, а после того, как на сервере произойдет событие. Чтобы получать события постоянно, Long Poll запросы нужно посылать постоянно, например в бесконечном цикле.

Завершение

Я не стал в очередной раз описывать работу библиотек requests, json. Каждая из них требует отдельного внимания, а requests - знания протокола HTTP. Примеры кода для создания бота также можно найти на просторах интернета, я постарался описать свое видение этой темы, объяснить как этот код работает.

Надеюсь эта статья кому-нибудь поможет, желаю успехов :)