image
Привет, Хабр! Данная статья предназначена для тех, кто хочет разобраться с основами VK API на Python, так как статей по этому поводу нет (на Хабре есть одна статья, но она уже не совсем актуальна, так как некоторые методы не работают), а на других ресурсах мне удалось найти только вопросы пользователей, но никаких гайдов и прочего.

Для работы с VK API в Python есть две популярные библиотеки: vk и vk_api. Какая из библиотек лучше я судить не возьмусь, но скажу одно: у vk документация слишком мала (поэтому разбирался практически методом тыка) и на английском языке, а у vk_api документация более развернута (поэтому писать о данной библиотеке смысла не вижу) и на русском. Для меня не главное на каком языке документация, но для некоторых пользователей это играет большое значение при выборе.

Как вы уже поняли, в данной статье рассматривается работа с библиотекой vk.

Устанавливается данная библиотека следующей стандартной командой:

pip install vk

После того, как модуль будет установлен, нам необходимо создать приложение на сайте соц.сети. Я думаю, что большинство пользователей умеет это делать, поэтому информацию по этому шагу пропускаю. Если кто не умеет, то гуглим, не стесняемся.

После регистрации приложения нам нужен будет только его ID.

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

import vk
session = vk.Session()
vk_api = vk.API(session)
vk_api.users.get(user_id=1)

Таким образом мы получим фамилию, имя и id пользователя с user_id = 1. Если вам нужно получить еще какую-то информацию о пользователе, то в вызове метода нужно указать дополнительные поля, информация о которых должна быть возвращена:

vk_api.users.get(user_id=1, fields=’online, last_seen’)

Т.е. в данном случае мы получим не только информацию об имени и фамилии пользователя с id=1, но и информацию о том, находится ли пользователь сейчас на сайте (fields=’online’) и время последнего посещения, а также тип устройства (fields=’ last_seen’).

Действия без авторизации не предоставляют нам возможность использования VK API на полную мощь, поэтому рассмотрим авторизацию с вводом личных данных. Есть два способа: ввод логина и пароля, ввод токена. Чтобы авторизоваться с помощью токена нужно немного дополнить первый пример, а именно вот эту строку:

session = vk.Session(access_token='tocken')

Дальше все остается так же, как и было раньше, без каких-либо изменений.

Следующий способ авторизации – ввод логина и пароля. В данном случае тоже все довольно просто и понятно:

session = vk.AuthSession('id_app', 'login', 'pass')
vk_api = vk.API(session)

Как видите, ничего сложного и все настолько просто и понятно, что даже не нуждается в дополнительных комментариях.

При такой авторизации нужно указывать не только логин, пароль и ID приложения, но то, к чему мы хотим получить доступ.

Например, у нас сейчас не указан доступ к стене пользователя, поэтому при попытке добавить запись на стену мы получим ошибку:

vk_api.wall.post(message="hello")
<b>Ошибка: vk.exceptions.VkAPIError: 15.</b>

Для того чтобы данный код сработал корректно, при авторизации нужно указать дополнительно аргумент с названием scope и перечислить через запятую те методы, доступ к которым мы хотим получить.

session = vk.AuthSession('id_app', 'login', 'pass', scope=’wall, messages’)
vk_api = vk.API(session)
vk_api.wall.post(message="hello")

В данном примере я запрашиваю доступ к стене и сообщениям. Выполнение программы завершается корректно, а на стене появляется запись с текстом ‘hello’. Названия методов, к которым возможно получить доступ можно посмотреть на этой странице документации.

Вот и все. Вызов методов происходит по одному шаблону:

vk_api.метод.название(параметры=значения)
Например: vk_api.messages.send(users_id=0, messages=’hello’)

Таким образом мы отправляем сообщение hello пользователю с id = 0 (т.е. самому себе). Названия параметров, которые нужно передавать при вызове какого-либо метода можно найти в документации, в описании самого метода.

Для более наглядной работы библиотеки я реализовал небольшую программку, которая следит когда пользователь зашел в ВК, а когда из него вышел (слабо верится, но может будет кому интересна). Код программы ниже и на GitHub.

Пример программы с использованием библиотеки vk
import datetime
from time import sleep
import vk

def get_status(current_status, vk_api, id):
    profiles = vk_api.users.get(user_id=id, fields='online, last_seen')
    if (not current_status) and (profiles[0]['online']):  # если появился в сети, то выводим время
        now = datetime.datetime.now()
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        print('Появился в сети в: ', now.strftime("%d-%m-%Y %H:%M"))
        return True
    if (current_status) and (not profiles[0]['online']):  # если был онлайн, но уже вышел, то выводим время выхода
        print('Вышел из сети: ', datetime.datetime.fromtimestamp(profiles[0]['last_seen']['time']).strftime('%d-%m-%Y %H:%M'))
        print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
        return False
    return current_status

if __name__ == '__main__':
    id = input("ID пользователя: ")
    session = vk.Session()
    vk_api = vk.API(session)
    current_status = False
    while(True):
        current_status = get_status(current_status, vk_api, id)
        sleep(60)


Данная статья предназначалась лишь для понимания основ работы с VK API на Python с использованием библиотеки VK.

Всем добра!
Поделиться с друзьями
-->

Комментарии (20)


  1. fahreeve
    09.01.2017 19:25

    Есть ещё aiovk для python 3.5+ сделан очень похожим на vk, но использует asyncio


    1. kirill_fckuban
      09.01.2017 19:43

      спасибо, обязательно ознакомлюсь с данной библиотекой в ближайшее время)


    1. bosha
      10.01.2017 09:04

      Шёл 2017 год, народ до сих пор не переписали свои асинхронные приложения на async/await…


      1. wing_pin
        10.01.2017 11:11
        -2

        А зачем, если и так все прекрасно работает?


        1. bosha
          10.01.2017 11:15

          Если так рассуждать, то вообще можно было на втором питоне остаться.


          1. wing_pin
            11.01.2017 11:26

            Расскажите пожалуйста это гуглу и амазону, а то они наверное не знают какие они дураки, раз используют второй питон.


            1. bosha
              11.01.2017 11:33

              Вы какую-то глупость пишите. Сравниваете маленькую библиотеку и огромные кодовые базы крупных корпораций.


  1. Sencho_Pens
    09.01.2017 19:31

    Не совсем понятно, почему вы выбрали именно библиотеку vk, раз вы сами сказали, что у vk_api документация больше, и, как я понял, в репозитории pip vk не обновлялась уже больше года.


    1. kirill_fckuban
      09.01.2017 19:36

      просто я не вижу смысла писать о том, о чем уже хорошо написано.
      Насчет обновлений, да. Уже не первый раз так долго нет обновлений для этой библиотеки.
      Выбрал, кстати, еще по одной причине: слишком уж в ней все просто) все-таки в vk_api будет больше кода и конструкции более сложные, но возможностей с ней больше. Конечно, для каких-то простых действий, мне кажется, что лучше брать как раз библиотеку vk.


  1. tytar
    09.01.2017 20:37
    +9

    Простите, но мне кажеться, что эта статья это не уровень хабра, а максимум личного блога.


    1. YaakovTooth
      09.01.2017 21:00
      +1

      Можно смело шагать по топовым либам из pypi и по пять постов в день делать так. :)


  1. alexsupra
    09.01.2017 23:19

    А еще существует библиотека vk-requests, которая является улучшенным форком библиотеки vk.


  1. lis355
    10.01.2017 00:10
    +3

    if (current_status == False) & (profiles[0]['online'] == 1):
    ...
    if (current_status == True) & (profiles[0]['online'] == 0):

    Кажется, у вас проблемы с условиями, а может быть, с программированием.
    Проверки типа "a == True" делают только новички, а уж путать бинарные и логические операторы & и and — жуть.
    Вообще постоянная копипаста profiles[0] вместо нормальной переменной (кстати, не факт что в ответе придет не пустой массив) тоже портит впечатление. Кстати отговорки "быстро писал, тестовый код" не катят, нормальный кодер и быстро напишет, и корректно.


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


    1. BelBES
      10.01.2017 09:43

      Лично по мне, эти либы не так уж и нужны, разве что для авторизации. Все равно в них нету удобных структур для отображения ответа на запросы. Да и врятли они нужны, т.к. VK API постоянно меняется.

      А есть какой-то более мейнстримный подход к анализу страниц в ВК? Мне бы, например, хватило возможности дергать личную информацию о пользователе и его фотографии, и пока самым простым способом, для меня, является исопльзование библиотеки vk


  1. igrishaev
    10.01.2017 12:52
    +1

    На мой взгляд, апишка вконтакта делается банальной оберткой над requests. В сторонних библиотеках обычно 100500 классов, когда хватает пары функций.


    1. Merlen_Gross
      10.01.2017 14:41
      +1

      Согласен. Я лично так и сделал с несколькими свистелками, вроде использование цепочек классов для доступа к разделам API (vk.users.get(user_ids=1)) и получения URL для готового запроса. Если интересно кому-нибудь — https://github.com/pyvim/vklancer.


  1. vermus
    10.01.2017 13:21

    Еще бы хотя бы рассказали как получить токен для стороннего пользователя…


    1. vldby
      10.01.2017 15:20

      Есть же официальная документация VK: Getting a Token.
      Смотрите, какие permissions вам нужны, пишите их в качестве параметра ссылки по примеру «Request example» и, собственно, у вас есть токен.


      1. vermus
        10.01.2017 16:08

        в общем, в приложении этого нет, понятно. надо писать вручную. в python-social-auth есть нечто подобное, но тоже придется допиливать чтобы совместить все это хозяйство.


  1. http2
    10.01.2017 14:29
    +2

    Хм, как по мне, достаточно документации по API на сайте самого VK.