
Кадры из фильма «50 оттенков серого»
На этот раз с помощью незамысловатого куска кода на javascript заглянем в таинственные глубины человеческих предпочтений. А именно получим часть списка закладок («лайков» записей сообществ) аккаунта ВКонтакте.
По данным wordstat.yandex.ru, до 2000 раз в месяц у поискового робота спрашивают «как посмотреть кто что лайкает». Ответом в поисковой выдаче является вирусная программка LikeCheсker, которая на поставленный вопрос на самом деле не отвечает. А мы ответим.
Зачем это нужно? Если верить интернету (а ему лучше не верить) по, например, почерку человека можно определить его характер. Например
Саркастичных людей можно распознать по написанию буквы «ё». Чем необычнее изображение точек, помещенных над этой буквой, тем острее его чувство юмора и ярче его способность к подражанию.
Есть у меня предположение, что по картинкам и постам, которые человек «лайкает» можно построить более точный портрет личности, чем по его почерку. Однако для получения этой информации нужно немного потрудиться.
Описание ситуации
ВКонтакте
Раньше информация о том какие записи пользователь отмечает сердечком была полностью конфиденциальна и видна только самому пользователю. После очередного редизайна конфиденциальность пропала. Если пользователь А является другом пользователя Б и они подписаны на одно и то же сообщество, то он может узнать под конкретной записью этого сообщество «лайкнул» ли её пользователь Б.
В случае десктопной версии VK.com информация о том, что пользователь Б её «лайкнул» отображается в виде его аватара, если навести мышку на сердечко:

Постановка задачи
Нашей целью будет получить список записей, которые пользователь отметил сердечком. Не знаю можно ли с помощью VK API добраться до этой информации (беглым взглядом по документации такой возможности не обнаружил) мы пойдём простым путём — через браузер.
Итак, для того, чтобы получить список чужого избранного нам нужно:
- Быть с жертвой друзьями в ВК
- Подписаться на те же сообщества что и он
- Пробрутфорсить все записи сообществ
С первым пунктом всё понятно, второй и третий будем автоматизировать.
К делу
Чтобы не трогать реально существующих друзей зарегистрируем два аккаунта и подружим их.
Тратим 30 рублей, покупаем две виртуальные симки (без телефона VK не регистрирует) и регистрируем героев фильма «50 оттенков серого»:

Аккаунтом Грея пользуемся как обычно — подписываемся вручную на разные сообщества и отмечаем «лайками» различные записи в ленте.
Из аккаунта Анастейши начинаем охоту на «Лайки». Помогать нам сегодня будет Javascript. Можно использовать букмарклеты, можно сделать Google Extension. Мы пойдём по-простому, через Developer Console (F12).
1. Получаем список сообществ на странице жертвы:
var x = document.getElementsByClassName("module_body clear_fix");
for (var i = 0; i < x[1].children.length; i++) {
   console.log(x[1].children[i].children[0].children[0].href + " " + x[1].children[i].innerText)
}2. Подписаться на них можно вот так:
document.location="https://vk.com/sci";
document.getElementById("public_subscribe").click()3. Открываем новостную ленту и прокручиваем n раз:
document.getElementById("show_more_link").click();
4. Брутфорс записей в ленте:
var z = document.getElementsByClassName("post_like _like_wrap")
for (var k= 0; k< z.length; k++){
	z[k].onmouseover();
	z[k].focus();
}
var y = document.getElementsByClassName("like_tt_owners me_hidden _content")
	for (var j= 0; j< y.length; j++){
		for (var i = 0; i < y[j].children.length; i++) {
		 if (y[j].children[i].title == "Кристиан Грей"){
			console.log( "https://vk.com/feed?w=wall" + z[j].onmouseover.toString().split("'")[1]);
		  }
		}
	}Результат:

Успех!
Заключение
«It's not a bug — it's a feature» скажите вы и возможно я с вами соглашусь, но мне бы хотелось видеть в настройках приватности галочку выключения такой «feature».
Конечно, эта информация не прям такая личная и её трудно использовать против человека. Тем не менее я уверен, что бывают случаи, когда такой анализ, в дополнение к чему либо или самостоятельно поможет понять мысли человека, его характер, политические, религиозные взгляды и прочее. Повторюсь — не для всех и не всегда.
Комментарии (72)
- habradante05.12.2016 11:01+25- Те кто заботятся о приватности — не лайкают :)  - iChaos05.12.2016 13:32+14- Те, кто заботится о приватности — вообще не пользуются социальными сетями ;)  - LeReve06.12.2016 16:57- Ну можно, например, пользоваться соц. сетью с левыми данными и без использования личных фотографий. Чем это вредит приватности?  - extraterrestrial06.12.2016 19:00- тем что друзья не такие  - LeReve07.12.2016 09:53+1- Речь о приватности друзей или вашей? Если вашей, тогда зачем вы добавляете друзей?  - extraterrestrial07.12.2016 10:57- Простите что отвечаю вопросом на вопрос, но зачем тогда соц. сети если не добавлять туда друзей? 
 я ненмого не вкурсе реальности у меня нет аккаунтов в современных соц.сетях, может есть какойто не очевидный для меня смысл в аккаунте без друзей? - ivan38607.12.2016 14:16+2- Да всё так же как и в остальном интернете. Музыку послушать. Фильмы, клипы, фото посмотреть. Почитать посты и комментарии. Только вот поделиться баянами не с кем. 
  - LeReve08.12.2016 10:24- А вы не задумывались, что Хабр тоже соц.сеть. Только узконаправленная. Так же и в других соц.сетях можно выбрать только интересующие паблики/темы. И тихо читать их, не думая о том, что кто-то про вас узнает. 
 
 
  - EuHex07.12.2016 10:32- примерно тоже самое с мессенджерами… в чем проблема Ricochet или Tox? Приватность, защита, все вроде ок. Только поговорить там можно только с такими же криптофриками и гиками, а остальные друзья плевать хотели и все равно будут писать в ВК… 
 
 
  - K0styan07.12.2016 14:21+1- Те, кто не пользуются вообще — рискуют стать жертвой identity theft. Никто не мешает зарегистрировать за вас аккаунт и делать от вашего имени что угодно. 
 
 Безопаснее все-таки завести аккаунт, добавить в друзья десяток человек, ваше знакомство с которыми ни для кого секретом не является, и так это дело и оставить. Если появится ваш виртуальный двойник — всегда можно сказать «это не мой аккаунт, мой — вот этот».
 
 Впрочем, это тоже можно назвать «не пользоваться» :)
 
  - LekaOleg06.12.2016 16:57- Товарищи!) 
 Приватная жизнь — это пережиток прошлого! Большие папы уже давно следят за всем и всё знают))) - K0styan07.12.2016 14:31+1- По большому счету та штука, что мы сейчас называем приватной жизнью, была доступна человеку в принципе очень небольшой период времени — очень примерно с конца Великой Депрессии (или даже второй мировой) до распространения кредитных карт. 
 
 До того всегда был кто-то рядом. В деревне — соседи (там секретов в принципе нет). В городе — по-разному: у тех, кто победнее, те же соседи или хозяин жилья; у тех, кто мог себе позволить собственную квартиру — прислуга. Про совсем богатых людей не говорю: штат прислуги был такой, что секреты были невозможны. Только с 40-х, когда стоимость отдельного жилья снизилась, а стоимость найма прислуги возросла, стало возможным жить без чужих ушей за ближайшей стенкой.
 
 Ну а с середины 70-х уже Большой Брат в виде компьютеризованных систем подоспел.
 
 
 - andreymal05.12.2016 11:12+5- После очередного редизайна Если имеется в виду тот, что в этом году, то… С пробуждением! https://vk.com/wall-32295218_3027
 - Dev_00705.12.2016 11:18-1- Вроде как в блоке «like_tt_owners me_hidden _content» отображаются только 6 последних лайкнувших пользователей, вне зависимости от их общего количества, разве нет? 
 
 Т.е. получается, что далеко не факт, что ваш «Кристиан Грей» найдется, если он поставил лайк достаточно давно в популярном посте. - vadimmironov05.12.2016 11:28-1- Там не 6 последних, а 6 случайных(меняются после refresh). Плюс, если среди лайкнувших есть твои друзья — они отображаются всегда.  - Dev_00705.12.2016 12:51+1- Спасибо за пояснения, но получается, что если среди лайкнувших данный пост моих друзей больше 6-ти, то отследить кого-то конкретного может не получиться, т.к. он может не отобразиться. Шансы тем меньше, чем больше мой френдлист, иначе говоря, методика не 100% рабочая. 
 
 Создавать же отдельный аккаунт и добавлять во френды единственную жертву (попробуйте еще ее убедить принять вас в друзья) с целью последующего отслеживания ее лайков — это, мягко говоря, несколько неоправданно. - andreymal05.12.2016 18:17+5- У этой всплывашки есть полное всплывающее окно, в котором можно посмотреть полный никак не ограниченный список как друзей, так и остальных лайкнувших (и в API это всё тоже есть, да)  - Dev_00706.12.2016 07:39- Посмотреть конечно можно, но скрипт, приведенный в статье, оперирует данными именно из мелкой всплывашки. 
 
 Ну а насчет API вы совершенно правы: метод likes.getList позволяет избавиться от разбора всплывашек и неопределенности с отображением большого списка друзей в них.
 
 
  - Flashmond05.12.2016 12:55+1- А если эту запись лайкнули 10 моих друзей. Посмотрите под вашей аватаркой, например. И, насколько я помню, среди друзей отображаются 6 последних, а не случайных. 
  - DaemonGloom05.12.2016 13:56+3- Может, тогда надо загружать список всех лайкнувших? В браузере это можно сделать просто кликнув на надпись «Понравилось XX людям» во всплывающем окошке. 
 
 
 - SLASH_CyberPunk05.12.2016 11:22+3- Вы путаете избранное и лайки, поменяйте заголовок!  - andreymal05.12.2016 11:24+1- Лайк это одновременно добавление в избранное, так что не путает 
 Правда, таким способом можно достать далеко не всё содержимое избранного - kir_vesp05.12.2016 11:30- Если добавить ещё брутфорс по фоткам, видео и дополнительно прогнать это не только по сообществам, но и по друзьям с открытыми страницами… Покрытие избранного станет выше) 
  - SLASH_CyberPunk05.12.2016 12:41- А вы путаете с закладками… 
 Первоначально избранное было на список групп, в которые можно было не вступать.
 
 
 - harimis05.12.2016 11:31+9- Смотрим чужое избранное ВКонтакте 
 Слишком громкое название. Описанным образом как минимум нельзя:
 - посмотреть людей и группы в закладках
- посмотреть лайки к записям/фото/видео в группах, в которых целевой аккаунт не состоит
- посмотреть лайки к записям/фото/видео на страницах пользователей, если не добиться того-же уровня доступа
 
 - glorfindeil05.12.2016 12:16+3- Ревнивая женщина отслеживает лайки там где не надо быстрее и эффективнее 
 - fakir8905.12.2016 12:16- Эх, начала читать статью в надежде получить некую аналитику. Например, сколько моих друзей и как часто лайкают котиков… 
- varnav05.12.2016 12:26-4- Анастейша — забавное имя. Это то, как американцы читают имя Anastasia?  - MikailBag05.12.2016 19:50- varnav06.12.2016 11:38- Разумеется героиня с таким именем там присутствует. Мне интересно откуда это имя взялось в принципе.  - K0styan07.12.2016 14:29- Имя классическое греческое, святая соответствующая тоже есть. Имя там, конечно, не как у нас популярно, но и не уникальное. 
 
 Опять же, Диснеевский мультик был и лет 10 назад одноименная певица довольно популярна была.
 
 
 
 - Germanets05.12.2016 13:40+1- Если пользователь А является другом пользователя Б и они подписаны на одно и то же сообщество, то он может узнать под конкретной записью этого сообщество «лайкнул» ли её пользователь Б. — быть подписаным или вступать в какое-либо сообщество не нужно, достаточно просто иметь возможность просмотреть записи сообщества.
 
 Дополнительно, так как выше уже была указана проблема при более чем 6ти друзьях, лайкнувших запись — сейчас есть возможность временно сократить список друзей, можно даже до одного. То есть на время сканирования мы убираем всех друзей, кроме нашей цели(друзья становятся нашими подписчиками, откуда их можно обратно добавить в друзья без каких-либо дополнительных действий).
 
 В связи с этим, да и не только — предлагаю следующее улучшение алгоритма:
 0) убираем из «друзей» всех, кроме нашей «жертвы».
 1) выбираем список групп для сканирования: сканируем все группы\подписки «жертвы» + все репосты «жертвы» из групп не входящих в список(например, человек репостнул запись пол года назад а сейчас уже отписался от сообщества, ввиду «палевности»), + сканируем записи всех открытых друзей жертвы на наличие его лайков, и — если это группа — выбираем тоже в список для скана.
 2) дополнительно — можно сформировать список топ 10\100 групп во всём вк + топ групп всех его друзей.
 3) сканируем полученный список групп(вступать не надо).
 4) возвращаем всех своих «друзей» на место.
 
 Если целью является поиск скрытых\не добавленных друзей — можно итеративно пройти всех друзей у друзей жертвы на наличие лайков\комментариев. - Germanets05.12.2016 13:59- Ещё один путь поиска, который упустил на первый взгляд — это те, кто не состоит в друзьях «жертвы», но ставили лайки на странице жертвы. Правда с лайками аватаров тут есть косяк — за последний год развелось слишком много ботов-спамеров, обращающих на себя так внимание. До лайков записей боты пока не добрались вроде бы.  - Am0ralist05.12.2016 18:20- Вроде как давно уже лайкают новости на стене. 
 Хотя чаще аватарки, причем иногда даже несколько старых, а не новые.
 
 
 - inoyakaigor05.12.2016 14:01- Быть с жертвой друзьями в ВК
- Подписаться на те же сообщества что и он
 
 
 Во-первых, это совершенно не обязательные пункты.
 Во-вторых ваш метод костылен. Изучите API ВК. С его помощью можно собрать больше инфы.
 
 К примеру, в своё время я написал на PHP скрипт который собирает подобную инфу. Он собирал лайки к записям, оставленные комментарии и лайки к комментариям. По этой инфе уже многое можно сказать о человеке. В планах было ещё много чего, но, к сожалению, он так и остался по большей части proof-of-concept.
 - WTFRU705.12.2016 14:40+1- Эмм — вообще-то для определения данного факта существует открытый метод АПИ — насколько я помню, даже авторизация необязательна — Likes.isLiked 
 
 Итого имеем 1 GET-запрос к апи и ответ в json
 - Andriy121805.12.2016 14:45- Есть сервисы, в которых есть возможность поиск лайков человека по постам из страниц друзей, групп, поиск лайков фотографий, поиск комментариев и прочей открытой информации. Например, этот. 
 - NEGI_RUS05.12.2016 14:46- Ответом в поисковой выдаче является вирусная программка LikeCheсker, которая на поставленный вопрос на самом деле не отвечает. 
 Она отвечает, только в этом случае программа проходится через все лайки по всем постам всех групп и друзей, пока не найдется нужный. При этом не нужно создавать левых аккаунтов и добавляться в друзья. Быстрее всего будет это сделать через процедуры ВК (https://vk.com/dev/execute)
 Например:
 - var userID = 1; // id пользователя var ownerID = 1; // id группы var offset = 0; var count = 100; var n = 1; var posts = API.wall.get({ "owner_id":-ownerID, "offset":offset, "count":count }); var likes = []; count = count + 1; do { var isLiked = API.likes.isLiked({ "user_id":userID, "type":"post", "owner_id":-ownerID, "item_id":posts[n].id }); likes.push(posts[n].id); likes.push(isLiked); n = n + 1; } while(n < count); return likes; - rolecs05.12.2016 22:03- error_msg: 'One of the parameters specified was missing or invalid: item_id is undefined'
 
 Ваш код не работает, также как и код автора. - NEGI_RUS06.12.2016 05:45- Давно делал, возможно что-то изменилось. Но здесь важно запускать именно через https://api.vk.com/method/execute?code=..., а не из внутреннего редактора на сайте, т.к. вывод отличается (почему-то). 
 
 
 - QueenS05.12.2016 19:51- 1. var x = document.getElementsByClassName(«module_body clear_fix»); 
 for (var i = 0; i < x[1].children.length; i++) {
 console.log(x[1].children[i].children[0].children[0].href + " " + x[1].children[i].innerText)
 }
 Почему при выполнении первого пункта у меня не список сообществ выводит, а просто имена друзей, которые рандомным образом показываются на странице? (6 имён) - vadimmironov06.12.2016 11:19
 
 - BlackRaven8605.12.2016 21:55- Кстати, то, что вы лайкаете (а тем более, комментируете) может отображаться в рекомендуемых новостях у ваших друзей.  - newartix06.12.2016 11:15- а с недавнего времени в обновлениях отображается, что комментировали ваши друзья  - BlackRaven8606.12.2016 13:03- Действительно, там тоже показывается. И, что плохо, нету настроек приватности для этих комментариев :(  - andreymal07.12.2016 02:19- Для комментариев настройка приватности как раз есть)  - BlackRaven8607.12.2016 02:34- Есть настройка видимости комментариев к моим записям. А вот чтобы мои комментарии к чужим записям не показывались в Обновления/Рекомендации как сделать? 
 
 
  - Stas-Deep05.12.2016 22:04- Как запустить этот код для каждой ссылки? 
 - document.location="https://vk.com/sci"; document.getElementById("public_subscribe").click()
 Допустим, у меня есть массив, содержащий ссылки в виде строки, и я хочу, чтобы каждая ссылка автоматически открылась и по окончании загрузки кнопка была нажата?
  - alex160306.12.2016 10:50- Спасибо за статью. Например я так же хотел бы отфильтровать пользователей по лайкам, тем же лайкам что и мои а так же уверен на 100% что с тем с кем лайки совпали чаще всего например 99% совпадения то нам есть о чем поговорить. Я просто не лайкаю как правило всякую фигню. 
  - redemption06.12.2016 10:50+1- А к чему это извращение с подпиской на группы пользователя? Это все прекрасно работает, если мы заходим в раздел Новостей пользователя, то есть кликаем по кнопочке «Новости» справа от «Друзья» под аватаркой. 
  
 Заходим туда и далее в консоли делаем эти трюки.
 
 
 
           
 





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