Для взаимодействия с 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)
В консоль выведется список списков с необходимой информацией. Таким же образом, можно реализовать и другие методы, а затем засунуть их в класс для удобства. На этом всё.