Кадры из фильма «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)


  1. monah_tuk
    05.12.2016 10:49
    +20

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


  1. habradante
    05.12.2016 11:01
    +25

    Те кто заботятся о приватности — не лайкают :)


    1. iChaos
      05.12.2016 13:32
      +14

      Те, кто заботится о приватности — вообще не пользуются социальными сетями ;)


      1. LeReve
        06.12.2016 16:57

        Ну можно, например, пользоваться соц. сетью с левыми данными и без использования личных фотографий. Чем это вредит приватности?


        1. extraterrestrial
          06.12.2016 19:00

          тем что друзья не такие


          1. LeReve
            07.12.2016 09:53
            +1

            Речь о приватности друзей или вашей? Если вашей, тогда зачем вы добавляете друзей?


            1. extraterrestrial
              07.12.2016 10:57

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


              1. ivan386
                07.12.2016 14:16
                +2

                Да всё так же как и в остальном интернете. Музыку послушать. Фильмы, клипы, фото посмотреть. Почитать посты и комментарии. Только вот поделиться баянами не с кем.


              1. LeReve
                08.12.2016 10:24

                А вы не задумывались, что Хабр тоже соц.сеть. Только узконаправленная. Так же и в других соц.сетях можно выбрать только интересующие паблики/темы. И тихо читать их, не думая о том, что кто-то про вас узнает.


          1. EuHex
            07.12.2016 10:32

            примерно тоже самое с мессенджерами… в чем проблема Ricochet или Tox? Приватность, защита, все вроде ок. Только поговорить там можно только с такими же криптофриками и гиками, а остальные друзья плевать хотели и все равно будут писать в ВК…


        1. esh_ballzer
          06.12.2016 23:36

          Но контора то пишет!


      1. K0styan
        07.12.2016 14:21
        +1

        Те, кто не пользуются вообще — рискуют стать жертвой identity theft. Никто не мешает зарегистрировать за вас аккаунт и делать от вашего имени что угодно.

        Безопаснее все-таки завести аккаунт, добавить в друзья десяток человек, ваше знакомство с которыми ни для кого секретом не является, и так это дело и оставить. Если появится ваш виртуальный двойник — всегда можно сказать «это не мой аккаунт, мой — вот этот».

        Впрочем, это тоже можно назвать «не пользоваться» :)


    1. Nagg
      05.12.2016 18:41
      +6

      Мачете не лайкает (с)


    1. LekaOleg
      06.12.2016 16:57

      Товарищи!)
      Приватная жизнь — это пережиток прошлого! Большие папы уже давно следят за всем и всё знают)))


      1. ivan386
        06.12.2016 17:35
        +1

        Даже если так это не значит что нужно теперь ходить по улице голым.


      1. K0styan
        07.12.2016 14:31
        +1

        По большому счету та штука, что мы сейчас называем приватной жизнью, была доступна человеку в принципе очень небольшой период времени — очень примерно с конца Великой Депрессии (или даже второй мировой) до распространения кредитных карт.

        До того всегда был кто-то рядом. В деревне — соседи (там секретов в принципе нет). В городе — по-разному: у тех, кто победнее, те же соседи или хозяин жилья; у тех, кто мог себе позволить собственную квартиру — прислуга. Про совсем богатых людей не говорю: штат прислуги был такой, что секреты были невозможны. Только с 40-х, когда стоимость отдельного жилья снизилась, а стоимость найма прислуги возросла, стало возможным жить без чужих ушей за ближайшей стенкой.

        Ну а с середины 70-х уже Большой Брат в виде компьютеризованных систем подоспел.


  1. andreymal
    05.12.2016 11:12
    +5

    После очередного редизайна
    Если имеется в виду тот, что в этом году, то… С пробуждением! https://vk.com/wall-32295218_3027


  1. Dev_007
    05.12.2016 11:18
    -1

    Вроде как в блоке «like_tt_owners me_hidden _content» отображаются только 6 последних лайкнувших пользователей, вне зависимости от их общего количества, разве нет?

    Т.е. получается, что далеко не факт, что ваш «Кристиан Грей» найдется, если он поставил лайк достаточно давно в популярном посте.


    1. andreymal
      05.12.2016 11:24
      +2

      Первыми всегда отображаются друзья


    1. vadimmironov
      05.12.2016 11:28
      -1

      Там не 6 последних, а 6 случайных(меняются после refresh). Плюс, если среди лайкнувших есть твои друзья — они отображаются всегда.


      1. Dev_007
        05.12.2016 12:51
        +1

        Спасибо за пояснения, но получается, что если среди лайкнувших данный пост моих друзей больше 6-ти, то отследить кого-то конкретного может не получиться, т.к. он может не отобразиться. Шансы тем меньше, чем больше мой френдлист, иначе говоря, методика не 100% рабочая.

        Создавать же отдельный аккаунт и добавлять во френды единственную жертву (попробуйте еще ее убедить принять вас в друзья) с целью последующего отслеживания ее лайков — это, мягко говоря, несколько неоправданно.


        1. andreymal
          05.12.2016 18:17
          +5

          У этой всплывашки есть полное всплывающее окно, в котором можно посмотреть полный никак не ограниченный список как друзей, так и остальных лайкнувших (и в API это всё тоже есть, да)


          1. Dev_007
            06.12.2016 07:39

            Посмотреть конечно можно, но скрипт, приведенный в статье, оперирует данными именно из мелкой всплывашки.

            Ну а насчет API вы совершенно правы: метод likes.getList позволяет избавиться от разбора всплывашек и неопределенности с отображением большого списка друзей в них.


      1. Flashmond
        05.12.2016 12:55
        +1

        А если эту запись лайкнули 10 моих друзей. Посмотрите под вашей аватаркой, например. И, насколько я помню, среди друзей отображаются 6 последних, а не случайных.


      1. DaemonGloom
        05.12.2016 13:56
        +3

        Может, тогда надо загружать список всех лайкнувших? В браузере это можно сделать просто кликнув на надпись «Понравилось XX людям» во всплывающем окошке.


  1. SLASH_CyberPunk
    05.12.2016 11:22
    +3

    Вы путаете избранное и лайки, поменяйте заголовок!


    1. andreymal
      05.12.2016 11:24
      +1

      Лайк это одновременно добавление в избранное, так что не путает
      Правда, таким способом можно достать далеко не всё содержимое избранного


      1. kir_vesp
        05.12.2016 11:30

        Если добавить ещё брутфорс по фоткам, видео и дополнительно прогнать это не только по сообществам, но и по друзьям с открытыми страницами… Покрытие избранного станет выше)


      1. SLASH_CyberPunk
        05.12.2016 12:41

        А вы путаете с закладками…
        Первоначально избранное было на список групп, в которые можно было не вступать.


  1. harimis
    05.12.2016 11:31
    +9

    Смотрим чужое избранное ВКонтакте

    Слишком громкое название. Описанным образом как минимум нельзя:
    • посмотреть людей и группы в закладках
    • посмотреть лайки к записям/фото/видео в группах, в которых целевой аккаунт не состоит
    • посмотреть лайки к записям/фото/видео на страницах пользователей, если не добиться того-же уровня доступа


  1. glorfindeil
    05.12.2016 12:16
    +3

    Ревнивая женщина отслеживает лайки там где не надо быстрее и эффективнее


    1. istui
      05.12.2016 12:54

      100%

      А вообще есть еще сайты, анализирующие кросс-лайки на страницах, и т.д.


    1. rubikon
      05.12.2016 15:42
      +3

      Я тут лайкнул не ту… Жена мозг выела весь за выходные)


  1. fakir89
    05.12.2016 12:16

    Эх, начала читать статью в надежде получить некую аналитику. Например, сколько моих друзей и как часто лайкают котиков…


  1. varnav
    05.12.2016 12:26
    -4

    Анастейша — забавное имя. Это то, как американцы читают имя Anastasia?


    1. MikailBag
      05.12.2016 19:50

      1. varnav
        06.12.2016 11:38

        Разумеется героиня с таким именем там присутствует. Мне интересно откуда это имя взялось в принципе.


        1. K0styan
          07.12.2016 14:29

          Имя классическое греческое, святая соответствующая тоже есть. Имя там, конечно, не как у нас популярно, но и не уникальное.

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


          1. varnav
            07.12.2016 17:54
            +1

            Да, но по гречески ????????? а не ?????????


            1. K0styan
              09.12.2016 11:12

              А, похоже, я ваше недоумение не так понял. Ну да, английское прочтение Anastasia — т.е. написанного «усредненной» латынью греческого имени.


  1. Germanets
    05.12.2016 13:40
    +1

    Если пользователь А является другом пользователя Б и они подписаны на одно и то же сообщество, то он может узнать под конкретной записью этого сообщество «лайкнул» ли её пользователь Б.
    — быть подписаным или вступать в какое-либо сообщество не нужно, достаточно просто иметь возможность просмотреть записи сообщества.

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

    В связи с этим, да и не только — предлагаю следующее улучшение алгоритма:
    0) убираем из «друзей» всех, кроме нашей «жертвы».
    1) выбираем список групп для сканирования: сканируем все группы\подписки «жертвы» + все репосты «жертвы» из групп не входящих в список(например, человек репостнул запись пол года назад а сейчас уже отписался от сообщества, ввиду «палевности»), + сканируем записи всех открытых друзей жертвы на наличие его лайков, и — если это группа — выбираем тоже в список для скана.
    2) дополнительно — можно сформировать список топ 10\100 групп во всём вк + топ групп всех его друзей.
    3) сканируем полученный список групп(вступать не надо).
    4) возвращаем всех своих «друзей» на место.

    Если целью является поиск скрытых\не добавленных друзей — можно итеративно пройти всех друзей у друзей жертвы на наличие лайков\комментариев.


    1. Germanets
      05.12.2016 13:59

      Ещё один путь поиска, который упустил на первый взгляд — это те, кто не состоит в друзьях «жертвы», но ставили лайки на странице жертвы. Правда с лайками аватаров тут есть косяк — за последний год развелось слишком много ботов-спамеров, обращающих на себя так внимание. До лайков записей боты пока не добрались вроде бы.


      1. Am0ralist
        05.12.2016 18:20

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


    1. ivan386
      05.12.2016 15:06
      +1

      А ещё можно просто открыть ленту друга и считать лайки.


  1. inoyakaigor
    05.12.2016 14:01

    • Быть с жертвой друзьями в ВК
    • Подписаться на те же сообщества что и он


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

    К примеру, в своё время я написал на PHP скрипт который собирает подобную инфу. Он собирал лайки к записям, оставленные комментарии и лайки к комментариям. По этой инфе уже многое можно сказать о человеке. В планах было ещё много чего, но, к сожалению, он так и остался по большей части proof-of-concept.


  1. WTFRU7
    05.12.2016 14:40
    +1

    Эмм — вообще-то для определения данного факта существует открытый метод АПИ — насколько я помню, даже авторизация необязательна — Likes.isLiked

    Итого имеем 1 GET-запрос к апи и ответ в json


  1. Andriy1218
    05.12.2016 14:45

    Есть сервисы, в которых есть возможность поиск лайков человека по постам из страниц друзей, групп, поиск лайков фотографий, поиск комментариев и прочей открытой информации. Например, этот.


  1. 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;
    


    1. rolecs
      05.12.2016 22:03

      error_msg: 'One of the parameters specified was missing or invalid: item_id is undefined'

      Ваш код не работает, также как и код автора.


      1. NEGI_RUS
        06.12.2016 05:45

        Давно делал, возможно что-то изменилось. Но здесь важно запускать именно через https://api.vk.com/method/execute?code=..., а не из внутреннего редактора на сайте, т.к. вывод отличается (почему-то).


        1. andreymal
          07.12.2016 02:18

          Потому что у вас в коде версия API устаревшая 3.0 вместо актуальной 5.x?


          1. NEGI_RUS
            07.12.2016 22:50

            Действительно. Переписал на актуальную версию, вдруг кому пригодится.
            Ссылка


  1. andresivanov
    05.12.2016 14:46

    А если скрыть подписки и группы?


    1. nitesco
      05.12.2016 19:50

      В VK подписки не скрываются.


  1. mydim
    05.12.2016 15:42
    -3

    Добый день,

    А где ты взял getElementsByClassName? =)


    1. ivan386
      05.12.2016 15:53
      +1

      Это стандартный API в браузерах.


  1. sublihim
    05.12.2016 19:50

    «Больной ублюдок»…


  1. QueenS
    05.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 имён)


    1. vadimmironov
      06.12.2016 11:19

      Это зависит от количества блоков на странице. Достаточно поменять индекс у массива x (скорее всего на [2]) и будет работать. В любом случае эти трудности оказались не нужны. В комментариях
      здесь и здесь указали как сразу можно открыть ленту друга. А по ней уже пробежаться последним скриптом.


  1. BlackRaven86
    05.12.2016 21:55

    Кстати, то, что вы лайкаете (а тем более, комментируете) может отображаться в рекомендуемых новостях у ваших друзей.


    1. newartix
      06.12.2016 11:15

      а с недавнего времени в обновлениях отображается, что комментировали ваши друзья


      1. BlackRaven86
        06.12.2016 13:03

        Действительно, там тоже показывается. И, что плохо, нету настроек приватности для этих комментариев :(


        1. andreymal
          07.12.2016 02:19

          Для комментариев настройка приватности как раз есть)


          1. BlackRaven86
            07.12.2016 02:34

            Есть настройка видимости комментариев к моим записям. А вот чтобы мои комментарии к чужим записям не показывались в Обновления/Рекомендации как сделать?


            1. andreymal
              07.12.2016 02:37
              +1

              Скрытый текст
              image


              1. BlackRaven86
                07.12.2016 22:49

                Вот оно что. Спасибо!


  1. Stas-Deep
    05.12.2016 22:04

    Как запустить этот код для каждой ссылки?

    document.location="https://vk.com/sci";
    document.getElementById("public_subscribe").click()
    

    Допустим, у меня есть массив, содержащий ссылки в виде строки, и я хочу, чтобы каждая ссылка автоматически открылась и по окончании загрузки кнопка была нажата?


    1. Free_ze
      07.12.2016 09:28

      Вам на Тостер


  1. alex1603
    06.12.2016 10:50

    Спасибо за статью. Например я так же хотел бы отфильтровать пользователей по лайкам, тем же лайкам что и мои а так же уверен на 100% что с тем с кем лайки совпали чаще всего например 99% совпадения то нам есть о чем поговорить. Я просто не лайкаю как правило всякую фигню.


  1. redemption
    06.12.2016 10:50
    +1

    А к чему это извращение с подпиской на группы пользователя? Это все прекрасно работает, если мы заходим в раздел Новостей пользователя, то есть кликаем по кнопочке «Новости» справа от «Друзья» под аватаркой.
    image
    Заходим туда и далее в консоли делаем эти трюки.


  1. Urbem
    06.12.2016 10:50

    *id_пользователя

    И ВСЕ! хотя проблемы начинаются когда там не ИД, а подпись


  1. fusion7
    06.12.2016 10:50

    Тоже в свое время был интересен вопрос поиска лайков и комментариев Вконтакте, среди фотографий, в группах. Кому интересны мои исследования — куча исходников здесь. Воспользоваться можно здесь.