Тарифы Услуги Сим-карты

H Анализ дружеских связей VK с помощью Python Из песочницы

Привет, Хабралюди!

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

Как построить сеть своих друзей?
1. Проверьте что браузер поддерживает WebGL: get.webgl.org - должен быть кубик. Если кубика нет - попробуйте другой браузер. Часто хром/лис блокируют видеокарты с устаревшими драйверами. Увы, кубик - это ключ к успешной визуализации:).

2. Зайти на www.yasiv.com/vk - это визуализация ваших друзей на ВК.

Почему синие квадраты вместо аватарок?
У WebGL есть очень строгие ограничения на картинки, используемые в текстурах. Если они приходят из другого домена, сервер с картинками должен разрешить их кросс-доменное использование. Исправляется добавлением в заголовок ответа с картинкой Access-Control-Allow-Origin:* , но увы, ВКонтакте этого пока не поддерживает. Если вы, читатель, являетесь сотрудником ВКонтакте, и имеете доступ к коду - добавьте, пожалуйста хедер. Я вам спасибо огромное скажу, и визуализацию подправлю:).
Почему WebGL?
Ни CSS, ни SVG, ни даже простой canvas 2D не сравнятся с производительностью WebGL. vivagraph.js поддерживает SVG и CSS, но в обоих случаях основным тормозом визуализации является браузерный код отрисовки элементов. Лишь с использованием WebGL ботлнек перемещается в мой алгоритм укладки:).
Маленький Мир
Помните историю о шести рукопожатиях ? Недавний анализ полной сети Фейсбука вывел число 4.7. Я забавы ради начал достраивать сеть от мало знакомого мне друга в неизвестность и такая картина наблюдалась очень часто:
Что скажете?
Мне очень-очень важны ваши отзывы и предложения. Это всего лишь мое хобби, но я очень люблю его. Понимаю, что все еще сыровато, и на огромных графах (больше 2000 узлов) все работает слишком медленно. Но вместо того, чтобы пытаться сделать все правильно с первого раза, я хотел бы спросить у вас, что бы вы посоветовали сделать лучше? Ну и буду очень рад, если присоединитесь к

Социальный граф VK June 22nd, 2012

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

Чтобы понять, какие области к чему относятся, я выделил основные из них:

Центральный и наиболее многочисленный кластер — это факультет математики Волгоградского Гос Университета, что логично, родной факультет ведь. Справа от него отдельно выделяется физический факультет, что обусловлено двумя причинами:

  • Часть моего первого факультета информационных технологий вошла в состав физфака (другая, соответственно, в состав матфака), и большинство связей — оттуда;
  • У нас с физфаком был общий отдельный учебный корпус.

Чуть ниже выделил группу Бизнес-Информатики в ВолГУ — свою родную группу. Интересный факт, что большинство одногруппников почти не заводили знакомств на новом факультете, так и оставшись в стороне.

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

Слева от матфака находится кластер волгоградских ЧГКшников. На самом деле, границы кластеров здесь заданы очень грубо, и красный прямоугольник ЧГК должен захватывать и часть матфака. С ЧГКшниками пересекается кластер со всеми остальными студентами ВолГУ, преимущественно с теми, с кем я познакомился на ЧГК, будучи редактором и в разных университетских поездках.

Отдельно слева идёт кластер со школьными связями, в большинстве своём мой бывший класс. Как видно, уровень социализации там достаточно мал и ограничивается определённым кругом лиц.

Второй по размеру кластер после ВолГУ — это НИУ ВШЭ, в основном факультет Бизнес-Информатики, выделен жёлтым цветом. От него идёт два ответвления, которые я не выделял — это связи на работе (такое малое количество обусловлено тем, что большинство там не пользуется VK, предпочитая вместо него FB и LinkedIn). Два ответвления — это два отдела, в одном я работал раньше, в другом работаю сейчас. Как видно, в каждом из них есть один или два человека, так или иначе связанные с Вышкой.

Последний кластер — это ЧГКшники из Москвы и Ярославля. Изначально я думал, что кластер будет связан с Высшей Школой Экономики, ибо оттуда и пошли все знакомства. Но, как оказалось, московские чгкшники знают гораздо больше знатоков из Волгограда, нежели студенитов факультета БИ (что, наверное, логично).

Оставшиеся точки — это люди, с которыми я знакомился либо как-то случайно на улице, в индивидуальных путешествиях или по интернету. Таких не очень много — около 6%.

В целом, факультет математики ВолГУ (включая Бизнес-Информатику) и Вышка составляют по 1/3 всех связей соответственно. Последняя треть связей приходится на оставшиеся 6 кластеров и пользователей, которых я не включил в какую-то выборку.

Конечно, это не все, кого я знаю, а только те, кто есть в VK и кто есть у меня в «друзьях». Так что выборка не совсем точная, но очень-очень приблизительная.

Если вам интересно, можете сами создать себе такую.

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

    https://vk.com/feed?w=vk10_years190665220

    Социальный граф сделан в честь юбилея соцсети-в 2016 году ВКонтакте исполнилось 10 лет, и любой пользователь может Вспомнить все, какая была его первая запись, статус, друзья, музыка, количество лайков, сообщений, сколько пользователь в сети в общей сложности. Словом, показана вся история станицы от первого дня регистрации до сегодняшнего момента. Очень интересно пройтись по своему прошлому.

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

    Показывает первую фото.

    Показвает сколько лайков вы сделали сколько сообщений вами было отправлено. И самое главное сколько времени вы были с этой социальной сетью. Окунает в реальность. А не много ли?)))

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

    Совсем недавно, в связи с 10-летнем юбилеем социальной сети Вконтакте, появилось приложение Социальный граф. Это приложение непосредственно ВК может строить связь вас и ваших друзей. То есть это приложение способно выстроить всю историю вашей активности Вконтакте с момента регистрации.

    Приложение бесплатное.

    Социальная сеть В контакте отметила свой 10 летний юбилей. В связи с этим предоставили возможность пользования приложением Социальный граф. Теперь можно будет с помощью этого сервиса просмотреть моменты из прошлого, это очень увлекательно и интересно. Можно будет узнать, когда был зарегистрирован пользователь, кто стал его первым другом. Узнаете о первых добавленных фото, аудиозаписи и многое другое.

    Социальный граф это мини-сервис, который подарен пользователям был в честь 10-летия социальной сети.

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

    Социальный граф это приложение, вернее одна из функций программы Вспомнить вс, которое было создано к юбилею соц. сети Вконтакте. Недавно Вконтакте исполнилось 10 лет, и благодаря приложению Социальный граф можно отмотать время назад и вспомнить тот момент когда пользователь прошел регистрацию в соц. сети, какие были его первые загруженные фото.

Совсем недавно на Хабре появилась о реализации дружеских связей в ВКонтакте с помощью Wolfram Mathematica. Идея мне понравилась, и, естественно, захотелось сделать такой же граф, используя Python и . Вот, что из этого получилось.

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

Разобьем задачу по элементам:

  • Создание и авторизация приложения.
  • Получение данных.
  • Визуализация графа.
Что для этого нам понадобится:
  • Python 3.4
  • Mozilla FireFox, так как в Chrome нельзя использовать XMLHttpRequest для загрузки локальных файлов (никто не мешает сделать python -m http.server 8000 )

Создание и авторизация приложения

Чтобы получить доступ к API ВКонтакте, нам необходимо создать Standalone-приложение , после чего мы сможем использовать нужные нам методы API, которые будут описаны далее. Приложение создается — выберем Standalone-приложение . Нас попросят ввести код-подтверждения, высланный на мобильный, после чего мы попадем на страницу управления приложением. На вкладке Настройки нам пригодится ID приложения для получения access_token .
Далее нам надо авторизовать наше приложение. Этот процесс состоит из 3х этапов.
Аутентификации пользователя на сайте ВКонтакте
Для этого сформируем url, как показано ниже:

Https://oauth.vk.com/authorize?client_id=IDприложения&scope=friends,offline&redirect_uri=https://oauth.vk.com/blank.html&display=page&v=5.21&response_type=token
Цитируя vk.com/dev/auth_mobile :

APP_ID – идентификатор Вашего приложения;
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_TOKEN&expires_in=0&user_id=USER_ID
Редактируем файл settings.py , вставляя туда полученные access_token и user_id . Теперь мы можем осуществлять запросы к API ВКонтакте.

Получение данных

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

Поскольку нужна хоть какая-то информация об id пользователя, по которому будет строиться граф, нам пригодиться users.get . Он принимает как один id, так и несколько, список полей, информация из которых нам необходима, а также падеж, в котором будет склоняться фамилия и имя. Мой метод base_info() получает список id и возвращает информацию о пользователе с фотографией.

Def base_info(self, ids): """read https://vk.com/dev/users.get""" r = requests.get(self.request_url("users.get", "user_ids=%s&fields=photo" % (",".join(map(str, ids))))).json() if "error" in r.keys(): raise VkException("Error message: %s. Error code: %s" % (r["error"]["error_msg"], r["error"]["error_code"])) r = r["response"] # Проверяем, если id из settings.py не деактивирован if "deactivated" in r.keys(): raise VkException("User 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&fields=uid,first_name,last_name,photo" % id)).json()["response"] #self.count_friends = r["count"] return {item["id"]: item for item in r["items"]}
Далее наступает самое интересное.
Список id общих друзей между двумя пользователями возвращает метод friends.getMutual . Это хорошо, потому что мы получаем только id, а более расширенная информация у нас уже есть, благодаря friends.get . Но никто не запрещает сделать вам лишнюю сотню-другую запросов, используя users.get . Схемы расположены чуть-чуть пониже.
Теперь определимся, как будем использовать friends.getMutual . Если у пользователя N-друзей, то надо сделать N-запросов, чтобы по каждому другу мы получили список общих друзей. К тому же нам надо будет делать задержки, чтобы у нас было допустимое количество запросов в секунду.
Предположим, что у сканируемого нами id есть 25 друзей.

Всего 52 запроса — это слишком многовато, поэтому вспомним, что users.get может принимать список id:

25 друзей — 28 запросов, но как писалось выше, информация у нас уже имеется, благодаря friends.get .


И тут нам пригодится execute , который позволит запустить последовательность методов. У него есть единственный параметр code , он может содержать до 25 обращений к методам API.
То есть в итоге код в VKScript будет примерно таким:

Return { “id": API.friends.getMutual({"source_uid":source, "target_uid":target}), // * 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 for i in iter(range(0, len(lst), n))] result = for i in parts(list(self.all_friends.keys())): # Формируем code (параметр execute) code = "return {" for id in i: code = "%s%s" % (code, ""%s": API.friends.getMutual({"source_uid":%s, "target_uid":%s})," % (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, for i in val] if val else None)) return result
Итак, если хочется посмотреть свой список друзей и общих с ними друзей, запускаем:

Python main.py

Визуализация графа

Выбор пал на , а именно на Curved Links . Для этого надо сгенерировать json , который будет примерно такого содержания:

{ "nodes": [ {"name":"Myriel","group":1, "photo": "path"}, {"name":"Napoleon","group":1, "photo": "path"}, {"name":"Mlle.Baptistine","group":1, "photo": "path"} ], "links":[ {"source":1,"target":0,"value":1}, {"source":2,"target":0,"value":8} ] }
Немного видоизменяя 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 , я добавил возможность использования хранимых процедур. Для этого нужно перейти по