Vk api python пример

Хочу поделиться опытом, как я использовал Питона в одном из своих проектов по рекламе в 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.

Делается это очень просто. Нужно просто указанный ниже код вставить в адресную строку браузера.

После успешной авторизации ваш браузер будет перенаправлен на другую страницу, а ключ доступа к VK API будет передан в качестве фрагмента URL-ссылки. Смотрите пример ниже. Ключ выделен жирным.

Полученный ключ доступа следует сохранить в надёжном месте. Он будет использоваться при каждом запросе к методам API. Заменяйте ключ из примера своим ключом, чтобы всё работало.

Метод database.getCities

Этот метод я использовал, чтобы получить код ( >

В случае успешного запроса будет выдан следующий ответ:

Как видно из примера, id города равен 24. Будем использовать это номер в качестве параметра city_id при вызове следующего метода.

Метод groups.search

Этот метод я использовал, чтобы получить >

Успешный ответ может быть очень большим. Поэтому привожу его для примера в сокращенном виде.

Это пример выводе первой группы, а всего их может быть до 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.

Полученный файл можно открыть с помощью Блокнота. Там будет текст следующего вида:

Данный текст мы копируем, чтобы использовать в качестве аргумента group_ids при вызове следующего метода.

Метод groups.getById

Этот метод я использовал, чтобы получить список групп города соответствующих запросу со всеми необходимыми по условию данными. Пример запроса ниже.

Ответ будет получен, как обычно, в формате json. Его нужно будет преобразовать в формат csv, способом описанным выше.

Для сохранения порядка сортировки групп по отношению дневной посещаемости к количеству пользователей, я в полученный csv-файл добавил столбец ‘sort2’ , в котором последовательно пронумеровал все строки. Образец файла ниже.

sort2 id type is_closed screen_name name members_count contacts
1 147347745 group club147347745 Установка дверей, ремонт балконов. Балашиха, ВАО 218 [<‘user_id’: 308576095>]
2 96779849 group bastionsdoors Стальные двери Бастион-C 2653 [<‘user_id’: 397896396, ‘phone’: ‘+74955057080′, ’email’: ‘dveri@bastion-s.ru’, ‘desc’: ‘Менеджер-консультант ‘>, <‘user_id’: 237109628, ‘desc’: ‘Дизайнер ‘>]
3 84074989 group timartdvery Двери Надмосковья 782 [<‘phone’: ‘8 925 555 40 30 ‘, ’email’: ‘mail@timartdoors.ru’>, <‘phone’: ‘8 916 562 99 25′, ’email’: ‘mail@timartdoors.ru’>]
4 77485430 page dveriarmada Двери Армада. Выбираем правильно! 111 [<‘user_id’: 16257595, ‘phone’: ‘+74951351374′, ’email’: ‘Info@zavod-armada.ru’, ‘desc’: ‘Эксперт/Заявка на выезд мастера/Промо-код Юлин’>]
5 95963951 group club95963951 Межкомнатные и металлические двери.СТРОЙВЕСТ. 2588 [<‘user_id’: 26986762>]
6 139751651 group dveri_v_balashihe Межкомнатные двери в Балашихе 71 [<‘user_id’: 307843491>, <‘user_id’: 247429000>]
7 130165257 group dverin1 Мир дверей 26 [<‘user_id’: 205312602>]
8 88654849 group club88654849 BARIER-HOUSE стальные двери в Москве 15 [<‘user_id’: 278636008>]
Читайте также:  Как подключиться к чужой камере компьютера

Учитывая, что подобную задачу приходится решать практически в каждом проекте, было решено реализовать это с помощью программирования.

Как использовать VK API в Python

Реализация описанного выше алгоритма на Python-е оказалась проще, чем я ожидал. От начала программирования до рабочей версии программы прошло около 40 минут. Получается, если бы я сразу начал программировать, то всё получилось бы быстрее часа на два. Это даже несмотря на то, что пришлось тратить время на изучение самого языка.

Для реализации взял первую попавшуюся библиотеку для работы с VK в Python-е. Установил её следующей командой:

Ключ «—user» я использовал, чтобы избежать ошибок с разрешениями. У меня Linux, а ключ позволяет установить пакет только для текущего пользователя.

С самого начала была задача сделать как можно быстрее и проще, поэтому для реализации была выбрана консольная версия, где параметры задаются внутри кода. Таким образом, программа начинается с определения параметров.

Следующим этапом было подключиться к VK API. Тут всего две строчки, но на них я застрял минут на 20. Сразу не понял как работает библиотека. Здесь соответственно мой access_token нужно поменять на ваш.

Дальше просто идёт реализация алгоритма описанного выше. В конце я дам полный листинг программы. А по ходу просто буду пояснять отдельные моменты реализации.

Получение кода города:

Метод database.getCities возвращает Словарь (dict), в котором под ключом ‘items’ хранится список городов, которые соответствуют ключевому слову запроса. Обратите внимания, что переменной Cities я присваиваю уже этот список, а не весь Словарь.

Вот ещё интересная реализация получения списка id групп методом
groups.search:

Эта конструкция называется «Генерация списка». Такое, по-моему есть только в Python-е. Схематично конструкция выглядит так:

Очень мне понравилась эта конструкция. При реализации через браузер на эту операцию уходило больше всего времени. А тут одной строчкой. Классно.

Ещё мне понравилась реализация работы с csv-файлами методом DictWriter. Сначала задаётся заголовок…

А затем целая группа сохраняется в файл одной строчкой:

В целом, остальное должно быть понятно без слов. Просто привожу листинг.

Если что-то непонятно, то пишите в комментариях. Буду подробно отвечать

Пути развития программы

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

Классическое консольное приложение

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

Контакты в отдельный файл

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

Расширение функционала

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

Графический или WEB интерфейс

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

Пишите в комментариях, какое ещё развитие программы вы хотели бы видеть.

Всем привет! Сегодня я расскажу вам немного о Пайтоновском API для соц. сети ВКонтакте.

Пост предназначен в первую очередь для школьников начинающих разработчиков, которые хотят сделать простейшее приложение.

Поскольку я сама не особо сильна в Пайтоне, о различных аспектах этого прекраснейшего языка (ООП, функциональное программирование и т.д.) я умолчу.

Читайте также:  Что значит sbol moscow в сбербанке

Пайтоновскую виртуальную машину под винду вместе с небогатой средой разработки IDLE можно скачать здесь.

Не советую качать версию 3.5, ибо под ней некоторые модули (ещё не обновившиеся) могут не работать.

И если вы только начинаете знакомиться с этим языком, не советую также качать версии ниже третьей.

Если вы юзаете UNIX то должны сами знать где гуглить. Под Убунтой просто обновитесь (типа sudo apt-get update).

Также рекомендую поставить pip под вашу версию языка.

В командной строке или терминале введите pip install vk (pip3 install vk)

Или можете воспользоваться этой ссылкой.

Также присутствует документация с примерами.

Что надо сделать ВКонтакте?

Тыкаем там на кнопку "Создать приложение"

Вводим имя и нажимаем "Подключить приложение". Тип оставляем Standalone.

После создания приложения заходим в его настройки и копируем (запоминаем) его идентификатор, он нам позже пригодится. На скриншоте ID закрашен другим цветом.

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

Теперь самое интересное. Нужно получить токен авторизации.

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

В принципе, говоря по-хорошему, оба способа небезопасны. Так или иначе разработчик модуля может получить доступ к вашим данным — токену или паре логин-пароль.

Прикол в том, что токен авторизации выдаётся конкретному приложению с конкретными правами доступа и конкретным ID. Т.е. в принципе, разрабу модуля он бесполезен.

А вот ваши данные авторизации могут быть вполне полезны. Потому я считаю что лучше юзать токен. По крайней мере, если у вас возникнут какие-то подозрения, не придётся менять пароль и засвеченную почту (номер телефона).

Ещё одним плюсом токена для параноиков является то, что он может быть выдан на определённый срок. В общем, юзайте лучше токены. Это немного сложнее, но безопаснее.

Как получить токен авторизации для Standalone-приложения описано здесь. Вам (или пользователю приложения) нужно перейти по ссылке определённого вида, авторизоваться ВКонтакте (если вы это ещё не сделали), в открывшемся фрейме внимательно прочесть какие разрешения запрашивает приложение, выдать приложению доступ, и из перенаправленной ссылки вытащить токен авторизации.

Вот пример ссылки:

Это запрос к сайту на выдачу токена авторизации для нашего Standalone-приложения. Разберём подробнее.

redirect_uri=https://oauth.vk.com/blank.html — в случае Standalone-приложений ВКонтакте обязывает использовать именно такой адрес перенаправления.

scope=friends,photos ,audio,video,docs,notes,pages,status,wall,groups,messages,notifications,offline — самое интересное. Это список запрашиваемых разрешений. Полный список возможных разрешений можно найти здесь.

Будьте крайне внимательны при составлении этого списка. Фактически, он определяет все возможности, доступные обладателю токена. Особо обратите внимание на последний параметр offline — при его использовании будет выдан бессрочный токен авторизации.

После того, как юзер даст приложению доступ со страницы ВК, его перебросит на пустую страницу с URL вида

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

После этого необходимо авторизоваться в самой программе. На сайте разработчика модуля приводится такой простой пример:

После этого у объекта api вы можете вызывать все методы, перечисленные на этой странице.

К примеру, написание первого поста:

api.wall.post(message = ‘Hello, World!’)

Приведёт к появлению на вашей стене текстового поста.

Лирическое отступление относительно токенов и добросовестности

Как видите, процедура получения токена довольно проста, а его наличие даёт практически неограниченный контроль над страницей пользователя (практически такой же, как и с веб-интерфейса).

Естественно, это накладывает определённые требования к добросовестности пользователей. Любой из вас может обмануть доверчивого друга или соседа, прислав ему ссылку и попросив скопировать ответ (хотя на странице-редиректе и стоит напоминание о том, что ссылку с токеном нельзя никому присылать) либо получив на короткое время доступ к незапароленному компьютеру.

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

Я искренне надеюсь что вы не станете так делать.

Написание простейшей программы с использованием API

Давайте напишем какую-нибудь полезную программу, использующую API ВКонтакте.

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

def searchForUser(user_list, ID):

for user in user_list:

if type(user) is int:

return user[‘first_name’] + ‘ ‘ + user[‘last_name’] + ‘

Читайте также:  Муж подарил жене цветы

for message in message_list:

if type(message) is int:

if ‘chat_id’ not in message:

user_list = api.users.get(user_ .join(IDS))

for message in message_list:

if type(message) is int:

if message[‘read_state’] == 0:

if ‘chat_id’ not in message:

text = text + searchForUser(user_list, message[‘uid’]) + message[‘body’] + ‘

text = text + ‘Сообщение из чата
‘ + message[‘body’] + ‘

message = api.messages.get(time_offset = 0)

if len(message) != 1 and message[1][‘read_state’] == 0:

print(‘No new messages!’)

SendEmail.sendEMail(‘No new messages!’)

Разберём построчно что делает этот код.

В первых трёх строчках мы импортируем необходимые нам модули. Модуль time используется для того, чтобы отправлять процесс в сон. Модуль SendEmail — это пользовательский модуль, предназначенный для отправки сообщений на определённый ящик.

Функция searchForUser(user_list, ID) ищет пользователя по его ID в списке user_list объектов user. Когда она его находит, то возвращает строку с именем и фамилией юзера. Проверка на тип сделана т.к. API ВКонтакте частенько возвращает первым элементом списка объектов длину этого списка.

Фунция checkMessages(message_list) просматривает список сообщений (опять же, пропуская элемент списка, содержащий число сообщений в списке) и формирует список из ID тех юзеров, сообщения которых ещё не прочитаны. Далее по этому списку ID у API запрашивается список юзеров. И наконец потом формируется единая строка, в которой через строчку указан отправитель (полученный функцией searchForUser(user_list, ID)) и текст его сообщения.

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

И наконец основная часть программы. Сначала мы авторизуемся (токен можно записать прямо в Пайтоновский файл либо читать из текстового файла), затем в бесконечном цикле делаем следующее:

1) Проверяем, есть ли сообщения и прочтено ли последнее сообщение

2) Если есть, то вытаскиваем функцией checkMessages(message_list) строку вида

Сообщение от юзера 1

Сообщение от юзера 2

Другой Юзер Юзеров

Сообщение от юзера 1

И отправляем её себе на Email функцией SendEmail.sendEMail(text). Вместо отправки на почту можно выводить сообщение в консоль или записывать в файл.

2а) Если сообщений не было, то отправляем уведомление об этом (его цель, в основном, дать вам понять что программа не вылетела из-за какого-нибудь эксепшена).

3) Вызовом time.sleep(600) ждём ещё 10 минут.

Естественно, эта простенькая программа не является верхом совершенства. Изредка вызов API может приводить к поднятию эксепшена, что в данном случае попросту валит всю программу. Кроме того, приложение никак не запоминает что оно уже отправило вам уведомление о неких сообщениях, т.е. если вы не прочтёте новые сообщения, оно вас снова уведомит. И снова. И так до тех пор, пока в очередном вызове не вылетит эксепшен.

Если вы планируете писать своё приложение, обращайте также внимание на ограничения по частоте запросов к API (в конце страницы).

Не смотря на то, что Python вышел на 1-е место для обучения программированию в университетах США, в российском сегменте всемирной паутины найти новую статью по Python, особенно 3 версии, практически невозможно( В основном все более-менее грамотные статьи исключительно на Хабре). Библиотека для питона поддерживающая API ВК существует около 2х лет, но найти подробную статью мне так и не удалось. Постараюсь исправить это недоразумение, если заинтересовал — приглашаю под кат.

Начнём с самого главного — с установки
Для удобства работы с API создадим ВК-приложение

Открываем VK, переходим на вкладку «приложения», заходим во вкладку «управление» и нажимаем кнопку «создать приложение»
.
Для работы нам понадобится ID приложения, его можно найти во вкладке «настройки».

Напишем простейший «Hello, world»

Теперь разберём код построчно:

подключаем модуль vk
выполняем вход ВК
это самое интересное, для работы со стеной вк, приложение должно иметь права wall.О том как их получить подробно написанно здесь. Чтобы наше приложение заработало, скопируйте полученный access_token в строчку s
в результате выполнения этого кода, на вашей стене появится надпись Hello, world

Примеры

Приведу ещё несколько примеров. Часть из них размещена на странице модуля.

Получаем фамилию и имя пользователя с указанным ID.

Получаем записи со стены сообщества Вконтакте API в количестве одной штуки.

В заключение приведу несколько полезных ссылок:

Cпасибо за внимание.

Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.