Как создать standalone приложение в вк
Предупреждаю сразу, статья не для новичков и некоторые моменты я пояснять не буду, так как статья получится очень длинной. Данными статьями я хочу лишь показать принцип работы с VK API и примеры кода. И конечно же код будет доступен на github.
Основная информация
- Standalone-приложение — это для мобильных клиентов, десктопных программ и сайтов на которых взаимодействие с API будет вестись из Javascript.
- Веб-сайт — если вы хотите написать скрипт для веб сайта, который будет использовать API указывайте этот вариант.
- IFrame/Flash приложение — игры в вконтакте и т.д.
Создание приложения
- Пользователь авторизирует учетную запись ВК в приложении.
- Получает специальный токен.
- Выполняет запросы к API.
Теперь нужно собственно написать код, который позволит нам взаимодействовать с API. Писать мы будем на PHP с подключением некоторых библиотек. Нам понадобится composer, если у вас не установлен, то можете скачать его перейдя по этой ссылке.
В папке проекта создаем файл composer.json и записываем в него следующее:
Сохраняем файл, открываем консоль и переходим в папку с нашим проектом в котором есть созданный нами файл. Выполняем команду composer install .
Этой командой мы установили мини фреймворк Slim, Bootstrap для быстрой верстки, пакет для работы с базой данных и шаблонизатор.
Структура приложения
Структура очень проста и включает в себя несколько файлов и папок.
Создаем файлы
public/index.php
В этом файле мы только запускаем наше приложение, все настройки будем производить в других файлах. Это наша точка входа.
app/app.php
Не пугайтесь, сложного нет ничего. Просто подключаем загрузчик, внедряем зависимость для применения Twig и подключаем файл с маршрутами.
app/routes.php
Маршрут для главной страницы и страницы авторизации.
Класс для работы с VK API
Я написал небольшой класс, который пока еще умеет только авторизировать пользователя.
Метод getLoginLink() генерирует ссылку для авторизации, метод getAccessToken() запрашивает токен для доступа и последний метод getAccountInfo() загружает информацию об авторизованом пользователе.
На этом логика приложения завершена и при авторизации пользователя мы получим в сессии массив с данным пользователя и можем отобразить это.
Поскольку я подключил Twig шаблонизатор, шаблоны у меня записываются в html файлы, но вы можете использовать и обычные php файлы или другой шаблонизатор.
Код файла для отображения информации.
Фреймворк slim очень хорошо подходит для создания небольших приложений и API для своих проектов, поэтому я его и использовал в этой статье и будем продолжать использовать далее. В следующей статье посмотрим как можно достать посты со стены в группе и обработать их.
Ссылка на репозиторий с кодом.
Всем привет! Сегодня я расскажу вам немного о Пайтоновском API для соц. сети ВКонтакте.
Пост предназначен в первую очередь для школьников начинающих разработчиков, которые хотят сделать простейшее приложение.
Поскольку я сама не особо сильна в Пайтоне, о различных аспектах этого прекраснейшего языка (ООП, функциональное программирование и т.д.) я умолчу.
Получение Python
Пайтоновскую виртуальную машину под винду вместе с небогатой средой разработки IDLE можно скачать здесь.
Не советую качать версию 3.5, ибо под ней некоторые модули (ещё не обновившиеся) могут не работать.
И если вы только начинаете знакомиться с этим языком, не советую также качать версии ниже третьей.
Если вы юзаете UNIX то должны сами знать где гуглить. Под Убунтой просто обновитесь (типа sudo apt-get update).
Также рекомендую поставить pip под вашу версию языка.
Получение модуля
В командной строке или терминале введите pip install vk (pip3 install vk)
Или можете воспользоваться этой ссылкой.
Также присутствует документация с примерами.
Что надо сделать ВКонтакте?
Тыкаем там на кнопку "Создать приложение"
Вводим имя и нажимаем "Подключить приложение". Тип оставляем Standalone.
После создания приложения заходим в его настройки и копируем (запоминаем) его идентификатор, он нам позже пригодится. На скриншоте ID закрашен другим цветом.
Дополнительно можно также загрузить свою иконку, поменять имя и т.д.
Авторизация
Теперь самое интересное. Нужно получить токен авторизации.
В принципе, модуль vk вполне работает и без него. Некоторые методы могут быть вызваны вообще без авторизации на сайте. Кроме того, вы можете в самом приложении авторизоваться через свой логин и пароль (как показано в этом примере).
В принципе, говоря по-хорошему, оба способа небезопасны. Так или иначе разработчик модуля может получить доступ к вашим данным -- токену или паре логин-пароль.
Прикол в том, что токен авторизации выдаётся конкретному приложению с конкретными правами доступа и конкретным ID. Т.е. в принципе, разрабу модуля он бесполезен.
А вот ваши данные авторизации могут быть вполне полезны. Потому я считаю что лучше юзать токен. По крайней мере, если у вас возникнут какие-то подозрения, не придётся менять пароль и засвеченную почту (номер телефона).
Ещё одним плюсом токена для параноиков является то, что он может быть выдан на определённый срок. В общем, юзайте лучше токены. Это немного сложнее, но безопаснее.
Как получить токен авторизации для Standalone-приложения описано здесь. Вам (или пользователю приложения) нужно перейти по ссылке определённого вида, авторизоваться ВКонтакте (если вы это ещё не сделали), в открывшемся фрейме внимательно прочесть какие разрешения запрашивает приложение, выдать приложению доступ, и из перенаправленной ссылки вытащить токен авторизации.
Вот пример ссылки:
Это запрос к сайту на выдачу токена авторизации для нашего Standalone-приложения. Разберём подробнее.
client_id= -- вместо подставьте ID вашего приложения.
scope=friends,photos ,audio,video,docs,notes,pages,status,wall,groups,messages,notifications,offline -- самое интересное. Это список запрашиваемых разрешений. Полный список возможных разрешений можно найти здесь.
Будьте крайне внимательны при составлении этого списка. Фактически, он определяет все возможности, доступные обладателю токена. Особо обратите внимание на последний параметр offline -- при его использовании будет выдан бессрочный токен авторизации.
После того, как юзер даст приложению доступ со страницы ВК, его перебросит на пустую страницу с URL вида
С некоторыми дополнительными параметрами. Для авторизации приложению необходим токен, стоящий в параметре access_token. Вам необходимо его вытащить.
После этого необходимо авторизоваться в самой программе. На сайте разработчика модуля приводится такой простой пример:
session = vk.Session(access_token='')
api = vk.API(session)
После этого у объекта api вы можете вызывать все методы, перечисленные на этой странице.
К примеру, написание первого поста:
api.wall.post(message = 'Hello, World!')
Приведёт к появлению на вашей стене текстового поста.
Лирическое отступление относительно токенов и добросовестности
Как видите, процедура получения токена довольно проста, а его наличие даёт практически неограниченный контроль над страницей пользователя (практически такой же, как и с веб-интерфейса).
Естественно, это накладывает определённые требования к добросовестности пользователей. Любой из вас может обмануть доверчивого друга или соседа, прислав ему ссылку и попросив скопировать ответ (хотя на странице-редиректе и стоит напоминание о том, что ссылку с токеном нельзя никому присылать) либо получив на короткое время доступ к незапароленному компьютеру.
Я искренне надеюсь что вы не станете так делать.
Написание простейшей программы с использованием API
Давайте напишем какую-нибудь полезную программу, использующую API ВКонтакте.
import time
import SendEmail
def searchForUser(user_list, ID):
\tfor user in user_list:
\t\tif type(user) is int:
\t\t\tcontinue
\t\tif user['uid'] == ID:
\t\t\treturn user['first_name'] + ' ' + user['last_name'] + '\n'
def checkMessages(message_list):
\tfor message in message_list:
\t\tif type(message) is int:
\t\t\tcontinue
\t\tif message['read_state'] == 0:
\t\t\tif 'chat_id' not in message:
\t\t\t\tIDS.append(str(message['uid']))
\tfor message in message_list:
\t\tif type(message) is int:
\t\t\tcontinue
\t\tif message['read_state'] == 0:
\t\t\tif 'chat_id' not in message:
\t\t\t\ttext = text + searchForUser(user_list, message['uid']) + message['body'] + '\n'
\treturn text
session = vk.Session(access_token = '')
api = vk.API(session)
\tmessage = api.messages.get(time_offset = 0)
\tif len(message) != 1 and message[1]['read_state'] == 0:
\t\tSendEmail.sendEMail(checkMessages(message))
\t\tprint('No new messages!')
\t\tSendEmail.sendEMail('No new messages!')
\t\ttime.sleep(600)
Разберём построчно что делает этот код.
Функция searchForUser(user_list, ID) ищет пользователя по его ID в списке user_list объектов user. Когда она его находит, то возвращает строку с именем и фамилией юзера. Проверка на тип сделана т.к. API ВКонтакте частенько возвращает первым элементом списка объектов длину этого списка.
И наконец основная часть программы. Сначала мы авторизуемся (токен можно записать прямо в Пайтоновский файл либо читать из текстового файла), затем в бесконечном цикле делаем следующее:
2) Если есть, то вытаскиваем функцией checkMessages(message_list) строку вида
Юзер Юзеров
Юзер Юзеров
Другой Юзер Юзеров
3) Вызовом time.sleep(600) ждём ещё 10 минут.
Если вы планируете писать своё приложение, обращайте также внимание на ограничения по частоте запросов к API (в конце страницы).
Всем спасибо за внимание, до новых встреч!
Хотел бы поделиться более удобной библиотекой для vk на python.
Это улучшенный fork той библиотеки что описывается в статье, где решены вопросы код дизайна, внесено множество исправлений, добавлено несколько дополнительных вкусных фич и упрощена работа в целом. Welcome =)
"Для авторизации приложению необходим токен, стоящий в параметре access_token. Вам необходимо его вытащить."
Извиняюсь за глупый вопрос, но как вытащить токен? Я просто из деревни
Если в 2018+ ты на этой странице, то вся информация устарела.
Спасибо, отличная статья. Как раз пишу бота на питоне
Тема интересная, спасибо. Оформление кода вырвиглазное, я страдал. Даже не знаю, что посоветовать, как вариант - кидать скрины из IDE, а в комментах прикреплять код для любителей копипасты.
Была подобная идея и для Spring'a сделать, тоже в виде API. Но все никак руки не доходят(((
Чувак, ты с хабром не перепутал сайты?
Как делают бумагу
Детский рассудок
Самые яркие воспоминания из детства
Старшему сыну 10 лет, спрашиваю:
- какое твое самое яркое воспоминание из прошлого.
- (вспоминал минуту) помню как по дороге из садика мы сидели на пенёчке
- это самое яркое?
- ну да, как в сказке, сидели отдыхали, болтали.
Спрашиваю это же у младшего, ему 6:
- помню как приезжал трактор убирать снег, и ты попросил его меня покатать.
Да уж. Аквапарки, аттракционы, крутые игрушки, дедморозы на НГ, а самые яркие у них трактор и пенёчек.
Решил вспомнить самое яркое из своего детства. В общественной бане потерял фигурку водолаза, разревелся, искали всей баней. Не нашли.
Попытка создания порно рассказа окончилась плачевно.
Однажды я решил написать порно рассказ. Взял тетрадь в клетку новую 96 листов. Ещё боялся что не хватит. Написал заголовок "горячее приключение Сальмы и Дороти".
Придумал первую сцену. Подрочил. Отложил пока рассказ.
Чуть позже вспомнил, придумал ещё немного подробнее первую сцену. Подрочил снова. И снова не написал ни строчки.
Как то так пошло, что тетрадку уже и брать не нужно было в руки, в итоге я решил что сначала все придумаю а потом быстро запишу.
Недавно разбирал древние раритеты, нашел свой школьный аттестат, детские рисунки. И эту тетрадь. Хорошая тетрадь, сейчас таких нет, вырвал аккуратно первый лист. Тетрадь отличная.
Здесь прекрасно всё.
Про душнил. И я такой же
7 лет назад жена с детьми ложится в детскую городскую больницу. У обоих детей (2 года и 4.5) температура, кашель. Подозрение на пневмонию. Увезли их по скорой ночью. Утром звоню жене, что надо привезти? А она мне - тёплые вещи. Тут холод собачий. Я прилетаю к больнице. Картина маслом: 16 октября, на улице температура по ночам к нулю сползает, всё гос, муп, обл и прочие организации уже отапливают, в квартиры начинают постепенно подавать тепло. Но в детском отделении городской больницы температура 12-13 градусов. И тут во мне включился "душнила". Я приехал на работу и сёл на телефон! Дежурный по городу, теплосети, водоканал, администрация города, администрация области, МЧС, облминздрав, Минздрав РФ и т.д. и т.п. вообщем я постарался сделать так, что бы все вокруг знали, что мои дети болеют и при этом они в холодной палате городской больницы. Часа через 2 мне позвонила жена. Спросила, до кого я дозвонился, не до В.В. ли случаем? Я не понял, о чем это она? А вот о чём - заведующая отделением, через коридор длинной метров 20 протянула удлинитель, затащила в палату обогреватель и со словами, ну теперь ты довольна? Фыркнула ещё что-то и ушла.
А ещё минут через 15 мне позвонил главврач больницы. Он мне рассказал, что у них авария на подающей трубе и от того, что я обзваниваю всех и вся ничего не изменится. И если я хочу помочь, то могу взять лопату и приехать откапывать трубу, которую прорвало.
Я ему тогда грубо на это ответил, и сейчас об этом сожалею, но черт побери, у моих детей в палате стало тепло. И если бы все из этого отделения повторили бы мои звонки, возможно трубу откопали бы быстрее и никто бы не мёрз.
В последнее время появляется огромное количество онлайн-сервисов, компьютерных или мобильных приложений, скриптов, которые предназначены для ВКонтакте, но для их работы необходимо пройти авторизацию через access_token.
Некоторые сервисы предоставляют возможности получить ключ доступа, который необходим для авторизации. На это уходит несколько секунд. Но как быть, если вы загрузили скрипт, но необходимого access_token ключа нет?
Краткая инструкция для получения токена сообщества
Заходим в настройки сообщества. (если у вас нет сообщества, значит его необходимо создать):
1. Работа с Api > 2. Получить ключ > 3. Скопируйте его (это ключ (токен) и есть access_token сообщества)
Вот и всё. А если же вам нужен токен пользователя, тогда вся необходимая информация находится ниже в статье.
Получить токен через приложение:
Где взять access_token?
Сегодня мы разберем то, как авторизоваться в ВКонтакте, используя прямую ссылку API ВКонтакте (на базе протокола OAuth) или, как его еще называют, Implicit flow. Авторизация, если вы используете этот метод, производится через приложение Вк, которое указывается как ID. Сегодня такой метод считается самым безопасным. Вы можете натолкнуться на статьи, в которых рассказывается о методах получения access_token с использованием приложений, которые вызывают (и не зря!) подозрение. Но сегодня мы поговорим о том, как авторизоваться через официальные приложения ВКонтакте.
Секрет получения токена – в переходе по ссылке, в которой содержится ID определенного приложения ВКонтакте.
Ссылка может быть следующего вида:
Если с этим разобрались, закономерно всплывает следующий вопрос: где взять эту самую ссылку?
Далее я расскажу о двух основных методах, которые позволят получить токен:
✅ Получение токена через собственное приложение.
Система попросит ввести название для приложения. Как пример, можете использовать «Получение access_token». Проверьте, если ли галочка «Standalone-приложение». Далее нажимайте на «Подключить приложение».
Чтобы подтвердить приложение, надо будет ввести код, который вам придет на указанный номер телефона. На этом этапе создания приложения можно зафиксировать мобильное устройство к странице Вк. Чтобы это сделать, надо кликнуть на «Привязать устройство». Можно и без привязки к аккаунту. Тогда просто необходимо перейти по ссылке «Подтвердить через SMS».
После того, как вы подтвердите регистрацию, откроется страница, на которой изложена информация о приложении, которое было создано. Нажмите на «Настройки», которые расположены в левом углу. Там расположен client_id – ID приложения ВКонтакте.
ID необходимо скопировать. Далее – вставьте в ссылку, заменив ID_ПРИЛОЖЕНИЯ. Получится как-то так:
5563738 – это ID приложения, которое вы создали. У вас получится похожая комбинация. После того как создали приложение перейдем к самому вопросу как получить access_token.
✅ Получение токена через официальное приложение VK.
Метод отличается от того, который был описан ранее, лишь тем, что вам не нужно создавать собственное приложение. Используйте уже созданное. Ему можно стопроцентно доверять.
Метод будет рассматривать на примере ВКонтакте для Android. ID такой: 2890984. Именно эту комбинацию надо подставить в ссылку.
На этом заканчивается часть статьи, в которой мы рассмотрели варианты идентификации приложения, которые могут быть использованы для авторизации. Осталось коснуться всего лишь нескольких моментов:
✅ Права доступа:
- В примерах, которые описаны выше, параметр scope содержит многие названия разделов социальной сети ВКонтакте: audio, photos, notify, friends. Это те разделы, которые будут открыты для приложения. Аccess_token может быть использован по-разному. ID, который вы используете, принадлежит доверенному приложению. Именно поэтому вы можете создать access_token, у которого есть все права доступа. Он становится универсальным, так что может быть использован везде.
✅ access_token:
Последний вопрос, которого надо коснуться, так это то, как получить непосредственно сам ключ access_token. После того, как вы получите ссылку (использовав один из методов), надо будет перейти по ней, чтобы открыть право доступа.
Уже после этого в вашей адресной строке появится необходимый ключ. Он копируется вручную: после access_token= и перед &expires_in.
В пятничном лонгриде проделаем большую работу: возьмём информацию по рекламным кампаниям ВКонтакте и сопоставим их с данными Google Analytics в Redash. Чтобы снова не поднимать сервер, будем передавать данные через Google Docs, используя Spreadsheet API.
Актуальную информацию о ключах можно посмотреть в статье «Получение ключа доступа»
Теперь копируем себе эту ссылку:
Но вместо YourClientID вставляем ID своего созданного приложения. В scope у этой ссылки только ads, так что с этим ключом можно будет получать только информацию о рекламном кабинете. Вставляем её в браузер и нас скидывает на другую страницу — в адресе этой странице будет указан ваш сгенерированный access token.
Срок жизни токена — 86400 секунд: ровно сутки. Чтобы получить токен без временных ограничений можно добавить в scope параметр offline. Если токен понадобилось отозвать — смените пароль от страницы или в настройках безопасности завершите активные сессии.
Зададим несколько константных значений: access token, ID рекламного кабинета и версию API ВКонтакте, которую будем использовать. Актуальной является версия 5.103.
За получение статистики по рекламе отвечает метод ads.getStatistics , но один из обязательных параметров при его вызове — ’ids’, ID рекламного объявления, статистику по которому мы хотим получить. Так как ID у нас пока нет, придётся сначала воспользоваться методов ads.getAds , который возвращает ID объявлений и кампаний.
Подробнее со всеми методами ВКонтакте API можно ознакомиться в документации
Библиотекой requests отправляем запрос к серверу и передаём свои параметры. Полученный ответ сразу переведём в формат json
Вот, как выглядит объект data : нам вернулся обычный список словарей, с которым мы уже имели дело в материале “Передаём и анализируем собранные данные по рекламным капманиям в Redash”.
Заполняем словарь ad_campaign_dict . Ключом будет ID объявления, а значением — ID кампании, к которой принадлежит объявление. Так будет удобнее присваивать к объявлению ID кампании, к которой оно принадлежало.
Вызывать getStatistics нужно отдельно для каждого объявления — будем делать это в итераторе по ad_campaign_dict . Отправляем запрос, передавая в ‘period’ значение ‘overall’ — берём данные за всё время. У некоторых объявлений могут отсутствовать данные по полю «Просмотры» или «Клики» если они не были запущены, и, потребовав их, мы словим KeyError — во избежание этого добавим обработчик try — except , который заставит скрипт не обращать внимания на эту ошибку.
Теперь сформируем из списков DataFrame и выведем первые 5 элементов:
После включения нас отправят на панель управления API. Жмём на «Создать учётные данные» — по ним будем проводить авторизацию в скрипте. Отмечаем, что используем Google Sheets API из веб-сервера и обращаемся к данным пользователя. Нажимаем на «Выбрать тип учётных данных» и создаем сервисный аккаунт. В поле «Роль» выбираем Проект — Редактор, а тип ключа оставим JSON.
После этого нам отправят файл в формате JSON с нашими учетными данными — назовём его «credentials.json» — и перенаправят на страницу с сервисными аккаунтами. Ниже будет поле с почтой — копируем её себе.
Закинем файл credentials.json в директорию со скриптом и продолжим писать код. Перечисляем область видимости в виде ссылок:
И при помощи библиотек oauth2client и gspread проводим авторизацию методами ServiceAccountCredentials.from_json_keyfile_name и gspread.authorize , указывая в параметрах первого наш файл и переменную scope. Через переменную sheet будем обращаться к нашему файлу в Google Docs.
Для ввода значений в ячейку таблички есть метод update_cell . Важно: нумерация индексов ячеек при обращении начинается не с нуля, а с единицы. Первым циклом пройдём по первой строке и перенесем туда заголовки нашего DataFrame. Во втором будем идти по каждой ячейке и вставлять соответствующие значения DataFrame. По умолчанию стоит ограничение — 100 запросов в 100 секунд. Это ограничение может остановить наш скрипт на полпути: чтобы избежать ошибки пропишем time.sleep , чтобы после каждой вставки скрипт секунду выжидал.
Если всё сделаем правильно — получим таблицу такого вида:
Экспорт данных в Redash
Подключение Google Analytics к Redash описано в статье «Как подключить Google Analytics как Redash?».
Имея в Redash таблицу с Google Analytics и рекламным кампаниям ВКонтакте, можем сопоставить их друг другу. Напишем такой запрос:
Итоги
Получилась таблица, сообщающая, сколько всего было затрачено на объявления в этот день, сколько человек его посмотрели, зашли к нам на сайт и стали нашими новыми пользователями.
Читайте также: