VK API Python

Для взаимодействия с api сайта vk.com на питоне есть готовые библиотеки (например), но иногда нужно использовать всего несколько методов для получения информации и не хочется добавлять дополнительные зависимости к своему скрипту. Реализовать это достаточно просто.

Получение токена

Прежде всего нужно ознакомиться с документацией. Для обращения к методам api нужен токен (подробнее). В данном примере я буду использовать сервисный ключ доступа. Для его получения нужно создать своё приложение на странице https://vk.com/apps?act=manage. Переходите по этой ссылке, жмёте кнопку «Создать», придумываете любое название и выбираете «Standalone-приложение«. Больше ничего настраивать не нужно в рамках этого примера, но ради интереса можете посмотреть, что там есть ещё. После этого заходите в настройки созданного приложения и копируете «Сервисный ключ доступа». Это и есть токен, который нужен для выполнения запросов к api. Теперь можно переходить к написанию кода.

Написание кода

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

import json
from urllib.parse import urlencode
from urllib.request import urlopen

Ответ на запрос к api возвращается в формате json (подробнее). Для обращения к методам api напишем несколько вспомогательных функций.

import json
from urllib.parse import urlencode
from urllib.request import urlopen

api_ver = '5.131'
api_url = 'https://api.vk.com/method/'
api_token = 'Сервисный ключ доступа'

def make_url(method, args):
    return f'{api_url}{method}?{urlencode(args)}' \
           f'&access_token={api_token}&v={api_ver}'
    
def request(method, args):
    url = make_url(method, args)
    response = {}
    try:
        response = json.loads(urlopen(url).read())
    except Exception as e:
        print(e)  
    if 'error' in response:
        print(response['error']['error_msg'])
        response = None
    return response

Метод make_url вспомогательный. Он возвращает url запроса, который формируется из имени метода, его параметров, а так же токена и версии api. Метод request выполняет GET запрос к api и возвращает результат в виде словаря.

Теперь нужно обратиться к списку методов, который нам предоставляет api. Например, хочется получить список подписчиков сообщества (их пол, дату рождения и время, когда они последний раз заходили во вконтакте), чтобы проанализировать аудиторию. Для этого понадобится метод groups.getMembers. На этой странице указана подробная информация о том, какие параметры вызова этого метода, в каком виде возвращается результат, а так же пример запроса, чтобы было более наглядно. Допишем к нашему скрипту этот метод:

def groups_get_members(group_id, offset=0, count=1000):
    response = request('groups.getMembers', {'group_id': group_id,
                                             'offset': offset,
                                             'count': count,
                                             'fields':'sex,bdate,last_seen'})
    if response:
        result = []
        for user in response['response']['items']:
            result.append([user.get('id'),
                           user.get('sex'),
                           user.get('bdate'),
                           user.get('last_seen', {}).get('time')])
        return result

И вызовем этот метод, для получения информации о десяти подписчиках. Весь код получается таким:

import json
from urllib.parse import urlencode
from urllib.request import urlopen

api_ver = '5.131'
api_url = 'https://api.vk.com/method/'
api_token = 'Сервисный ключ доступа'

def make_url(method, args):
    return f'{api_url}{method}?{urlencode(args)}' \
           f'&access_token={api_token}&v={api_ver}'
    
def request(method, args):
    url = make_url(method, args)
    response = {}
    try:
        response = json.loads(urlopen(url).read())
    except Exception as e:
        print(e)  
    if 'error' in response:
        print(response['error']['error_msg'])
        response = None
    return response

def groups_get_members(group_id, offset=0, count=1000):
    response = request('groups.getMembers', {'group_id': group_id,
                                             'offset': offset,
                                             'count': count,
                                             'fields':'sex,bdate,last_seen'})
    if response:
        result = []
        for user in response['response']['items']:
            result.append([user.get('id'),
                           user.get('sex'),
                           user.get('bdate'),
                           user.get('last_seen', {}).get('time')])
        return result

members = groups_get_members('apiclub', 0, 10)
print(members)

В консоль выведется список списков с необходимой информацией. Таким же образом, можно реализовать и другие методы, а затем засунуть их в класс для удобства. На этом всё.

Оставьте комментарий