Кадры из фильма «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)
habradante
05.12.2016 11:01+25Те кто заботятся о приватности — не лайкают :)
iChaos
05.12.2016 13:32+14Те, кто заботится о приватности — вообще не пользуются социальными сетями ;)
LeReve
06.12.2016 16:57Ну можно, например, пользоваться соц. сетью с левыми данными и без использования личных фотографий. Чем это вредит приватности?
extraterrestrial
06.12.2016 19:00тем что друзья не такие
LeReve
07.12.2016 09:53+1Речь о приватности друзей или вашей? Если вашей, тогда зачем вы добавляете друзей?
extraterrestrial
07.12.2016 10:57Простите что отвечаю вопросом на вопрос, но зачем тогда соц. сети если не добавлять туда друзей?
я ненмого не вкурсе реальности у меня нет аккаунтов в современных соц.сетях, может есть какойто не очевидный для меня смысл в аккаунте без друзей?ivan386
07.12.2016 14:16+2Да всё так же как и в остальном интернете. Музыку послушать. Фильмы, клипы, фото посмотреть. Почитать посты и комментарии. Только вот поделиться баянами не с кем.
LeReve
08.12.2016 10:24А вы не задумывались, что Хабр тоже соц.сеть. Только узконаправленная. Так же и в других соц.сетях можно выбрать только интересующие паблики/темы. И тихо читать их, не думая о том, что кто-то про вас узнает.
EuHex
07.12.2016 10:32примерно тоже самое с мессенджерами… в чем проблема Ricochet или Tox? Приватность, защита, все вроде ок. Только поговорить там можно только с такими же криптофриками и гиками, а остальные друзья плевать хотели и все равно будут писать в ВК…
K0styan
07.12.2016 14:21+1Те, кто не пользуются вообще — рискуют стать жертвой identity theft. Никто не мешает зарегистрировать за вас аккаунт и делать от вашего имени что угодно.
Безопаснее все-таки завести аккаунт, добавить в друзья десяток человек, ваше знакомство с которыми ни для кого секретом не является, и так это дело и оставить. Если появится ваш виртуальный двойник — всегда можно сказать «это не мой аккаунт, мой — вот этот».
Впрочем, это тоже можно назвать «не пользоваться» :)
LekaOleg
06.12.2016 16:57Товарищи!)
Приватная жизнь — это пережиток прошлого! Большие папы уже давно следят за всем и всё знают)))K0styan
07.12.2016 14:31+1По большому счету та штука, что мы сейчас называем приватной жизнью, была доступна человеку в принципе очень небольшой период времени — очень примерно с конца Великой Депрессии (или даже второй мировой) до распространения кредитных карт.
До того всегда был кто-то рядом. В деревне — соседи (там секретов в принципе нет). В городе — по-разному: у тех, кто победнее, те же соседи или хозяин жилья; у тех, кто мог себе позволить собственную квартиру — прислуга. Про совсем богатых людей не говорю: штат прислуги был такой, что секреты были невозможны. Только с 40-х, когда стоимость отдельного жилья снизилась, а стоимость найма прислуги возросла, стало возможным жить без чужих ушей за ближайшей стенкой.
Ну а с середины 70-х уже Большой Брат в виде компьютеризованных систем подоспел.
andreymal
05.12.2016 11:12+5После очередного редизайна
Если имеется в виду тот, что в этом году, то… С пробуждением! https://vk.com/wall-32295218_3027
Dev_007
05.12.2016 11:18-1Вроде как в блоке «like_tt_owners me_hidden _content» отображаются только 6 последних лайкнувших пользователей, вне зависимости от их общего количества, разве нет?
Т.е. получается, что далеко не факт, что ваш «Кристиан Грей» найдется, если он поставил лайк достаточно давно в популярном посте.vadimmironov
05.12.2016 11:28-1Там не 6 последних, а 6 случайных(меняются после refresh). Плюс, если среди лайкнувших есть твои друзья — они отображаются всегда.
Dev_007
05.12.2016 12:51+1Спасибо за пояснения, но получается, что если среди лайкнувших данный пост моих друзей больше 6-ти, то отследить кого-то конкретного может не получиться, т.к. он может не отобразиться. Шансы тем меньше, чем больше мой френдлист, иначе говоря, методика не 100% рабочая.
Создавать же отдельный аккаунт и добавлять во френды единственную жертву (попробуйте еще ее убедить принять вас в друзья) с целью последующего отслеживания ее лайков — это, мягко говоря, несколько неоправданно.andreymal
05.12.2016 18:17+5У этой всплывашки есть полное всплывающее окно, в котором можно посмотреть полный никак не ограниченный список как друзей, так и остальных лайкнувших (и в API это всё тоже есть, да)
Dev_007
06.12.2016 07:39Посмотреть конечно можно, но скрипт, приведенный в статье, оперирует данными именно из мелкой всплывашки.
Ну а насчет API вы совершенно правы: метод likes.getList позволяет избавиться от разбора всплывашек и неопределенности с отображением большого списка друзей в них.
Flashmond
05.12.2016 12:55+1А если эту запись лайкнули 10 моих друзей. Посмотрите под вашей аватаркой, например. И, насколько я помню, среди друзей отображаются 6 последних, а не случайных.
DaemonGloom
05.12.2016 13:56+3Может, тогда надо загружать список всех лайкнувших? В браузере это можно сделать просто кликнув на надпись «Понравилось XX людям» во всплывающем окошке.
SLASH_CyberPunk
05.12.2016 11:22+3Вы путаете избранное и лайки, поменяйте заголовок!
andreymal
05.12.2016 11:24+1Лайк это одновременно добавление в избранное, так что не путает
Правда, таким способом можно достать далеко не всё содержимое избранногоkir_vesp
05.12.2016 11:30Если добавить ещё брутфорс по фоткам, видео и дополнительно прогнать это не только по сообществам, но и по друзьям с открытыми страницами… Покрытие избранного станет выше)
SLASH_CyberPunk
05.12.2016 12:41А вы путаете с закладками…
Первоначально избранное было на список групп, в которые можно было не вступать.
harimis
05.12.2016 11:31+9Смотрим чужое избранное ВКонтакте
Слишком громкое название. Описанным образом как минимум нельзя:
- посмотреть людей и группы в закладках
- посмотреть лайки к записям/фото/видео в группах, в которых целевой аккаунт не состоит
- посмотреть лайки к записям/фото/видео на страницах пользователей, если не добиться того-же уровня доступа
glorfindeil
05.12.2016 12:16+3Ревнивая женщина отслеживает лайки там где не надо быстрее и эффективнее
fakir89
05.12.2016 12:16Эх, начала читать статью в надежде получить некую аналитику. Например, сколько моих друзей и как часто лайкают котиков…
varnav
05.12.2016 12:26-4Анастейша — забавное имя. Это то, как американцы читают имя Anastasia?
MikailBag
05.12.2016 19:50varnav
06.12.2016 11:38Разумеется героиня с таким именем там присутствует. Мне интересно откуда это имя взялось в принципе.
K0styan
07.12.2016 14:29Имя классическое греческое, святая соответствующая тоже есть. Имя там, конечно, не как у нас популярно, но и не уникальное.
Опять же, Диснеевский мультик был и лет 10 назад одноименная певица довольно популярна была.
Germanets
05.12.2016 13:40+1Если пользователь А является другом пользователя Б и они подписаны на одно и то же сообщество, то он может узнать под конкретной записью этого сообщество «лайкнул» ли её пользователь Б.
— быть подписаным или вступать в какое-либо сообщество не нужно, достаточно просто иметь возможность просмотреть записи сообщества.
Дополнительно, так как выше уже была указана проблема при более чем 6ти друзьях, лайкнувших запись — сейчас есть возможность временно сократить список друзей, можно даже до одного. То есть на время сканирования мы убираем всех друзей, кроме нашей цели(друзья становятся нашими подписчиками, откуда их можно обратно добавить в друзья без каких-либо дополнительных действий).
В связи с этим, да и не только — предлагаю следующее улучшение алгоритма:
0) убираем из «друзей» всех, кроме нашей «жертвы».
1) выбираем список групп для сканирования: сканируем все группы\подписки «жертвы» + все репосты «жертвы» из групп не входящих в список(например, человек репостнул запись пол года назад а сейчас уже отписался от сообщества, ввиду «палевности»), + сканируем записи всех открытых друзей жертвы на наличие его лайков, и — если это группа — выбираем тоже в список для скана.
2) дополнительно — можно сформировать список топ 10\100 групп во всём вк + топ групп всех его друзей.
3) сканируем полученный список групп(вступать не надо).
4) возвращаем всех своих «друзей» на место.
Если целью является поиск скрытых\не добавленных друзей — можно итеративно пройти всех друзей у друзей жертвы на наличие лайков\комментариев.Germanets
05.12.2016 13:59Ещё один путь поиска, который упустил на первый взгляд — это те, кто не состоит в друзьях «жертвы», но ставили лайки на странице жертвы. Правда с лайками аватаров тут есть косяк — за последний год развелось слишком много ботов-спамеров, обращающих на себя так внимание. До лайков записей боты пока не добрались вроде бы.
Am0ralist
05.12.2016 18:20Вроде как давно уже лайкают новости на стене.
Хотя чаще аватарки, причем иногда даже несколько старых, а не новые.
inoyakaigor
05.12.2016 14:01- Быть с жертвой друзьями в ВК
- Подписаться на те же сообщества что и он
Во-первых, это совершенно не обязательные пункты.
Во-вторых ваш метод костылен. Изучите API ВК. С его помощью можно собрать больше инфы.
К примеру, в своё время я написал на PHP скрипт который собирает подобную инфу. Он собирал лайки к записям, оставленные комментарии и лайки к комментариям. По этой инфе уже многое можно сказать о человеке. В планах было ещё много чего, но, к сожалению, он так и остался по большей части proof-of-concept.
WTFRU7
05.12.2016 14:40+1Эмм — вообще-то для определения данного факта существует открытый метод АПИ — насколько я помню, даже авторизация необязательна — Likes.isLiked
Итого имеем 1 GET-запрос к апи и ответ в json
Andriy1218
05.12.2016 14:45Есть сервисы, в которых есть возможность поиск лайков человека по постам из страниц друзей, групп, поиск лайков фотографий, поиск комментариев и прочей открытой информации. Например, этот.
NEGI_RUS
05.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;
rolecs
05.12.2016 22:03error_msg: 'One of the parameters specified was missing or invalid: item_id is undefined'
Ваш код не работает, также как и код автора.NEGI_RUS
06.12.2016 05:45Давно делал, возможно что-то изменилось. Но здесь важно запускать именно через https://api.vk.com/method/execute?code=..., а не из внутреннего редактора на сайте, т.к. вывод отличается (почему-то).
QueenS
05.12.2016 19:511. 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 имён)vadimmironov
06.12.2016 11:19
BlackRaven86
05.12.2016 21:55Кстати, то, что вы лайкаете (а тем более, комментируете) может отображаться в рекомендуемых новостях у ваших друзей.
newartix
06.12.2016 11:15а с недавнего времени в обновлениях отображается, что комментировали ваши друзья
BlackRaven86
06.12.2016 13:03Действительно, там тоже показывается. И, что плохо, нету настроек приватности для этих комментариев :(
andreymal
07.12.2016 02:19Для комментариев настройка приватности как раз есть)
BlackRaven86
07.12.2016 02:34Есть настройка видимости комментариев к моим записям. А вот чтобы мои комментарии к чужим записям не показывались в Обновления/Рекомендации как сделать?
Stas-Deep
05.12.2016 22:04Как запустить этот код для каждой ссылки?
document.location="https://vk.com/sci"; document.getElementById("public_subscribe").click()
Допустим, у меня есть массив, содержащий ссылки в виде строки, и я хочу, чтобы каждая ссылка автоматически открылась и по окончании загрузки кнопка была нажата?
alex1603
06.12.2016 10:50Спасибо за статью. Например я так же хотел бы отфильтровать пользователей по лайкам, тем же лайкам что и мои а так же уверен на 100% что с тем с кем лайки совпали чаще всего например 99% совпадения то нам есть о чем поговорить. Я просто не лайкаю как правило всякую фигню.
redemption
06.12.2016 10:50+1А к чему это извращение с подпиской на группы пользователя? Это все прекрасно работает, если мы заходим в раздел Новостей пользователя, то есть кликаем по кнопочке «Новости» справа от «Друзья» под аватаркой.
Заходим туда и далее в консоли делаем эти трюки.
monah_tuk
Пока люди добровольно пользуются социальными сетями, все прочие вопросы приватности — детский лепет.