Анализ дружеских связей VK с помощью Python / Хабр
Совсем недавно на Хабре появилась статья о реализации дружеских связей в ВКонтакте с помощью Wolfram Mathematica. Идея мне понравилась, и, естественно, захотелось сделать такой же граф, используя Python и d3. Вот, что из этого получилось.Внимание! В статье будут присутствовать части кода, описывая самые важные действия, но следует учесть, что проект претерпит еще не одно изменение в своей кодовой базе. Заинтересовавшиеся могут найти исходники на GitHub.
Разобьем задачу по элементам:
- Создание и авторизация приложения.
- Получение данных.
- Визуализация графа.
- Python 3.4
- requests
- d3
- Mozilla FireFox, так как в Chrome нельзя использовать XMLHttpRequest для загрузки локальных файлов (никто не мешает сделать python -m http.server 8000)
Создание и авторизация приложения
Чтобы получить доступ к API ВКонтакте, нам необходимо создать Standalone-приложение, после чего мы сможем использовать нужные нам методы API, которые будут описаны далее.Далее нам надо авторизовать наше приложение. Этот процесс состоит из 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 — это доступ к друзьям и к API в любое время со стороннего сервера (бессрочный токен). Если адрес сформирован правильно, нам предложат ввести логин и пароль.
PERMISSIONS – запрашиваемые права доступа приложения;
DISPLAY – внешний вид окна авторизации, поддерживаются: page, popup и mobile.
REDIRECT_URI – адрес, на который будет передан access_token.
API_VERSION – версия 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[0].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 в каждой. На нашем примере схема будет выглядеть так:
Далее составим человеко понятную структуру, где уже вместо 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 {' 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[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": [ {"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), догадаться можно, что она значит, иUPD (27.05.2014):
Как мне подсказал WTFRU7, я добавил возможность использования хранимых процедур. Для этого нужно перейти по ссылке.
Создаем хранимую процедуру getMutual. Копируем содержимое execute_getMutual.js в форму и сохраняем. Не забываем скачать более новую версию. Финальный вид нашей схемы будет таким:
Получаем бессрочный токен.
UPD (11. 07.2014):
Добавлены схемы-пояснения.
UPD (14.11.2014):
Продолжение
8 явных признаков того, что кто-то не хочет дружить с вами
Если вам трудно читать социальные сигналы, может быть трудно сказать, когда дружба начала угасать. Хотя большинство людей не скажут вам напрямую, что они больше не хотят дружить, они могут начать показывать признаки того, что не хотят продолжать вашу дружбу.
Дружба является ключевым фактором, определяющим здоровье, успех и долголетие, но не всякая дружба будет в вашей жизни. Иногда лучше отпустить одностороннюю дружбу, которая больше не служит вам.
Но как узнать, что кто-то больше не хочет дружить с вами?
Вот 8 признаков того, что, возможно, пора разорвать отношения и освободить место для новых людей в вашей жизни.
Каким бы симпатичным вы ни были, не всякая дружба вам подходит. По мере того, как люди растут и меняют свои жизненные траектории, дружба часто угасает, а приоритеты меняются.
В конце концов, ваше время и энергия — это ограниченные ресурсы. Вероятно, вы захотите поделиться ими с людьми, которые искренне хотят быть рядом с вами.
По мере взросления важно поддерживать настоящую дружбу и отпускать людей, которые вас не ценят. Если кто-то больше не хочет быть вашим другом, он скажет вам об этом одним или несколькими из этих 8 знаков.
#1 Вы прикладываете больше всего усилий
Односторонняя дружба может нанести ущерб вашему психическому здоровью и самооценке.
Когда один человек больше предан дружбе, чем другой, часто может показаться, что вас отвергают или используют в своих интересах.
Например, просмотрите свои последние текстовые сообщения или телефонные звонки с этим человеком. Если вы тот, кто постоянно выходит на связь (т. е. вы всегда пишете или звоните первым), и они не отвечают вам взаимностью, это может быть признаком того, что вы находитесь в односторонней дружбе.
Действие Совет: просмотрите свой телефон и составьте список 10 человек, с которыми вы чаще всего общаетесь каждый месяц. Подсчитайте, как часто вы инициировали разговор (смс, звонок, электронная почта или лично) по сравнению с тем, сколько раз это делали они.
Не расстраивайтесь из-за результатов — вместо этого используйте это как руководство для того, кто прилагает больше всего усилий в ваших близких отношениях. Если вы заметили, что именно вы делаете большую часть работы в некоторых областях, рассмотрите возможность немного отступить и перенаправить свое время на отношения, основанные на взаимных усилиях.
#2 Они активно избегают глубокой связи с вами
Обратите внимание на то, что происходит, когда вы находитесь с вашим другом:
- Они делают вид, что не видят вас, если вы сталкиваетесь с ними на публике?
- Они склонны к очень коротким разговорам?
- Избегают ли они зрительного контакта?
- Они придумывают странные причины, почему им нужно уйти или перестать разговаривать?
- Сигнализирует ли их язык тела об избегании, а не о заинтересованности? Научиться читать язык тела отказа так же важно в ваших дружеских отношениях, как и в мире свиданий. Например, ваш друг может слегка отвернуться от вас к двери, пока вы разговариваете. Возможно, они скрестили руки на груди или выглядят напряженными и смущенными. Они могут метнуть глаза и не смотреть на вас.
Это указывает на то, что ваш друг, возможно, пытается избежать глубокой связи с вами, потому что он больше не хочет быть друзьями. Если кто-то игнорирует или избегает вас, лучше всего дать ему пространство и перенаправить свою энергию в другое место.
Посмотрите это видео, чтобы узнать больше о том, как читать язык тела:
#3 Они не спрашивают о вас
Еще одним признаком односторонней дружбы является постоянное внимание к другому человеку. Вы можете заметить, что они всегда говорят о себе:
- их работа
- их вторая половинка
- их страсти
О тебе вообще спрашивают!?
Когда кто-то не спрашивает о вашей жизни или ваших увлечениях, он может демонстрировать, что не ценит вас так, как вы цените его.
Например, если вы болтаете со своим другом, пока он рассказывает о своей новой работе, недавнем повышении или проекте, над которым он работает, но он никогда не останавливается, чтобы спросить о вашей работе или увлечениях, это может быть признаком того, что они больше заинтересованы в себе, чем в вашей дружбе.
Если вы склонны угождать людям, вы можете подсознательно подыгрывать этому шаблону, потому что хотите понравиться и сделать других счастливыми. Но на самом деле вы можете повредить своей уверенности в себе, возведя другого человека на пьедестал.
Узнайте больше о том, как перестать угождать людям, из этого видео:
Совет: Соберите всю энергию, которую вы обычно тратите на то, чтобы выслушать жизнь другого человека, и начните направлять ее на себя. Улыбнитесь и кивните, а затем начните отмечать свои победы, заботьтесь о себе, работайте над самооценкой или попробуйте новое хобби.
Помните, что вы самый важный персонаж в своей истории ; поэтому вам не нужно никого ставить на пьедестал, только слушая их жизненный опыт.
#4 Они перестают связываться или строить планы
Вы всегда приглашаете их, а они никогда не спрашивают вас? Друзья, которые искренне рады узнать, что вы, вероятно, потянутся, чтобы провести время вместе и инициировать тусовки в равной степени.
Если однажды вечером они откажутся от ваших планов, они могут предложить альтернативу, пригласив вас на кофе или предложив посмотреть фильм и наверстать упущенное на следующей неделе.
Но если вы заметили, что ваш друг больше не выходит на связь или что вы единственный, кто пытается строить планы, это может быть признаком того, что он больше не хочет быть друзьями.
Возможно, они заняты или просто больше не общаются с вами. В любом случае, не принимайте это близко к сердцу, когда вы обнаружите, что оказались в односторонней дружбе. Используйте это как знак, чтобы перенаправить свое внимание на отношения в вашей жизни, в которых сбалансированных усилий обеих сторон.
Признание и принятие того факта, что дружба больше не зависит от взаимных усилий, является актом самоуважения. Дружба требует времени и работы. Вы заслуживаете друзей, которые прилагают столько же усилий, сколько и вы, чтобы сохранить вашу дружбу.
Совет: Не связывайтесь с этим человеком в течение месяца и посмотрите, как (или если) он отреагирует. В это время пригласите других друзей пообщаться или сосредоточьтесь на том, чтобы завести новых друзей.
Если они не выходят на связь в течение 2-4 недель после того, как вы прервали общение, вероятно, это признак того, что они либо очень заняты, либо больше не заинтересованы в вашей дружбе.
#5 Они регулярно отменяют планы
Отказ от планов, отмена планов или отказ от звонка и неявка — все это вредно. Ой! Исследования показывают, что отказ активирует те же участки мозга, что и физическая боль.
Но очень важно вовремя заметить, что кто-то не выполняет свои планы вместе с вами. Возможно, они просто ненадежны или ненадежны со своим временем, но если они не извиняются и не пытаются строить новые планы, это может быть сигналом того, что они не так уж заинтересованы в вашей дружбе.
Совет к действию: каждый сталкивался с отказом, но у нас часто не было способов справиться с этим. Воспользуйтесь нашим руководством о том, как помочь преодолеть боль отказа: Почему отказ так сильно болит и как избавиться от боли
#6 Они оправдываются
Люди, которые не хотят проводить с вами время, могут быть не такими прямолинейными, как вам хотелось бы. Вместо этого они могут оправдываться, почему не могут тусоваться или почему давно не связывались с вами.
Например, если вы пару раз свяжетесь с другом и пригласите его пойти с вами в спортзал, он может ответить, что занят работой или повредил плечо. Любой пример может быть правдой, но это также может быть сигналом того, что они избегают вас, если они приводили одно и то же оправдание несколько раз — сколько раз они ДЕЙСТВИТЕЛЬНО могли повредить свое плечо?
Обращайте внимание на признаки оправдания и избегайте расспросов и не принимайте их на свой счет. Вместо этого пригласите другого друга или сделайте что-нибудь, чтобы отпраздновать себя.
#7 Они всегда заняты
Жизнь случается. Каждый может быть занят и перегружен время от времени. Часто дружба начинает сходить на нет, потому что кто-то сосредотачивается на других отношениях или у него просто нет времени в их расписании, чтобы общаться прямо сейчас.
Возможно, они перегружены или переживают серьезные изменения в жизни, например, начинают новую работу, переезжают в новое место или рожают ребенка. С другой стороны, они могут просто использовать свой плотный график, чтобы избегать вас, не задевая при этом ваших чувств.
Спросите себя: они пытаются перенести встречу, когда слишком заняты, чтобы тусоваться, или они постоянно отменяют и никогда не отвечают вам?
Совет: Создавайте свои планы самостоятельно или вместе с другими людьми и приглашайте их присоединиться к вам. Это ключевая привычка того, как популярные люди объединяют других. Например: «Привет, надеюсь, у тебя все хорошо! Сегодня вечером я встречаюсь с друзьями на пивоварне, и вы можете присоединиться к нам!»
Если они не появляются или не отвечают, это отражается на них, а не на вас.
В конце концов, почти каждый современный человек занят. Вы уделяете время людям и вещам, которые вам небезразличны. Если кто-то не уделяет вам время, идите дальше! Есть более 7 миллиардов других потенциальных друзей!
#8 Они не отвечают или не проявляют энтузиазма в ответах
Когда люди не в восторге от разговора с вами, вы можете просто почувствовать это.
Может быть, вы спросите их: «Как дела?» или «как дела?» или «Я так взволнован этим новым проектом, над которым я работаю. Что вас волнует в эти дни?»
Если их ответ мягкий, расплывчатый или поверхностный, это может быть признаком того, что они не испытывают особого энтузиазма по поводу разговора с вами. Они могут быть очень короткими с вами, используя такие слова, как «хорошо», «круто» или «я занят». А могут вообще не включаться.
Если они вообще не реагируют на начало вашего разговора, это еще более явный признак того, что дружба идет на убыль.
Совет к действию: Отучите себя от общения с этим человеком. Вместо этого, если вы чувствуете себя одиноким, позвоните другу или члену семьи и напомните им, как вы благодарны им за то, что они есть в вашей жизни.
Помните, вы важны, и вы заслуживаете отношений с людьми, которые искренне рады услышать о вас!
Стать более привлекательным
Ничего страшного, если кто-то не хочет быть вашим другом. Вы МОЖЕТЕ завести новые дружеские отношения. Становление более привлекательным — важный ключ к новым дружеским отношениям.
Будьте самым симпатичным человеком в комнатеИзучите навыки, которым мы научили более 500 тысяч студентов, чтобы стать более харизматичными и успешными, в том числе:
- 💝 5 фраз, которые мгновенно сделают вас более привлекательными
- 🤯 Наша секретная стратегия привлекательности для интровертов
- 💬 Трюк №1, чтобы никогда не заканчиваться темы для разговора
Имя *
Электронная почта *
Ключевая информация
Если вы заметили, что один из ваших друзей сигнализирует о том, что он не хочет продолжать вашу дружбу, не принимайте это на свой счет.
Они могут:
- Перестаньте прилагать усилия для дружбы
- Избегать вас на публике
- Перестань спрашивать о тебе
- Прекратить общение
- Отмена планов или оправдание
- Отсутствие энтузиазма
- Перестать отвечать
Единственная константа в жизни — это перемены, и люди неизбежно будут появляться и исчезать из вашей жизни по мере того, как вы изменяетесь и развиваетесь. Иногда люди перерастают дружбу или оказываются на другом пути.
Вместо того, чтобы бороться за угасающую дружбу, думайте об этих знаках как о указателях, которые перенаправят ваш путь к более полноценным новым отношениям. признаки того, что кто-то не хочет быть вашим другом
После того, как вы прекратите дружбу, которая больше не служит вам, вы можете начать прилагать больше усилий для укрепления своей уверенности и приобретения новых друзей, которые действительно хотят проводить с вами время.
Если вы ищете новых друзей, вам может понравиться наше руководство «50 лучших способов познакомиться с новыми людьми в ЛЮБОМ новом городе».
Остерегайтесь повторяющихся запросов в друзья на Facebook
Опубликовано
60.3k
АКЦИИFacebook — прекрасное место для обмена информацией, фотографиями и развлечениями с друзьями, но, к сожалению, это также и рай для мошенников.
К каждой публикации, которую вы видите, и к каждому полученному сообщению нужно относиться скептически, если вы хотите не стать жертвой тех, кто хочет причинить вам горе или лишить вас денег.
Сейчас ходит один вид мошенничества, который еще более коварен, чем большинство других. Мошенники создают виртуальные копии реальных учетных записей Facebook, копируя фотографии и информацию со страницы «О нас» настоящей учетной записи на поддельные. Затем они отправляют запросы на добавление в друзья друзьям, указанным в реальной учетной записи.
Как только у мошенника есть несколько друзей первоначального владельца учетной записи в списке друзей поддельной учетной записи, существует бесчисленное множество способов обмана этих людей, потому что мы склонны доверять своим друзьям, верно?
Если вы получили запрос на добавление в друзья от кого-то, с кем вы уже дружите, найдите свой список друзей, чтобы узнать, дружите ли вы с этим человеком. Если да, то вы только что получили запрос на добавление в друзья от двойного (и, возможно, поддельного) аккаунта Facebook.
Некоторые люди по какой-то причине открывают дубликаты учетных записей, поэтому всегда есть шанс, что запрос на добавление в друзья действительно поступил от вашего друга, а не от мошенника.
Обычно это можно узнать, отправив сообщение своему другу с учетной записи, с которой вы уже дружите, и спросив, является ли запрос на добавление в друзья законным. Еще лучше, если это возможно, вы можете позвонить им по телефону или посетить их лично и спросить.
Если новая учетная запись окажется поддельной (а так, вероятно, и будет), вы можете сообщить об этом в Facebook, чтобы они удалили ее.
Чтобы сообщить о поддельной учетной записи Facebook, просто выполните следующие действия для используемого устройства.
Если вы используете Facebook в веб-браузере на ноутбуке или настольном компьютере:
1 – Посетите страницу Timeline поддельной учетной записи Facebook.
2 – Нажмите кнопку с тремя точками (она расположена рядом с цифрой 9).0025 Message ), затем выберите Найти поддержку или сообщить .
3 – Нажмите Фальшивая учетная запись , затем нажмите кнопку Отправить .
Если вы используете приложение Facebook на мобильном устройстве:
1 – Посетите страницу Timeline поддельной учетной записи Facebook.
2 — Нажмите значок Еще под изображением профиля (он выглядит как три горизонтальные точки ).