Совсем недавно на Хабре появилась статья о реализации дружеских связей в ВКонтакте с помощью Wolfram Mathematica. Идея мне понравилась, и, естественно, захотелось сделать такой же граф, используя Python и d3. Вот, что из этого получилось.
Внимание! В статье будут присутствовать части кода, описывая самые важные действия, но следует учесть, что проект претерпит еще не одно изменение в своей кодовой базе. Заинтересовавшиеся могут найти исходники на GitHub.
- Создание и авторизация приложения.
- Получение данных.
- Визуализация графа.
- Python 3.4
- requests
- d3
- Mozilla FireFox, так как в Chrome нельзя использовать XMLHttpRequest для загрузки локальных файлов (никто не мешает сделать python -m http.server 8000)
Создание и авторизация приложения
Чтобы получить доступ к API ВКонтакте, нам необходимо создать Standalone-приложение, после чего мы сможем использовать нужные нам методы API, которые будут описаны далее. Приложение создается здесь — выберем Standalone-приложение. Нас попросят ввести код-подтверждения, высланный на мобильный, после чего мы попадем на страницу управления приложением. На вкладке Настройки нам пригодится ID приложения для получения access_token.
VK API как получить Access Token, метод авторизации implicit flow и standalone приложение вконтакте
Далее нам надо авторизовать наше приложение. Этот процесс состоит из 3х этапов.
Аутентификации пользователя на сайте ВКонтакте
Для этого сформируем url, как показано ниже:
https://oauth.vk.com/authorize?client_id=IDприложенияredirect_uri=https://oauth.vk.com/blank.htmlv=5.21
PERMISSIONS – запрашиваемые права доступа приложения;
DISPLAY – внешний вид окна авторизации, поддерживаются: page, popup и mobile.
REDIRECT_URI – адрес, на который будет передан access_token.
API_VERSION – версия API, которую Вы используете.
В нашем случае PERMISSIONS — это доступ к друзьям и к API в любое время со стороннего сервера (бессрочный токен). Если адрес сформирован правильно, нам предложат ввести логин и пароль.
Разрешение доступа к своим данным
Далее разрешаем приложению доступ к необходимой информации:
Получение access_token
После авторизации приложения клиент будет перенаправлен на REDIRECT_URI. Нужная нам информация будет заключена в ссылке.
https://oauth.vk.com/blank.html#access_token=ACCESS_TOKENuser_id=USER_ID
Редактируем файл settings.py, вставляя туда полученные access_token и user_id. Теперь мы можем осуществлять запросы к API ВКонтакте.
Получение данных
Для начала разберем методы, которые будем использовать для данной цели.
Поскольку нужна хоть какая-то информация об id пользователя, по которому будет строиться граф, нам пригодиться users.get. Он принимает как один id, так и несколько, список полей, информация из которых нам необходима, а также падеж, в котором будет склоняться фамилия и имя. Мой метод base_info() получает список id и возвращает информацию о пользователе с фотографией.
АВТОРИЗАЦИЯ В АККАУНТЕ VK ЧЕРЕЗ PYTHON
def base_info(self, ids): «»»read https://vk.com/dev/users.get»»» r = requests.get(self.request_url(‘users.get’, ‘user_ids=%sUser deactivated») return r
Это может быть важно для тех, кто захочет отправлять в него id из friends.getMutual, таким образом произведя на свет огромное число запросов. Об этом позже.
Теперь нам надо получить информацию о друзьях пользователя, в чем нам и поможет метод friends.get. Из всех его параметров, перечисленных в документации, используем user_id, который находится в нашем setting.py и fields. Дополнительными полями будут id друзей, их имена, фамилии и фотографии. Ведь хочется, чтобы в узлах были миниатюры их фотографий.
def friends(self, id): «»» read https://vk.com/dev/friends.get Принимает идентификатор пользователя «»» r = requests.get(self.request_url(‘friends.get’, ‘user_id=%s “id»: API.friends.getMutual(), // * 25 . >;
Найдитесь те, кто напишет, как сократить данный код, не используя все время API.friends.getMutual.
Теперь нам надо всего лишь отправлять партиями id друзей по 25 в каждой. На нашем примере схема будет выглядеть так:
А ведь мы могли с помощью for отправлять каждого друга в friends.getMutual, а потом еще узнавать более детальную информацию через users.get.
Далее составим человеко понятную структуру, где уже вместо id друга и списка id ваших общих друзей, будет информация из friends.get. В итоге получим нечто вроде:
[(, [, ]),(, None)]
В словарях находится id, имя, фамилия, фото, в списках — словари общих друзей, если общих друзей нет, то None. Кортежами все это разделяется.
def common_friends(self): «»» read https://vk.com/dev/friends.getMutual and read https://vk.com/dev/execute Возвращает в словаре кортежи с инфой о цели и списком общих друзей с инфой «»» def parts(lst, n=25): «»» разбиваем список на части — по 25 в каждой «»» return [lst[i:i + n] for i in iter(range(0, len(lst), n))] result = [] for i in parts(list(self.all_friends.keys())): # Формируем code (параметр execute) code = ‘return ),’ % (id, self.my_id, id)) code = ‘%s%s’ % (code, ‘>;’) for key, val in requests.get(self.request_url(‘execute’, ‘code=%s’ % code)).json()[‘response’].items(): if int(key) in list(self.all_friends.keys()): # берем инфу из уже полного списка result.append((self.all_friends[int(key)], [self.all_friends[int(i)] for i in val] if val else None)) return result
Итак, если хочется посмотреть свой список друзей и общих с ними друзей, запускаем:
python main.py
Визуализация графа
Выбор пал на d3, а именно на Curved Links. Для этого надо сгенерировать json, который будет примерно такого содержания:
< «nodes»: [ , , ], «links»:[ , ] >
Немного видоизменяя index.html, узлами становятся фотографии друзей.
Если хочется сразу визуализировать граф:
python 2d3.py
В папке web появится файл miserables.json. Не забываем открывать index.html в Mozilla FireFox или используем python -m http.server 8000 и открываем в Chrome.
Визуализация подтормаживает при большом количестве друзей, поэтому на будущее я думаю об использовании WebGL.
Так выглядит граф дружеских связей одного из моих друзей. Связи — это все.
Конечно, мне было интересно, у кого работает быстрее.
В статье, которая меня вдохновила, написано:
На моих 333 друзьях это заняло 119 секунд.
На момент написания этой статьи, у Himura в ВКонтакте был 321 друг. У меня это заняло 9 секунд (работа всей программы, а не одного friends.getMutual).
В заключение
Всю необходимую информацию об использованных методах можно найти в щедро написанной документации ВКонтакте, однако мной была обнаружена пара ошибок: не была описана ошибка с кодом 15 (‘error_msg’: ‘Access denied: user deactivated’, ‘error_code’: 15), догадаться можно, что она значит, и uid вместо user_id в документации к методу friends.get. Спустя 2 дня:
Как говорилось вначале, проект можно найти на GitHub, буду рад, если он понравится ещё кому-то и я получу много вкусных пулл реквестов…
UPD (27.05.2014):
Как мне подсказал WTFRU7, я добавил возможность использования хранимых процедур. Для этого нужно перейти по ссылке.
Создаем хранимую процедуру getMutual. Копируем содержимое execute_getMutual.js в форму и сохраняем. Не забываем скачать более новую версию. Финальный вид нашей схемы будет таким:
UPD (16.06.2014):
Получаем бессрочный токен.
UPD (11.07.2014):
Добавлены схемы-пояснения.
UPD (14.11.2014):
Продолжение
- Python
- Программирование
Источник: habr.com
VK API. Авторизация для сайта
Для того, чтобы не писать сильно большую статью я сократил код лишь до необходимого минимума. Т.е. никаких проверок, мощных фильтров на ошибки и прочего. Только то, что непосредственно необходимо для авторизации, для понимания происходящего. Так же, статья рассчитана, что вы обладаете хотя-бы базовыми знаниями PHP и HTML. Подробно будут описаны только функции и приёмы которые очень редко встречаются.
- Создаём приложение на офф сайте вк
- Получаем его ID
- Делаем на сайте ссылку, в которой отправляем запрос вк-серверу
- Получаем code в ответ
- Делаем ещё один запрос, в котором вставляем ид приложения, защищенный ключ и как раз этот code
- Получаем access_token, нужный для дальнейшего использования API. С этого момента можно считать, что пользователь авторизован. Неверному пользователю токен не дают
- .
- профит. 11
Всё просто. Ставим тычинку напротив веб-сайта и заполняем инфу.
Да, серьёзно, локальные хосты (localhost) тоже можно указывать и они работают вполне исправно.
После создания, всё что необходимо, это открыть настройки приложения и скопировать id приложения и защищенный ключ куда-нибудь. Вскоре они нам понадобятся.
Следующим шагом можно приступить к части кода. Я создам новый файл с ссылкой, пускай это будет authreg.php . Так же, я создам другой файл, который будет обрабатывать всё остальное. Назову его auth_vk.php .
Открываем authreg.php . В нём будет лежать просто ссылка.
Всё. Этот файл более нам не понадобится.
В этом примере я сохраню всё авторизационные данные в сессии. Вы же можете сделать иначе.
Первым делом я открою небольшое условие на проверку пришедшего к нам в GET от сервера ВК значения code.
Следом мы отправим серверу ВК пришедшее значение code + защищенный ключ и id приложения чтобы получить access_token , а так же сразу его используем, получив имя и фамилию того, кто у нас нажал на кнопку. Запишем в сессию весь результат и отправим пользователя на другую страницу сайта. На практике я бы порекомендовал доработать этот скрипт и записать нового пользователя в бд и так далее.
https://api.vk.com/method/»’METHOD_NAME»’?»’PARAMETERS»’ echo ‘access token = ‘.$_SESSION[‘access_token’].’
‘; echo ‘username = ‘.$_SESSION[‘name’].’
‘; echo ‘name family = ‘.$_SESSION[‘name_family’].’
‘; ?>
Набросал на скорую руку. При каких-то ошибках или вдруг потребуются подробности — пишите в этой теме, отвечу как только смогу.
Источник: evilcoder.ru
VK — получение серверного токена
Для использования многих методов api vk вам понадобиться токен с определенными правами доступа, а если вы хотите чтобы это методы сайт использовал без вашего участия, то вам понадобиться Implicit Flow токен. Именно о простом способе получения такого токена мы и поговорим.
Если вы не хотите использовать инстумент на моем сайте вы можете скачать его исходный код на gist.github.com и использовать локально или на своем сайте.
Разумеется для для многих методов api, таких как долбления на стену существую различные онлайн сервисы или другие способы, но всегда приятно иметь что-то свое, да и гибкости у своего решения всегда будет больше.
Для использования сервером методов api нам понадобиться Standalone-приложение vk. Для людей не работавших с api и ни разу не создававших подобные приложения, начнем с самого начала, а именно с создания приложения.
Если же вы уже знаете как это делать сразу переходите к инструкции по использованию инструмента
Создание и настройка Standalone-приложения vk
Шаг Первый
Заходим на сайт vk.com/dev в раздел Мои приложения и нажимаем Создать приложение .
Вписывайте любое название, выбираете Standalone-приложение и нажимаете на кнопку «Подключить приложение».
Важно: после создания приложения сменить его тип у вас не получиться, поэтому зразу создавайте Standalone-приложение
Шаг второй
Перейдите в настройки приложения.
В настройках
- Состояние: Приложение включено и видно всем ( если будете взаимодейстовать с пользователями)
- Open API: Влючен (если нужна авторизация на сайте)
- Адрес сайта: главная страница сайта [https://www.mysite.com] (если включен Open API)
- Базовый домен: ваш домен без всего [mysite.com] (если включен Open API)
Не забудьте нажать на «Сохранить изменения»
С настройками приложения разобрались переходим к использованию инструмента.
Инструкции по использованию инструмента
Новая версия инструмента очень легка в использовании и практически не требует инструкции.
Шаг Первый
Шаг второй
Заполняется форму
- ID приложения — id вашего приложения ( можно посмотреть в настройках приложения )
- Права доступа — Необходимые вам правда доступа
Совет лучше создавать вечный токен, выбрав в правах offline
Нажимаем на кнопку Получить токен
Шаг третий
Если вы заполнили форму правильно, то после нажатия на кнопку Получить токен откроется окно oauth.vk.com, где вас попросят подтвердить получаемые права.
Если права в списке правильные, то нажимайте кнопку разрешить.
Если все прошло успешно то после нажатия на кнопку «разрешить» вас пренаправить на страницу https://oauth.vk.com/blank.html#access_token=XXXXXXuser_id=0000000
Шаг четвертый
Теперь вам необходимо скопировать из адресной значение access_token (XXXXX) — это и есть ваш токен
Не забудьте сохранить, куда нибудь ваш токен, ну а если даже вы его потеряете, теперь у вас есть отличный инструмент чтобы быстро и без труда получить его вновь.
Инструмент получения токена для api vk.com
ID приложения *
Права доступа *
- notify
Пользователь разрешил отправлять ему уведомления (для flash/iframe-приложений). - friends
Доступ к друзьям. - photos
Доступ к фотографиям. - audio
Доступ к аудиозаписям. - video
Доступ к видеозаписям. - stories
Доступ к историям. - pages
Доступ к wiki-страницам. - status
Доступ к статусу пользователя. - notes
Доступ к заметкам пользователя. - messages
Доступ к расширенным методам работы с сообщениями (только для приложений, прошедших модерацию). - wall
Доступ к обычным и расширенным методам работы со стеной. - ads
Доступ к расширенным методам работы с рекламным API. - offline
Доступ к API в любое время (при использовании этой опции параметр expires_in, возвращаемый вместе с access_token, содержит 0 — токен бессрочный). - docs
Доступ к документам. - groups
Доступ к группам пользователя. - notifications
Доступ к оповещениям об ответах пользователю. - stats
Доступ к статистике групп и приложений пользователя, администратором которых он является. - email
Доступ к email пользователя. - market
Доступ к товарам.
Источник: septdir.ru