В этой статье мы не будем рассказывать, как писать сложные приложения и игры, а расскажем, как вытащить статистику, обращаясь к запросам API ВКонтакте на платформе ВК для разработчиков. В конце бонус для нетерпеливых – как собрать информацию в несколько кликов и без подключения API.
Содержание:
- Зачем нужно использовать API во ВКонтакте
- Как подключить API во ВКонтакте
- Как использовать API ВК
- Какие методы использовать для получения статистики
- Как получить статистику в 10 раз быстрее
У ВК есть многофункциональный и удобный API, который позволяет разработчикам выполнять самые разные действия. Раскрыть весь потенциал API стоит тем, кто хочет писать приложения и игры, использующие движок ВК. Придется тщательно изучить документацию ВК API, зачем нужно логирование API в ВК и многое другое.
Впрочем, пользоваться им сможет даже не специалист, если внимательно прочитает мою статью.
API – это посредник между разработчиком приложений и средой, с которой приложение будет взаимодействовать. С помощью API упрощается создание кода, так как можно использовать готовые формы или структуры для работы с уже имеющимися данными.
Чтобы пользоваться официальным API ВКонтакте, не нужно знать в подробностях, как устроена база ВК, из каких типов, таблиц, полей и структур она состоит. Об этом знает API. Пользователю достаточно знать команды и коды, которые он будет использовать в работе.
С помощью API можно выполнять огромное количество команд. Так как нам интересно управление аккаунтами ВКонтакте и получение информации о странице или группе, мы сконцентрируемся на этих задачах.
Что можно делать с помощью API:
- создавать приложения и игры – для продвижения бизнеса и повышения узнаваемости бренда;
- настраивать автоматический постинг – статей или ссылок в группе во ВКонтакте;
- получать расширенную информацию о пользователях – имя, телефон, приватность профиля, находится ли пользователь в черном списке, данные skype, livejournal и т. д. в профиле, количество фотоальбомов, фотографий, аудио, видеозаписей, друзей и т. д., адреса сайтов, указанных в профиле;
- получать информацию о записях на стене пользователя – комментарии, информацию о пользователях, которые лайкнули запись, записи со стен пользователей по их идентификаторам;
- получать информацию о друзьях пользователя – список id, список id друзей онлайн, список id общих друзей между парой пользователей;
- получать информацию о группах пользователя – список, информацию о группах по их идентификаторам, список участников групп;
- получать информацию об отметках геолокации пользователя – список отметок и информацию о местах;
- получать информацию о документах пользователя – список и информацию о документах пользователя или сообщества по id;
- получать информацию об одном или нескольких сообществах – количество подписок/отписок, позитивных/негативных действий и реакций, число просмотров и посетителей, охват, список участников сообщества, список приглашенных пользователей и т. д.
Это только часть действий с аккаунтами, группами, виджетами, приложениями, темами, списками и даже звонками, которые становятся доступны пользователю, который работает с API ВК.
Обратите внимание – API ВК работает примерно так же, как и обычная страница. Если у вас нет доступа к группе или странице, то и через API его не будет. Если информация в сообществе закрыта (как, например, о внесенных в бан пользователях), то и через API эту информацию вы не откроете.
Далее разберемся, как подключить API во ВКонтакте.
Как подключить API во ВКонтакте
На платформе ВКонтакте для разработчиков можно выполнять различные задачи. С помощью методов API можно получить много нужной информации через формы на странице каждого метода. Также можно автоматизировать различные процессы от имени пользователя, у которого есть сервисный ключ доступа (access_token).
Сервисный ключ используют для запросов, которые не требуют авторизации пользователя или сообщества, и для работы с открытыми методами, например users.get. Получить его можно несколькими способами, но мы разберемся, как это сделать, создав приложение во ВКонтакте.
Чтобы создать приложение, надо перейти на платформу для разработчиков, кликнув по кнопке «Разработчикам» на странице в ВК.
И нажать кнопку «Создать приложение».
Затем дать название новому приложению и выбрать платформу. Выбираем «Standalone -приложение», так как при регистрации этой платформы мы получим ключ, который необходим в большинстве методов. Затем нажать «Подключить приложение».
Во всплывающем окне «Подтверждение действия» необходимо привязать мобильное устройство к странице. Для этого нажмите «Привязать устройство» или «Подтвердить через телефон».
На вашем мобильном устройстве появится окно подтверждения. Нажмите «Получить код». Дождитесь смс-сообщения с кодом на привязанный к аккаунту номер телефона и введите его в поле подтверждения.
После подтверждения системой в десктопной версии откроется новое окно «Информация».
Так как эта операция не для развития приложения, а чтобы получить API токен ВК – выбираем вкладку «Настройки».
Во вкладке «Настройки» мы видим поля с ID приложения, «Защищенный ключ» и «Сервисный ключ доступа».
Именно «Сервисный ключ доступа» нам и нужен, это и есть access_token, который понадобится для выполнения каждого метода.
Нажимаем на глазок в конце поля, чтобы открыть и скопировать значение токена. На мобильное устройство придет push-уведомление, в котором нужно подтвердить действие. После подтверждения получаем строку из латинских букв и цифр, которая соответствует созданному приложению.
Сервисный ключ получен, стоит его сохранить. Чтобы дальше можно было работать с API ВКонтакте, нужно включить приложение. Для этого в строке «Состояние» выберите «Приложение включено и видно всем» и сохраните изменения.
Полученный ключ доступа скопируйте и сохраните так, чтобы при использовании очередного метода было удобно прикреплять его к каждому запросу к ВК API.
Во ВКонтакте можно даже без API запустить чат-бота или автоворонку. Так вы сможете привлечь новых клиентов и увеличить доход. Узнайте подробнее на курсе «Рассылки, чат-боты и автоворонки ВКонтакте». Вас научат автоматизировать продвижение бизнеса и разбираться в эффективных инструментах продаж во ВКонтакте. Программа состоит из 5 модулей и 8 практических занятий, на которых подробно разбирается каждый инструмент.
Как использовать API ВК
Какие возможности предоставляет API во ВКонтакте? Например, нам нужно собрать статистику страницы ВК – чтобы получить ее через API, необходимо перейти на платформу для разработчиков и выбрать необходимый метод.
Для примера возьмем популярный аккаунт. Открываем форму метода и вытаскиваем номера телефонов, указанные в информации аккаунтов подписчиков. Выполнить настройку API ВКонтакте с помощью формы методов несложно.
Метод Users
Статистику страницы ВК можно получить этим методом через API, с помощью сервисного ключа доступа, и выгрузить только общедоступные данные. Если номер телефона скрыт или не указан, строка будет пустой.
Для выбора метода переходим на платформу для разработчиков, выбираем вкладку «API» и внизу кликаем на «Методы API».
Далее листаем вниз до метода «Users».
Выбираем «getFollowers» для получения информации о подписанных на подопытный популярный аккаунт пользователях.
Затем заполняем форму метода:
- access_token – вставляем сервисный ключ доступа;
- user_id – числовой идентификатор аккаунта ВК, который мы взяли из адресной строки;
- offset – смещение (с какого по счету id выдать информацию), мы прописываем «0», чтобы получить информацию, начиная с первого пользователя;
- count – количество подписчиков, информацию о которых нужно получить;
- fields – объект, который необходимо получить, в нашем случае это «contacts»;
- name_case – падеж для склонения имени и фамилии пользователя, выбираем «nom» – именительный.
После заполнения всех полей нажимаем кнопку «Выполнить».
В процессе выполнения могут возникнуть системные ошибки, расшифровку которых можно посмотреть в списке кодов ошибок.
Если все заполнено правильно – получаем результат с ID страниц, телефонами, именами и фамилиями пользователей в указанном количестве.
Тем же способом в ВК методах API можем получить:
- bdate – дата рождения в формате D.M.YYYY или D.M, если год рождения скрыт (если дата рождения скрыта целиком, поле отсутствует в ответе);
- career – информация о карьере пользователя;
- city – информация о городе, указанном на странице пользователя (да, если он указал Нью-Йорк, он и будет вписан);
- connections – информация об указанных в профиле сервисах пользователя;
- counters – количество различных объектов у пользователя (фотоальбомы, аудиозаписи, видеозаписи и т. д.);
- domain – короткий адрес страницы;
- exports –внешние сервисы, в которые настроен экспорт из ВК;
- occupation – информация о текущем роде занятий пользователя.
Конечно, это далеко не все, что можно вытащить из ВК с помощью API. Подробный список объектов можно посмотреть в справочнике.
Метод Wall
С помощью этого метода можно получить список постов на стене пользователя или сообщества.
В список входят:
- текст поста;
- id пользователя, оставившего запись;
- количество лайков, комментариев и репостов;
- тип вложения – запись, картинка, видео или аудиозапись;
- подписан ли пользователь на сообщество.
Чтобы получить записи со стены сообщества или пользователя, переходим в метод wall.get и заполняем все необходимые поля:
- owner_id – id пользователя или сообщества, со стены которого необходимо получить записи;
- domain – короткий адрес пользователя или сообщества, можно найти в строке адреса;
- offset – смещение, то есть с какого по счету id выдать информацию;
- count – количество записей, которое необходимо получить, максимум 100;
- filter – типы записей на стене, которые необходимо получить (выберите команду, которая соответствует вашему запросу – отложенные записи, записи владельца стены, все записи на стене и т. д.);
- extended – при установке значения «1» в ответ будут добавлены дополнительные поля profiles и groups, содержащие информацию о пользователях и сообществах (по умолчанию значение «0»);
- fields – количество дополнительных полей для profiles и groups, которые необходимо получить (этот параметр работает только при extended= 1).
После заполнения всех полей нажимаем кнопку «Выполнить».
И получаем список постов со стены с нужной информацией.
Какие методы использовать для получения статистики
Далее мы расскажем об основных методах для получения статистики из сообществ ВКонтакте.
Некоторые методы не работают с сервисным ключом доступа. Пользователям, которым нужно собрать статистику сообщества, необходимо иметь ключ доступа пользователя, полученный через Implicit Flow.
Подробнее об этом читайте в Implicit Flow для получения ключа доступа пользователя.
Собрать активные Истории
Методом stories.get можно получить активные Истории пользователя или сообщества.
Заполните необходимые поля:
- owner_id – id пользователя, Истории которого необходимо получить;
- extended 1 – получать (значение 1) или нет (значение 0) дополнительную информацию о профилях пользователей;
- fields – количество дополнительных полей.
В ответе получаем количество активных Историй и объекты с публикациями. В зависимости от того, что указали в строке fields, по каждой Истории получаем ID пользователя, тип (фото или видео), число просмотров и ответов на нее.
Получить статистику сообщества
Методом stats.get можно экспортировать статистику сообщества или приложения.
Внесите значения в поля:
- group_id или app_id – id сообщества или приложения;
- date_from и date_to – начальная и конечная дата выводимой статистики в формате YYYY-MM-DD;
- timestamp_from и timestamp_to – начало и конец периода статистики в Unixtime (система описания моментов во времени, для вычисления нужно воспользоваться онлайн-конвертером Unixtime);
- interval – интервалы времени, за которые нужна статистика (возможные значения: day, week, month, year, all);
- intervals_count – количество интервалов времени;
- stats_groups – фильтр для получения данных по конкретному блоку статистики сообщества (возможные значения: visitors, reach, activity);
- версия – чтобы не было ошибок, выбираем 5.86.
При заполнении полей, отвечающих за дату, надо ввести значения (время в формате Unixtime) в полях timestamp_from и timestamp_to, т. к. параметры date_from и date_to устарели.
После успешного выполнения получим объект с данными статистики за указанный период: количество подписок и отписок, позитивных и негативных действий и реакций, число просмотров и посетителей, охват.
Как получить статистику в 10 раз быстрее
А теперь мы расскажем, как собрать статистику группы или аккаунта без знания API и в разы быстрее. Для этого потребуется DataFan – данные будут у вас на руках в несколько кликов.
Более того, с помощью сервиса аналитики вы сможете собирать информацию сразу из нескольких рекламных кабинетов и аккаунтов, например, из Яндекс.Метрики и аккаунта в ВК, и загружать ее в отчеты. Так сопоставлять данные будет намного удобнее и проще, а информация будет наглядно визуализирована.
Итак, разберемся, как вытащить данные.
Авторизуемся в DataFan. Если аккаунта еще нет, можно зарегистрироваться и использовать промокод SMP-BLOG. С промокодом можно бесплатно подключить 3 рекламных кабинета или аккаунта на месяц и собирать необходимые данные.
Подключаем источники, из которых нужно будет собирать данные. Например, чтобы подключить ВК, нужно:
- кликнуть на «Подключить паблик/РК»;
- VK ADS;
- «Подключить ВКонтакте»;
- предоставить разрешения DataFan.
После этого данные начнут собираться. Когда все будет готово, статистика будет доступна в дашборде. Его можно найти во вкладке «Панель управления».
После выгрузки данных с ними можно работать прямо в DataFan. Сервис автоматически будет формировать отчеты по сообществам и рекламным кабинетам. Можно воспользоваться шаблоном или собрать свой отчет из нужных данных. Все отчеты доступны на панели управления.
Например, если собрать отчет по сообществу ВКонтакте, можно получить 6 вкладок с данными по:
- соцдему – общая и детальная информация;
- вовлеченности;
- аудитории;
- охватам;
- статистике постов и Историй.
При этом отчет будет интерактивным – можно настраивать периоды времени, фильтровать и сортировать данные.
Больше о настройках DataFan мы писали в статьях:
- Как выгрузить из ВКонтакте данные статистики с помощью DataFan
- Как построить сквозную аналитику для таргетированной рекламы ВК с помощью DataFan
Мы разобрались, какие возможности предоставляет API ВКонтакте, зачем нужно использовать API и как его подключить. Изучили, что можно делать, если получить токен API, и описали некоторые методы, которые позволяют быстро достать нужные данные.
А главное – рассказали, как достать многие из этих данных, не пользуясь сложными методами API. С помощью DataFan можно быстро выгрузить всю необходимую информацию. А еще можно автоматизировать отчет, чтобы регулярно выгружались актуальные данные.
API ВКонтакте используют не только для сбора статистики, но и для отложенного постинга, отправки сообщений. Мы с командой активно применяем его для автоматизации отчетности по SMM и таргету. Поэтому поговорим про сценарии использования, когда нужно получить статистику из ВКонтакте для обработки в других системах. Кратко расскажем, как в целом работает API, поделимся методами, которыми пользуемся сами. В конце пройдемся по сложностям, от которых зависит результат.
Когда и зачем нужно выгружать данные из ВК
Данные из ВКонтакте выгружают, чтобы обрабатывать, производить операции и расчеты с ними, анализировать дальше в других системах и сервисах. Мы экспортируем статистику сообществ и рекламных кабинетов в свои базы данных и дальше:
-
рассчитываем дополнительные показатели – вовлеченность, активное ядро аудитории, лучшие день и время постинга и т. д.;
-
упаковываем в динамические дашборды;
-
импортируем в другие инструменты обработки данных и BI-системы – Excel, Google Data Studio, Power BI, Google Таблицы.
1: Шаблон отчета по ВКонтакте для Google Data Studio в сервисе DataFan, в который можно автоматически импортировать данные через официальный API
Если разберетесь в методах и объектах и научитесь работать с API ВКонтакте, вы как разработчик сможете написать свои скрипты и выгружать данные напрямую в сторонние сервисы обработки данных вроде Google Data Studio. Или же тянуть статистику в собственный аналитический инструмент.
Зная принципы и правила работы с API, вы сможете получать актуальные данные через формы на страницах каждого метода на платформе ВКонтакте для разработчиков.
Для этого:
Зайдите в раздел API платформы ВК для разработчиков.
2: Здесь можно почитать подробные инструкции по работе с API
В списке методов найдите нужный – в зависимости от того, какие данные вы хотите получить. Например, stories.get собирает активные Истории конкретного пользователя или сообщества.
3: Находим нужный метод API ВКонтакте
Проскрольте до блока «Пример запроса» внизу страницы, введите параметры в форму и нажмите «Выполнить».
4: Полученный код можно скопировать кликом по иконке в правом верхнем углу
Теперь разберемся, как работает API ВКонтакте, а потом подробнее рассмотрим несколько методов, которые чаще всего используются для экспорта статистики.
Общий принцип работы API ВКонтакте
В целом API VK работает так же, как и любой другой API:
→ мы (клиент) авторизуемся в интерфейсе API;
→ отправляем запрос к системе в виде предусмотренных разработчиками методов;
→ API «объясняет» системе, чего мы от нее хотим;
→ система через API в заданном формате возвращает результат, с которым можно дальше работать.
5: Схематично это можно изобразить так
Метод в понятном для системы формате передает информацию о том, что мы хотим от нее получить и в каком виде. Например, для получения статистики мы используем метод stats.get и в параметрах указываем, что хотим получить цифры:
-
для конкретного сообщества или приложения;
-
за определенные периоды времени;
-
по конкретным показателям – количеству посетителей, охвату, активности и т. д.
Как мы говорили выше, единоразово все это можно выгрузить через форму на странице метода платформы для разработчиков. Однако нас такой способ не устраивает. Нам важен постоянный доступ к актуальной статистике, представленной в виде наглядных сводок, схем и графиков, которыми можно поделиться с клиентом.
Чтобы регулярно выгружать данные и импортировать в нужные инструменты, мы написали свой клиент для API ВКонтакте, в котором учли лимиты системы по количеству запросов и необходимые паузы между ними. Через него отправляются запросы к базе данных и возвращаются читаемые данные.
Когда новое сообщество или рекламный кабинет подключается к клиенту, первые данные собираются за 1,5 года, в дальнейшем при обновлении данных – за последние несколько дней. Поэтому в рамках одного запроса мы не запрашиваем полную информацию за все время – ограничиваем период статистики конкретными датами. Этот способ оптимален, так как показатели выгружаются регулярно. Он помогает снизить нагрузку и соблюдать лимиты API.
После экспорта статистики из ВКонтакте мы работаем с ней дальше: обрабатываем, переводим в нужные форматы, вычисляем дополнительные показатели, приводим в удобный для анализа вид.
Какие методы используем
Расскажем про ключевые методы, которые мы используем для экспорта статистики из ВКонтакте.
Собираем посты со стены сообщества
Метод wall.get возвращает список постов, которые были опубликованы в группе, и сами записи.
Для получения данных нужно указать параметры:
-
ID сообщества – owner_id;
-
короткий адрес группы – domain;
-
количество публикаций, которые нужно выгрузить – count.
Также здесь можно указать тип постов, которые мы хотим выгрузить:
-
предложенные;
-
отложенные;
-
от имени сообщества;
-
от имени других пользователей или все.
В результате мы получаем количество выгруженных постов и массив объектов, записей на стене сообщества, с подробными данными по каждому: количеством комментариев, лайков, репостов, просмотров и т. д.
Через этот метод API отдает посты с сортировкой по дате от новых к старым, и возможности выгрузить записи за определенный период нет. Поэтому мы выгружаем «постранично» по 50 постов, пока не выйдем за пределы временного интервала или пока не кончатся все записи.
Собираем активные Истории
Метод stories.get собирает Истории пользователя или сообщества, активные на момент отправки запроса.
Для выгрузки указываются параметры:
-
ID сообщества – owner_id;
-
данные, которые мы хотим получить – fields.
На выходе получаем количество активных Историй и массив объектов с самими публикациями. В зависимости от того, что прописали в параметре fields, по каждой Истории собираются ID, тип (фото или видео), число просмотров и ответов на нее.
Собираем статистику по Историям
Метод stories.getStats возвращает статистику по Истории, ID которой мы передаем в API в рамках запроса.
Для этого нужно сформировать параметры:
-
ID владельца Истории (пользователя или сообщества) – owner_id;
-
ID самой публикации – story_id.
В результате получаем данные по просмотрам, ответам на Историю, расшариваниям, новым подписчикам, переходам по ссылке, ответам в сообщениях, скрытиям.
Собираем информацию о подписчиках
Метод users.get возвращает расширенную информацию о пользователях, идентификаторы или короткие имена которых мы указали в запросе.
Параметры:
-
ID или короткие имена пользователей, информацию о которых надо собрать – user_ids или screen_name;
-
список полей профилей, из которых нужны данные – fields;
-
падеж для склонения имени и фамилии пользователя – name_case.
На выходе получаем массив объектов пользователей с информацией о них. Набор полей зависит от того, что мы прописали в параметрах запроса. С помощью users.get можно собрать имена, фамилии и даты рождения, данные из разделов страницы «О себе», «Деятельность», «Карьера», количество друзей, фотоальбомов, видеозаписей и т. д.
Мы с помощью этого запроса решаем 2 задачи:
-
вытягиваем фамилию и имя, чтобы отобразить их при подключении пабликов и рекламных кабинетов;
-
получаем часовой пояс пользователя, чтобы давать в отчетах корректные рекомендации по лучшему времени постинга.
Вытягиваем данные по видеозаписям
Метод video.get возвращает информацию о видеозаписях, которые принадлежат заданному в параметрах запроса пользователю.
Предусмотренные параметры:
-
ID владельца видео – owner_id;
-
ID видеозаписей – videos;
-
ID альбома, видео из которого надо вытянуть – album_id;
-
количество выгружаемых роликов – count;
-
поля с информацией и показателями, которые нужно вытянуть – fields.
Метод возвращает количество видеозаписей и массив роликов с количеством комментариев, просмотров, лайков, зрителей прямой трансляции, репостов и другими показателями по каждому.
Выгружаем комментарии к видеозаписям
Метод video.getComments позволяет выгрузить список комментариев к конкретному ролику, идентификатор которого мы указали в запросе.
Параметры:
-
ID пользователя или сообщества – owner_id;
-
ID видео – video_id;
-
необходимость выгружать данные по лайкам к комментариям – need_likes;
-
ID комментария, начиная с которого нужно выгружать данные – start_comment_id;
-
количество выгружаемых комментариев – count;
-
порядок сортировки – sort.
В результате получаем количество и массив с комментариями и дополнительными данными по ним.
Собираем данные по фотографиям
Метод photos.get экспортирует список фотографий альбома, который мы указали в запросе.
Параметры:
-
ID владельца альбома – owner_id;
-
ID альбома – album_id;
-
ID фотографий, данные по которым нужно выгрузить – photo_ids;
-
порядок сортировки фотографий – rev;
-
необходимость выгружать дополнительную информацию: лайки, комментарии, репосты – extended;
-
количество фотографий, которые нужно собрать – count.
В результате получаем количество и массив с фотографиями и данными по каждой: количеством лайков, комментариев, репостов.
Экспортируем комментарии к фотографиям
Метод photos.getComments собирает комментарии к фотографии, указанной в запросе.
Параметры:
-
ID владельца фотографии – owner_id;
-
ID фотографии, данные о которой надо вытянуть – photo_id;
-
необходимость выгружать лайки к комментариям – need_likes;
-
ID комментария, начиная с которого нужно экспортировать данные – start_comment_id;
-
количество выгружаемых комментариев – count;
-
порядок сортировки – sort;
-
дополнительная информация о пользователях, оставлявших комментарии, которую нужно выгрузить: ФИО, «О себе», гео и т. д. – fields.
На выходе получаем количество и массив комментариев с дополнительной информацией по ним. В зависимости от параметров запроса это могут быть количество лайков, массивы пользователей и сообществ с данными по ним, которые мы запрашивали через параметр fields.
Выгружаем статистику сообщества
Метод stats.get позволяет экспортировать статистику сообщества или приложения.
Параметры:
-
ID сообщества – group_id;
-
начальная и конечная даты выводимой статистики – date_from и date_to;
-
начало и окончание периода статистики – timestamp_from и timestamp_to;
-
конкретные блоки статистики, которые нужно вытянуть – stats_groups.
В результате получаем показатели сообщества за указанный период: количество подписок и отписок, позитивных и негативных действий и реакций, число просмотров и посетителей, охват.
Объединяем несколько методов в один запрос
Метод execute универсален – он позволяет запускать последовательность других методов, чтобы сохранить и отфильтровать промежуточные результаты. Также мы активно используем его, чтобы собрать данные по нескольким постам, Историям или видео в рамках одного запроса. Это помогает укладываться в ограничения API – если бы мы отправляли отдельные запросы по каждой Истории, собирать такое количество данных в единицу времени было бы невозможно, приходилось бы делать перерывы.
Параметры зависят от конкретных методов, которые мы используем в рамках запроса. Для формирования можно использовать арифметические и логические операции, конструкцию if, поиск в массиве или строке и т. д.
На выходе получаем данные, которые запрашивали через методы, использованные в алгоритме.
6: Пример execute-запроса из официальной справки по API
Пример: как получить статистику по Историям
Рассмотрим выгрузку данных через официальный API ВКонтакте на примере конкретной задачи. Предположим, нам надо вытянуть статистику по Историям сообщества и настроить регулярную выгрузку показателей.
Чтобы обновить собранную статистику по Историям, нам приходится собирать ID всех публикаций за последние 2 дня в нашей базе данных и отдельным запросом execute(stores.getStats) вытягивать по ним финальную статистику.
Такое происходит, потому что по запросу stories.get ВКонтакте отдает только активные на данный момент Истории. Мы обновляем набор данных не каждую секунду. Может быть ситуация, когда публикация завершилась, а мы не выгрузили по ней финальную статистику. Потому что мы не можем собирать данные в последнюю секунду существования Истории. Чтобы решить эту проблему, собираем ID. Так мы можем получить статистику, даже если История уже завершилась – с помощью метода execute(stores.getStats).
А вот и фрагмент кода, который нужен, чтобы:
-
получить из API ВКонтакте Истории сообщества;
-
проверить, что они входят в нужный временной промежуток;
-
сформировать массив с данными для execute-запроса по статистике для этих публикаций.
def get_stories(self, group_id, group_cash, user_tz_offset):
executed_batch_for_story_stats = list()
stories_stats = dict()
stories_data = {
'owner_id': group_id * -1,
'extended': 0
}
group_stories_response = self.vk_client_stories.post('stories.get', **stories_data)
group_stories = group_stories_response.get('items', [])
if len(group_stories) > 0:
if type(group_stories[0]) == list:
group_stories = group_stories[0]
for story in group_stories:
story_date_datetime = timestamp_to_datetime(story['date'])
if story_date_datetime < self.start_datetime:
continue
story_key = self.make_story_key(self.format_key('story', story))
executed_batch_for_story_stats.append(self._prepare_execute_code_for_story_data(
group_id=group_id,
story_id=story['id'],
story_key=story_key,
))
story.pop('views')
stories_stats[story_key] = story
self.stories = self._collect_story_stats(
batch=executed_batch_for_story_stats
)
Например, проверить, входят ли отобранные Истории в нужный интервал, позволяет этот фрагмент:
story_date_datetime = timestamp_to_datetime(story['date'])
if story_date_datetime < self.start_datetime:
continue
Далее нам нужно правильно сформировать параметры для запроса execute(stores.getStats) — owner_id и story_id. Так как мы собираем статистику по нескольким Историям, для каждой из них дописываем код с соответствующими story_id, которые мы собрали на предыдущем этапе через запрос stories.get.
def _prepare_execute_code_for_story_data(self, group_id: int, story_id: int, story_key: str) -> str:
code_story_stats = f'API.stories.getStats({{"owner_id": {group_id * -1}, '
f'"story_id": {story_id}}})'
return (
f'{{"groupId": "{story_key}",'
f'"statsGetStoryData": {code_story_stats} }}'
)
Наконец, вытягиваем статистику Историй. Для этого передаем в API те параметры для execute-запроса, которые сформировали выше. Через них мы получим статистику по публикациям, которые собрали на первом этапе.
def _collect_story_stats(self, batch: List[str]) -> dict:
collected_story_stats = dict()
for execute_items in chunks(batch, 15):
response = self.vk_client_stories.execute(**{
'code': self.execute.format(elements=','.join(map(str, execute_items)))
})
for batch in response:
batch_group_id = batch['groupId']
stats_get_data = batch['statsGetStoryData']
collected_story_stats[batch_group_id] = stats_get_data
return collected_story_stats
Подводные камни
Основные нюансы, которые нужно учитывать, чтобы вытянуть через официальный API ВКонтакте данные в нужных объеме и формате:
Есть ограничения на количество запросов. API ВКонтакте обрабатывает ограниченное число запросов за промежуток времени. И для разных типов методов предусмотрены свои «квоты». Об этом нужно помнить, если вы планируете выгружать данные автоматически и в больших объемах.
Отдельные методы позволяют получить информацию только об ограниченном наборе сущностей. Например, метод stories.get возвращает только активные на момент запроса Истории. Если 24 часа с момента публикации Историй уже прошли, собрать их не получится.
Важно разобраться со взаимодействием разных методов между собой. Без этого не получится выгрузить отдельные показатели. Например, чтобы собрать статистику по всем Историям – и активным, и завершенным, выпущенным за определенный период времени, мы используем метод stories.getStats. Но для этого нужно указать в параметрах ID конкретных Историй. Эту информацию мы можем получить только с помощью метода stories.get. Поэтому для выгрузки и поддержания актуальной статистики по этому типу контента мы собираем ID Историй через stories.get, а затем – финальную статистику по ним после завершения через stories.getStats.
Случаются баги и ошибки. Нельзя сказать, что этим страдает исключительно API ВКонтакте – от ошибок не застрахована ни одна система. Однако об этом нужно помнить и в случае чего сразу обращаться в техподдержку. Специалисты ВК довольно оперативно решают такие ситуации – собирают дополнительную информацию, передают разработчикам и исправляют ошибки.
Это не все подводные камни, с которыми мы сталкиваемся. Чтобы разобраться со всеми, придется тщательно изучить документацию по API и немного походить по граблям.
grigoriev
18918
Социальные сети стали неотъемлемым инструментом продвижения сайтов. Для раскрутку сайта через соц. сети следует создать группу или страничку данного сайта.
Набирать подписчиков, выкладывать новости на стену и много чего ещё (это тема отдельной заметки). Многие эти процессы можно автоматизировать используя API
(интерфейс прикладного программирования) соответствующей социальной сети. В этой заметке я разберу как подключиться к vk api (вконтакте), как начать работать
c вк апи, а так же приведу несколько примеров работы с api вконтакте.
Создание приложения вконтакте
И так приступим. Vk api имеет много методов, но одним из основных их различий является то, что для выполнения запросов к вк апи через некоторые методы
требуется специальный ключ доступа – токен (access_token). Получить его можно создав своё приложение. Нам предлагают несколько видов приложений, но
я выбираю тип Standalone. Мне его хватает. Для начала создания приложения переходим по
ссылке
и попадаем в
следующее окно.
Здесь мы выбираем тип и название нашего приложения. Нажимаем подключить приложение и получаем на номер телефона, привязанному к аккаунту вк из которого мы
создаём приложение, смс с кодом. Вводим его и переходим в следующее окно. В этом окне переходим в вкладку настройки.
В вкладке настройки мы видим поля с названием ID приложения и защитный ключ. Записываем куда нибудь эти данные. Больше ничего в вкладках я не делал.
Состояние приложения оставил в положении отключено. Жмём сохранить настройки. Всё, мы создали приложение вконтакте.
Получение токена (access_token) api вк
Что бы получить токен нам нужно создать ссылку определённого типа. С помощью этой ссылки мы отправим запрос серверу вк апи, в ответе сервера мы получим
нужный нам токен (access_token). Синтаксис построения ссылки.
https://oauth.vk.com/authorize?client_id=[ID приложения]&display=[вид окна]&redirect_uri=https://oauth.vk.com/blank.html&scope=[права приложения]&response_type=token&v=5.52
где:
client_id
– ID нашего приложения, полученный раньше.display
– вид окна, в котором будет происходить авторизация. Может быть page, popup, touch и wapscope
– права доступа нашего приложения относительно данных пользователя. О правах поподробнее ниже.
Права приложения вк относительно заданного пользователя могут задаваться в текстовом и цифровом виде. В текстовом это будет выглядеть так
scope=friends,messages,groups
. Этой строкой кода мы разрешили приложению vk доступ к друзьям, сообщениям и группам пользователя. Так же
права задаются и в цифровом виде. Для каждого правила есть битовая маска и сумма этих масок и будет разрешать приложению определённые действия. Например
право friends(+2), messages(+4096), groups(+262144), в итоге сумма битовых масок будет 266242 и код scope=266242
будет аналогом scope=friends,messages,groups
. Отдельное внимание хочу уделить праву offline
. Установка этого права делает получаемый нами
токен бесконечным. Если это право не задать через определённое время токен нужно будет получать снова. Подробнее о правах приложения вк можно почитать
здесь.
В итоге давайте составим адрес для получения токена приложению с правами доступа к друзьям, сообщениям и
группам пользователя, а так же с бессмертным токеном. Id приложения пусть будет 123456. Данный адрес будет выглядеть так:
https://oauth.vk.com/authorize?client_id=123456&display=page&redirect_uri=https://oauth.vk.com/blank.html&
scope=friends,messages,groups,offline&response_type=token&v=5.52
Вставляем данную ссылку в адресную строку браузера и переходим по ней. Нам открывается окно с подтверждением действия и заданными нами правами.
Подтверждаем действие и попадаем на страницу с предупреждением, из адресной строки браузера берём наш полученный токен. Это будет после #access_token=
,
код expires_in=0
говорит нам что токена (access_token) api вк бессмертный. Соответственно user_id=
это id пользователя, для которого
мы получили токен.
Зайдём в настройки аккаунта во вкладку настройки приложений и увидим наше приложение.
Теперь у нас всё готово для работы с апи вконтакте.
Примеры работы с api vk
Для работы с api вк я использую язык программирования php. Поэтому и примеры я буду приводить на php. Для того, что бы выполнить какое либо действие, нам
нужно послать запрос к api vk. Запрос мы можем послать и через адресную строку браузера. Тоесть запрос это есть определённый урл адрес с заданными в нём определёнными
параметрами. Синтаксис составления такого урл описан ниже.
https://api.vkontakte.ru/
method/[ВЫЗЫВАЕМЫЙ МЕТОД]?[ПАРАМЕТРЫ ВЫЗЫВАЕМОГО МЕТОДА]
Список методов api vk находится
здесь
.Больше пока заострять на этом внимания не будем, потом на реальных примерах
всё станет ясно. Осталось только разобраться как запрос к апи вконтакте отправить средствами php. Для этого будем использовать php функцию file_get_contents
, а так же
функцию json_decode
так как ответ от сервера мы получим в формате json. Вот шаблон выполнения запроса к вк на php.
$result=json_decode(file_get_contents('https://api.vkontakte.ru/ method/[ВЫЗЫВАЕМЫЙ МЕТОД]?[ПАРАМЕТРЫ ВЫЗЫВАЕМОГО МЕТОДА]'));
ну а теперь несколько примеров работы с апи vk
$userid=12345; $mytoken=56789; /*вернёт объект с значениями пола и дня рождения пользователя*/ $request_params = array( 'user_id' => $userid, 'fields' => 'sex', 'fields' => 'bdate' ); $get_params = http_build_query($request_params); $result = json_decode(file_get_contents('https://api.vk.com/method/users.get?'. $get_params)); /*проверка пользователя на бан вк*/ $request_params = array( 'user_id' => $user_id, 'fields' => 'deactivated' ); $get_params = http_build_query($request_params); $result = json_decode(file_get_contents('https://api.vk.com/method/users.get?'. $get_params)); if(isset($result->response[0]->deactivated)){ echo "Страница заморожена или удалена"; } /*отправим сообщение пользователю с user_id=222222*/ $mesage='Привет, как дела?'; //кодируем строку $msg=urlencode($mesage); $result = json_decode(file_get_contents('https://api.vkontakte.ru/method/ messages.send?user_id=222222& message='.$msg.'&access_token='.$mytoken)); /*приглосим в друзья пользователя с user_id=222222*/ $mesage='Давайте дружить'; $msg=urlencode($mesage); $result=json_decode(file_get_contents('https://api.vkontakte.ru/ method/friends.adduser_id=222222& text='.$msg.'&access_token='.$mytoken));
Методов у апи много, так что советую читать документацию. Конечно запросы не всегда выполняются правильно и возвращают коды ошибок. Ошибки можно посмотреть
здесь
. Так что вот так вот просто можно подключиться к api vk и автоматизировать свои действия в контакте.
30 мая 2018 г.
• 5 min read
VK.com предоставляет многофункциональный и удобный API, который позволяет делать всё, что приходит на ум программисту, и даже, немного больше.
API позволяет отправлять сообщения, получать и публиковать записи на стену, производить абсолютно любые действия, которые существуют в VK, от имени пользователя, кому был сгенерирован токен. Разобравшись с API на примере ВК, в будущем, вы безпроблемно сможете быстро вникать в API любых других сайтов. И, ввиду того, что 90% всех API имеют схожую реализацию, то понимание этой статьи будет для вас отличным стартом, и хорошей школой освоения “взрослых игрушек”.
В недавней статье было рассмотрено, что такое REST API. Почитайте информацию по ссылке – это точно будет полезно.
План
- Что такое VK API, разные группы API.
- Получение токена доступа
- Запросы к API (на примере получения всех записей пользователя со стены)
- Резюме
ВК-API блиц
ВК предоставляет несколько реализаций API:
- Streaming/Long Poll – позволяет получить данные в реальном времени. Сразу же, при обновлении данных в ВК, мы получаем актуальную информацию, без обновления страницы. Streaming и Long Poll реализуют разные подходы, но суть их одинаковая.
- Виджеты для сайта – здесь всё просто: скопировал код, без хитрых настроек, и у тебя рабочий виджет на сайте.
- Open API – работает на клиенте. Так же просто настраивается и используется. Преимуществом является то, что не обязательно иметь сервер для выполнения запросов. Будет работать в обычном HTML + JS.
- Callback API – позволяет получать данные от самомого ВК, не выполняя запрос. В случае обновления данных, ВК сам нам присылает новые данные. Например, пользователь подписался на нашу группу, и ВК, автоматически пришлёт информацию об этом пользователе нашему скрипту.
- REST API – позволяет взаимодействовать с данными ВК из скрипта. Позволяет автоматизировать любые пользовательские действия.
Для нас, как для программистов, на данном этапе – интересен REST API. Который позволяет взаимодействовать с пользователями, группами, рекламой, и прочими сущностями. Подробнее, обо всех доступных методах можно почитать здесь.
Для получение доступа к REST API, необходимо иметь специальный ключ vk api token
. Это уникальное значение, аналогично логину и паролю – идентифицирует пользователя, от имени которого выполняются запросы.
Как гласит 2 правило проектирования REST API – между запросами не должно сохраняться состояния. Система по определению не может использовать сессии, потому применение токена актуально для идентификации пользователя.
Как получить токен VK.COM
Получение токена состоит из двух частей: регистрации своего приложения и получение токена в этом приложении.
Создать приложение можно на странице. Указав название приложения, и выбрав его тип.
Я выбираю Standalone
, потому что тогда можно будет получить токены с бОльшим возможностями, чем в остальных вариантах (придётся поверить мне на слово, что это правда).
Создав приложение и перейдя на вкладку настроек, будет показано: id приложения, секретный ключ
Теперь, имея id приложения, можно получить токен доступа. Для этого нужно сформировать ссылку, подставив в неё id своего приложения.
https://oauth.vk.com/authorize?client_id={CLIENT_ID}&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends,notify,photos,wall,email,mail,groups,stats,offline&response_type=token&v=5.74
где вместо {CLIENT_ID}
нужно вставить id своего приложения.
а в параметре scope
– перечислены разрешения, которыми мы хотим наделить токен, список всех разрешений
Однако здесь, одним из самых важных разрешений является offline
, которое создаёт бессрочный токен, не имеющий ограниченного времени жизни.
Если вы не хотите создавать своё приложение, то можете получить токен по ссылке
Перейдя по сформированной ссылке, откроется диалоговое окно, в которому будут зачитаны права показаны разрешения, которыми наделяется токен (чем больше указано scope
свойств, тем больше будет этот список)
Подтвердив, произойдёт переадресация на страницу, в адресной строке которой будет access_token
, expires_in
равный нулю (что логично, учитывая, что мы указывали создание вечного токена)
Я сократил токен для сохранения читабельности. У вас он будет длиннее
Скопировав этот токен, можно делать первые запросы к API.
Как делать запросы к API
Сохраним полученный токен, потому как его нужно будет прикреплять к каждому запросу к VK API.
Для того, чтобы сделать запрос к API из PHP, нам нужна любая из доступных функций, способных совершить HTTP-запрос: file_get_contents, curl.
К слову, даже, если открыть в браузере сформированный адрес, то получим результат
Запрос к методам API состоит из шаблона: https://api.vk.com/method/{METHOD_NAME}?{PARAMETERS}&access_token={ACCESS_TOKEN}&v={V}
где {METHODNAME} – имя метода
{PARAMETERS} – параметры, индивидуальные, в зависимости от метода
{ACCESS_TOKEN} – ранее сохранённый токен
{V} – версия API (на момент написания статья = 5.78)
Зная всё это, сделаем первый запрос, на получение всех личных записей со стены. За стену отвечает сущность wall, а метод его get, который возвращает список всех записей со стены пользователя.
И, в итоге, имя метода будет сформировано в виде имени сущности (wall).имя метода (get)
– wall.get
Так, первая часть URL-адреса уже сформирована: https://api.vk.com/method/wall.get
Теперь нужно определиться с передаваемыми параметрами (PARAMS). Все доступные, обязательные параметры с описанием можно посмотреть на странице метода.
Я буду передавать owner_id
который соответствует id моего пользователя.
По факту же, это поле является необязательным в текущих условиях. Так как по умолчанию,
ownwer_id
будет проставлен id текущего пользователя.
И, можно было бы просто дописать в виде строки к существующему URL-адресу: …?owner_id=120159853
Однако, если туда добавлять множество новых параметров, то в таком виде добавлять не удобно. Потому, я создам массив параметров, где ключом будет название параметра, а значение, соответственно, его значение. А с помощью функции http_build_query() можно привести массив к виду строки нужного вида:
$params = [
'owner_id' => 120159853,
//params2 => 'value2',
];
http_build_query($params); //owner_id=120159853¶ms2=value2...
Теперь, осталось только собрать воедино все те части, которые были разобраны выше.
Для этого, можно написать такой код:
$method = 'wall.get';
$token = '38fa46d4c0c10bab105c760cc44ed373c0bc6a34405931f34c765ea';
$version = 5.78;
$params = http_build_query([
'owner_id' => 120159853,
'access_token' => $token,
'v' => $version
//...
]);
$url = "https://api.vk.com/method/{$method}?{$params}&access_token={$token}&v={$version}";
//https://api.vk.com/method/wall.get?owner_id=120159853&access_token=38fa46d4c0c10bab105c760cc44ed373c0bc6a34405931f34c765ea&v=5.78
При том, что даже токен и версию теперь можно вынести в массив $params
, для более централизованной записи.
Осталось последний шаг – выполнение http-запроса. И, принимая тот факт, что данные возвращаются в виде JSON, то, результат, нужно дополнительно обернуть в функцию json_decode
, которая приведёт JSON к обычному PHP-массиву. Вот так просто декодировать JSON.
$result = json_decode(file_get_contents($url), true);
В итоге, получаем обычный массив записей, который можем обработать как пожелаем
И, исходя из ответа выше, для получения записей выполним:
//все записи
$orders = $result['response']['items'];
//первая запись
$order = $result['response']['items'][0];
Резюме
Эта статья должна была показать вам, насколько просто пользоваться API, и какие преимущества открываются. Здесь было продемонстрировано, как получить токен vk, как делать запросы к vk api, на примере получения последних записей со стены пользователя.
И уже имея токен и полученные в этой статье знания – можете работать с любыми методами ВК. Удачи!
Хочу поделиться опытом, как я использовал Питона в одном из своих проектов по рекламе в VK. Для тех кто не в курсе, Питон — это такой язык программирования.
Данная статья может пригодиться тем, кто учится программировать на Питоне или занимается рекламой в VK.
Описание задачи и пути решения
Мне потребовалось найти VK-группы в заданном городе по нескольким ключевым словам, чтобы запустить на них рекламу. Эти группы нужно было где-то сохранить, чтобы не искать каждый раз по новой.
По каждой группе мне важна следующая информация:
- id — чтобы использовать в рекламе;
- name — чтобы оценить подходит группа или нет (Например, для ключевого слова «ремонт» может быть ремонт квартир или ремонт машин);
- members_count — чтобы оценить размер группы;
- contacts — чтобы получить список id пользователей, на которых не следует давать рекламу;
- группы должны быть отсортированы по отношению дневной посещаемости к количеству пользователей — чтобы не использовать группы, которые никто не посещает.
Сначала, я начал искать группы используя стандартный поиск. Но это оказалось очень не быстро. На пятой группе я призадумался о более быстром способе.
Более быстрый способ оказался VK API через браузер. В документации VK https://vk.com/dev/manuals подробно написано, как это делать.
В конечном итоге, я решил использовать VK API в Python, чтобы решать подобные задачи за секунды.
Как использовать VK API через браузер
Для работы с VK API через браузер, прежде всего, необходимо получить так называемый access_token.
Делается это очень просто. Нужно просто указанный ниже код вставить в адресную строку браузера.
https://oauth.vk.com/authorize?client_id=6478436&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.95
После успешной авторизации ваш браузер будет перенаправлен на другую страницу, а ключ доступа к VK API будет передан в качестве фрагмента URL-ссылки. Смотрите пример ниже. Ключ выделен жирным.
https://oauth.vk.com/blank.html#access_token=a8242171ff063622476fa7b3e0cc25690d698d8c92050e7918750e9083bcb0ed5c7ba2406eaee58ae73d6&expires_in=86400&user_id=133147577
Полученный ключ доступа следует сохранить в надёжном месте. Он будет использоваться при каждом запросе к методам API. Заменяйте ключ из примера своим ключом, чтобы всё работало.
Метод database.getCities
Этот метод я использовал, чтобы получить код (id) города, в котором искать нужные мне группы. Привожу для примера свой запрос. Вам нужно будет поменять ключ доступа access_token и город q на свой.
https://api.vk.com/method/database.getCities?v=5.55&access_token=a8242171ff063622476fa7b3e0cc25690d698d8c92050e7918750e9083bcb0ed5c7ba2406eaee58ae73d6&country_id=1&q=Балашиха
В случае успешного запроса будет выдан следующий ответ:
{«response»:{«count»:2,»items»:[{«id»:24,»title»:»Балашиха»,»area»:»Городской округ Балашиха район»,»region»:»Московская область»},{«id»:21613,»title»:»Железнодорожный (Балашиха)»,»area»:»Городской округ Балашиха район»,»region»:»Московская область»}]}}
Как видно из примера, id города равен 24. Будем использовать это номер в качестве параметра city_id при вызове следующего метода.
Метод groups.search
Этот метод я использовал, чтобы получить id групп соответствующих запросу по ключевому слову. В нижеприведённом примере нужно будет заменить аргументы access_token, city_id и q на соответствующие ваши.
https://api.vk.com/method/groups.search?v=5.95&access_token=a8242171ff063622476fa7b3e0cc25690d698d8c92050e7918750e9083bcb0ed5c7ba2406eaee58ae73d6&city_id=24&q=двери&sort=2&count=500
Успешный ответ может быть очень большим. Поэтому привожу его для примера в сокращенном виде.
{«response»:{«count»:8,»items»:[{«id»:147347745,»name»:»Установка дверей, ремонт балконов. Балашиха, ВАО»,»screen_name»:»club147347745″,»is_closed»:0,»type»:»group»,»photo_50″:»https://pp.userapi.com/c837325/v837325464/47b4c/GkASpGhOtM4.jpg?ava=1″,»photo_100″:»https://pp.userapi.com/c837325/v837325464/47b4b/SrZFgLWXXBU.jpg?ava=1″,»photo_200″:»https://pp.userapi.com/c837325/v837325464/47b4a/BrMPXrYAViI.jpg?ava=1″}, … ]}
Это пример выводе первой группы, а всего их может быть до 500. Группы сортируются по отношению дневной посещаемости к количеству пользователей (sort=2).
Ответ получен в формате json. Этот формат не очень удобен в данном случае. Поэтому его нужно преобразовать в формат csv. Для этого копируем текст ответа (Ctrl+A, Ctrl+C), и используем какой-нибудь онлайн-конвертер. Например, этот http://www.convertcsv.com/json-to-csv.htm.
Ответ вставляем в верхнее поле (Ctrl+V), как на рисунке ниже, и нажимаем кнопку «Convert JSON To CSV». Результат можно скачать с помощью кнопки «Download Result».
Открыть полученный файл можно с помощью Excel.
На данном этапе нас интересует только первый столбик id. Нам нужно получить его в виде значений разделённых запятыми, чтобы использовать затем в качестве аргумента при вызове следующего метода VK API.
Я получаю его следующим способом. Копирую все значения столбика id. Затем вставляю его в новый файл используя Вставить Как… с опцией «Транспонировать». То есть преобразую столбец таблицы в строку. Теперь сохраняю этот файл формате csv.
Полученный файл можно открыть с помощью Блокнота. Там будет текст следующего вида:
96779849,147347745,84074989,77485430,95963951,139751651,130165257,88654849
Данный текст мы копируем, чтобы использовать в качестве аргумента group_ids при вызове следующего метода.
Метод groups.getById
Этот метод я использовал, чтобы получить список групп города соответствующих запросу со всеми необходимыми по условию данными. Пример запроса ниже.
https://api.vk.com/method/groups.getById?v=5.95&fields=members_count,contacts&access_token=a8242171ff063622476fa7b3e0cc25690d698d8c92050e7918750e9083bcb0ed5c7ba2406eaee58ae73d6&group_ids=96779849,147347745,84074989,77485430,95963951,139751651,130165257,88654849
Ответ будет получен, как обычно, в формате json. Его нужно будет преобразовать в формат csv, способом описанным выше.
Для сохранения порядка сортировки групп по отношению дневной посещаемости к количеству пользователей, я в полученный csv-файл добавил столбец ‘sort2’ , в котором последовательно пронумеровал все строки. Образец файла ниже.
Использовать VK API для данной задачи, даже просто через браузер, гораздо быстрее, чем пользоваться стандартным поиском. Тем не менее, этот способ не самый быстрый. На поиск и анализ всех групп по всем запросам у меня ушло более двух часов.
Учитывая, что подобную задачу приходится решать практически в каждом проекте, было решено реализовать это с помощью программирования.
Как использовать VK API в Python
Реализация описанного выше алгоритма на Python-е оказалась проще, чем я ожидал. От начала программирования до рабочей версии программы прошло около 40 минут. Получается, если бы я сразу начал программировать, то всё получилось бы быстрее часа на два. Это даже несмотря на то, что пришлось тратить время на изучение самого языка.
Для реализации взял первую попавшуюся библиотеку для работы с VK в Python-е. Установил её следующей командой:
pip3 install vk --user
Ключ «—user» я использовал, чтобы избежать ошибок с разрешениями. У меня Linux, а ключ позволяет установить пакет только для текущего пользователя.
С самого начала была задача сделать как можно быстрее и проще, поэтому для реализации была выбрана консольная версия, где параметры задаются внутри кода. Таким образом, программа начинается с определения параметров.
# Параметры:
access_token = '3716eefa82841782e8d1093e01fb1eb89a00eaf089e849172a169d073b8e16565ab38edb43fe41d68dbad'
v = '5.95'
keyword_city = "Балашиха"
keywords_groups = ['ремонт', 'потолки', 'мебель', 'двери']
Code language: PHP (php)
Следующим этапом было подключиться к VK API. Тут всего две строчки, но на них я застрял минут на 20. Сразу не понял как работает библиотека. Здесь соответственно мой access_token нужно поменять на ваш.
# Подключение к VK API
session = vk.Session(access_token=access_token)
api = vk.API(session, v=v)
Code language: PHP (php)
Дальше просто идёт реализация алгоритма описанного выше. В конце я дам полный листинг программы. А по ходу просто буду пояснять отдельные моменты реализации.
Получение кода города:
# Запрос списка городов России (Cities) по ключевому слову
Cities = api.database.getCities(country_id=1, q=keyword_city)['items']
Code language: PHP (php)
Метод database.getCities возвращает Словарь (dict), в котором под ключом ‘items’ хранится список городов, которые соответствуют ключевому слову запроса. Обратите внимания, что переменной Cities я присваиваю уже этот список, а не весь Словарь.
Вот ещё интересная реализация получения списка id групп методом
groups.search:
# Получаем список IDs групп города удовлетворяющих ключевому слову
group_ids = [g['id'] for g in api.groups.search(city_id=city_id, q=keyword, sort=2, count=500)['items']]
Code language: PHP (php)
Эта конструкция называется «Генерация списка». Такое, по-моему есть только в Python-е. Схематично конструкция выглядит так:
>>> a = [i for i in range(1,15)]
>>> a
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
Очень мне понравилась эта конструкция. При реализации через браузер на эту операцию уходило больше всего времени. А тут одной строчкой. Классно!!!
Ещё мне понравилась реализация работы с csv-файлами методом DictWriter. Сначала задаётся заголовок…
# Задаём заголовок csv-файла
fieldnames = ['sort2', 'id', 'type', 'is_closed', 'screen_name', 'name', 'members_count', 'contacts', 'photo_50', 'photo_100', 'photo_200']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
Code language: PHP (php)
А затем целая группа сохраняется в файл одной строчкой:
writer.writerow(group)
Code language: CSS (css)
В целом, остальное должно быть понятно без слов. Просто привожу листинг.
Посмотреть код
import vk
import csv
# Как получить access_token:
# https://oauth.vk.com/authorize?client_id=6478436&display=page&redirect_uri=https://oauth.vk.com/blank.html&scope=friends&response_type=token&v=5.95
# Параметры:
access_token = '3716eefa82841782e8d1093e01fb1eb89a00eaf089e849172a169d073b8e16565ab38edb43fe41d68dbad'
v = '5.95'
keyword_city = "Балашиха"
keywords_groups = ['ремонт', 'потолки', 'мебель', 'двери']
# Подключение к VK API
session = vk.Session(access_token=access_token)
api = vk.API(session, v=v)
# Запрос списка городов России (Cities) по ключевому слову
Cities = api.database.getCities(country_id=1, q=keyword_city)['items']
# Выводим список городов по запросу на экран
for city in Cities:
print(city['id'], "t", city['region'], city['title'], city['area'])
# Поиск групп будет осуществляться только по первому городу из списка
city_id = Cities[0]['id']
city_name = Cities[0]['title']
# Начинаем поиск по каждому ключевому слову по очереди
for keyword in keywords_groups:
# Получаем список IDs групп города удовлетворяющих ключевому слову
group_ids = [g['id'] for g in api.groups.search(city_id=city_id, q=keyword, sort=2, count=500)['items']]
# Получаем список групп города удовлетворяющих ключевому слову
Groups = api.groups.getById(fields='members_count,contacts', group_ids=group_ids)
# Создаём csv-файл с группами 'Город - ключевое_слово.csv'
filename = city_name + " - " + keyword + ".csv"
f = open(filename, 'w')
# Задаём заголовок csv-файла
fieldnames = ['sort2', 'id', 'type', 'is_closed', 'screen_name', 'name', 'members_count', 'contacts', 'photo_50', 'photo_100', 'photo_200']
writer = csv.DictWriter(f, fieldnames=fieldnames)
writer.writeheader()
# Сохраняем список групп в соответствующий запросу csv-файл
i = 1
for group in Groups:
# Сохраняем порядок сортировки по отношению дневной посещаемости к количеству пользователей
group['sort2'] = i
writer.writerow(group)
i+=1
Code language: PHP (php)
Если что-то непонятно, то пишите в комментариях. Буду подробно отвечать
Пути развития программы
Программа полностью выполняет свою задачу. Но это не значить, что её нельзя сделать лучше. Я здесь вижу несколько направлений развития.
Классическое консольное приложение
Задавать параметры в коде программы вполне приемлемый способ для программиста. Однако, для простого пользователя — это слишком. Не мудрено ненароком испортить программу. Поэтому лучше реализовать передачу параметров через командную строку, как в классическом консольном приложении.
Контакты в отдельный файл
Контакты групп часто нужны, чтобы не показывать на них рекламу. Для этого нужно собрать id всех пользователей из контактов в отдельный файл. В текущей реализации это придётся делать вручную. Между тем добавить такой функционал совсем несложно и займёт минут 15.
Расширение функционала
По мере необходимости можно расширять функционал программы. Например, добавить возможность извлекать пользователей — членов групп и делать их пересечение. Строить списки пользователей, которые состоят в 2-х группах и тому подобное. Пока такой необходимости не было, но если понадобится, то дописать код будет гораздо быстрее, чем делать всё вручную.
Графический или WEB интерфейс
Если будет такой запрос, то можно добавить графический или веб интерфейс и обработку ошибок. Для своих внутренних нужд, я вряд ли буду это делать. Но, если будет такой запрос, то почему бы и нет.
***
Пишите в комментариях, какое ещё развитие программы вы хотели бы видеть.
Все исходники и описание размещены на GitHub https://github.com/deviur/vk_api_example