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


Продолжаем исследовать сайтовый API Habrahabr и случайно находим изменения в механике начисления рейтинга.


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



Вступление


Хорошо, Хабр, ты ввел ограничение на 3 поста в день, но ты не можешь просто так запретить флуд в комментах. А как мы знаем, каждый комментарий — это витамины, белки и кальций потенциальные 0.1 рейтинга, которые в сумме дают примерно тот же объем, что и посты.


Вы могли подумать: 'Ааа, просто наплодить комментов с плюсиками и все… Ну так не интересно', а вот и нет — мы еще будем издеваться над API хабра и ловить веселые ошибки.


Итак, для этого рецепта нам потребуются: одна старая статья, чтобы не привлекать внимания, и проверенный аккаунт друга, которого будем толкать в топ.


Кстати, несмотря на то, что статья старая (аж полгода как), в самое обсуждаемое она все равно пролезает:


К счастью, это 'самое обсуждаемое', далеко не на фронт-пейдже висит, можно не переживать.


По сути, нам нужно два запроса: для размещения комментария и его одобрения.


API


Как оказалось, в запросе на размещение комментария все довольно-таки топорно, но нашел странную вещь. Параметры в API для десктопной версии и мобильной несколько различаются.


Например, создавая комментарий из обычного браузера, мы отправляем следующий запрос, указывая в качестве action значение add:

Но если тоже самое делать из мобильной версии, которая идет с префиксом m. в пути сайта, то теперь action приобретает значение mobile_add:

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


Небольшое отступление.
Пытался посмотреть как сделано в iOS приложении хабра, но там оказалось все крайне серьезно и включен SSL Pinning, запрещающий подслушивание, который никак не обойти даже с помощью подложного root сертификата:

Сейчас пока пробую устроить харакири jailbreak своему айфону, чтобы получить возможность поиграться с API посредством черной магии, но это пока в процессе. Технически API вообще-то открыто, есть даже либа на удаве и пыхе, но без token-а, выдаваемого хабром, ничего не получится. Либо просто найду Android устройство, но там тоже нужно колдунство.


А вот с голосованием все уже интереснее.
Оказалось, что метод голосования за комментарии и статьи вообще один и тот же и отличается только единственным параметром, отвечающий за статью в которой находится коммент.
Напомню структуру для голосования за статью:


body = {
# id статьи
    'ti' => params[:id],
    'tt' => 2,
    'v' => 1
}

А вот как выглядит структура голосования за комментарий в ней:


body = {
# теперь это id комментария
    'ti' => params[:id],
    'tt' => 3,
# а вот это id статьи
    'pti' => 322908,
    'v' => 1
}

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


И уже можно успокоиться, запустить скрипт и пойти пить чай, но это же было бы скучно.
Будем играться с параметрами. Что если полю v поставить значение 100? Нет, пишет, что страница не найдена. А может -100? Тоже самое.


Вообще, habr на любое неправильное действие всегда возвращает 404:

Будь то ошибка в параметре или что-то еще. Нельзя понять, действительно ли страницы нет или ты просто где-то опечатался. Наверное, против хацкеров это и действенно, но удобно ли это было в процессе разработки сайта?


И все-таки в определенный момент хабр психанул:

Случилось это, когда v стало равно нулю. Я что-то такое в детском садике от воспитателя слышал, когда кидался хлебом на обеде.


И если при этом еще неправильный id комментария указать, то нас еще пожурят:


Из интересных моментов заметил, что номер комментария инкрементируется по 2, а не по единице.
То есть, если первый коммент идет со значением:


comment_100002

то следующий уже будет


comment_100004

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


Смертные грехи


Но как же без человеческого фактора. В этот раз я решил не скрываться и просто наклепать комментариев к своей старой статье, не пряча ее в черновики. И в этом была моя роковая ошибка.


У кого-то настолько запеклось от вида незаслуженных плюсов, что он не поленился пройтись и для каждого из 50(oh my god) комментариев поставить минус:


К счастью или нет, к тому моменту лавочку уже прикрыли, не успей я набрать даже десятка баллов. Заметил я это только после полного прогона скрипта, зайдя в профиль, чтобы насладиться своей победой… но меня ждало только полное разочарование.


Естественно, я решил это просто так не оставлять и направился прямиком в саппорт c вопросом, куда делся мой рейтинг, который я так усердно накручивал. И вот что мне ответили:


Судя по всему, 'не столь ощутимо' теперь означает 'вообще никак'.


Если серьезно, то на прямой вопрос о том, сколько теперь привносят рейтинга комментарии, саппорт ответил: 'Мы не уполномочены разглашать данную информацию'.


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


Если у вас есть какая-либо информация об этом, то буду рад услышать.


Заключение


Вот так хабр стремительно охладил мой пыл, показав, что до хакера мне еще далеко.


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


UPD1: Номера комментариев идут через 2 для совместимости с Geektimes: на Хабре четные, на Geektimes нечетные. Спасибо lexnekr за пояснение.
UPD2: Подъехало особое мнение насчет инкремента id. Говорят, что это обусловлено конфигурацией MySQL. Спасибо youROCK и kafeman за инфу.
Буду благодарен за пруфы, если кто-то может их предоставить.
UPD3: Но мне больше импонирует третье мнение:

Поделиться с друзьями
-->

Комментарии (43)


  1. frees2
    17.07.2017 11:38
    -5

    Копать надо и в рамках «социальной инженерии».

    frees2 9 июля 2017 в 08:03 –5
    О, очепятка, правильно — гнобление антропогенной теории потепления"

    Профессионал пользователь хабрахабра будет плюсовать-минусовать за качество аналитики и кода, ангажированный же выступает за групповые интересы ( Путина, Порошенко, Христа, Абракадабры, продвигает заговоры, конспирологию, мнимые групповые интересы, без разницы.).

    Группа объединена и управляема, а «оригинальный пользователь» нет.
    Одиночка проигрывает группе.
    Другое дело, падает в хабрахабре качество материалов и аналитики.


    1. Mehdzor
      17.07.2017 11:45
      +3

      Как в топик про хабр попала политика?


      1. Reeze
        17.07.2017 11:51
        +2

        О чём хочет, о том он и комментирует.


      1. frees2
        18.07.2017 14:45
        -1

        Найти закономерности в комментариях, линиях, времени, группах (они довольно чёткие в гиктаймсе, по приглашениям, к примеру), это и есть инженерия, чистый хак это 20% остального. Потом уже json разбирать.

        Быстрей всего ( к любому ресурсу применимо) бывает «Операция Ы & все уже украдено до нас».


  1. lexnekr
    17.07.2017 11:45
    +2

    Из интересных моментов заметил, что номер комментария инкрементируется по 2, а не по единице.

    Если память не изменяет это из-за гиктаймса. У них смещение на 1 должно быть, чтобы не оказалось что на одном и том же id висят разные комментарии.
    Актуально в связи с периодическим сливанием\разделением отдельных проектов ТМ.


    1. Mehdzor
      17.07.2017 11:46

      То есть, на Geektimes нечетные id, а на Habrahabr четные?


      1. wscms
        17.07.2017 11:58

        Совершенно верно


        1. lexnekr
          17.07.2017 12:02

          На самом деле если посмотреть свой профиль (ну или мой), то можно заметить, что даже от 2017 на гиктаймсе есть комменты с чётным Id. Пример.
          Хотя по идее такие должны быть только «архивные» (т.е. до разделения на Хабр и Гиктаймс) и из перенесённых хабов.


          1. Mehdzor
            17.07.2017 12:09

            Круто, добавил инфу в статью. Спасибо.


            1. lexnekr
              17.07.2017 12:10

              Вообще это не 100% инфа.
              Я не могу уже найти пруфлинк.
              Поэтому и написал:

              Если память не изменяет

              Но, по-моему была какая-то статья где об этом говорилось…


              1. Mehdzor
                17.07.2017 12:14

                Если кто-то подкинет еще и пруф, то будет вообще здорово. Но пока все сходится.


                1. LoadRunner
                  17.07.2017 13:05

                  Мой склероз мне говорит, что это из-за механизма хранения комментариев в базе данных и чтобы не было конфликтов при репликации или каком-то подобном механизме. Подробно не помню, то был комментарий одного из разработчиков Хабра.


                  1. jok40
                    17.07.2017 15:47

                    Это сказал один из пользователей хабра. Разработчики тогда в комментариях так и не появились и ситуацию окончательно не прояснили.


                    1. LoadRunner
                      17.07.2017 15:53

                      Да я уже освежил в памяти эти комментарии (там от 12 января комментарий про то же самое). Ну и в другой юбилейной теме от 2008 года то же самое пишут.
                      Но склероз — он такой. Выдаёт желаемое за действительное.


          1. TimsTims
            17.07.2017 12:11

            Значит, его точно никуда не перенесут :) видимо, модератор покрутил, почитал и сказал: «ну вот это точно ГТ!»


        1. kafeman
          17.07.2017 13:17

          Совершенно неверно. Я не являюсь разработчиком Хабра, но из того, что мне известно об их движке, разница в инкременте никак не связана с разделением на HH и GT. Это особенность их конфигурации MySQL.


          1. Mehdzor
            17.07.2017 13:28

            А можете поподробнее рассказать?


            1. kafeman
              17.07.2017 13:37

              Master-slave репликация. Например, на master ID четные, а на slave нечетные. Но для чего именно такой костыль, я тоже не понимаю (неофициальный ответ ТМ — если такой умный, предложи, как сделать лучше).


              1. Mehdzor
                17.07.2017 13:41

                А если добавится еще одна нода, то все по звезде пойдет?


              1. Mehdzor
                17.07.2017 14:31

                Мне кажется, больше подходит этот гениальный ответ.


                Да просто i++ задублировался в коде. С тех пор его никто не правил ).
                Придумали еще – шардинги, борьба с конфликтами...


                1. lexnekr
                  17.07.2017 15:12
                  +1

                  Если бы это было так, то нечётных комментов не было бы в природе.
                  А они-таки есть.
                  И механизм их создания (у меня) ничем не отличается от механизм создания обычных.
                  А так да, возможно всё.


              1. Daniil1979
                17.07.2017 23:05

                Этот костыль для того, чтобы корректно объединять данные двух одинаковых таблиц с разных серверов в главной — чтобы не совпадали номера строк.
                Другой вариант костыля — добавить в ключ кроме столбца с номеррм строки ещё один столбец с номером сервера.


                1. grossws
                  18.07.2017 03:39

                  По сути это не нормальный мастер-мастер, а просто шардинг по остатку от деления на выбранный step.


            1. LoadRunner
              17.07.2017 14:14

              Подробнее можно почитать здесь. Ну как подробнее… Просто первое упоминание подобного инкремента я там и увидел. И уважаемый kafeman и там отметился в комментариях :)


            1. LoadRunner
              17.07.2017 14:32

              Покопался глубже, нарыл этот пост.
              Ну и комментарий в нём от 2008 года. Так что тема с репликацией, похоже, уходит очень глубоко в legacy-код.


  1. ivan386
    17.07.2017 12:09

    Могу предположить что голосование за комментарии к старым статьям больше не влияют на рейтинг.


    1. Mehdzor
      17.07.2017 12:12

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


  1. svistunov
    17.07.2017 12:34
    +3

    Почему-то напомнило "Хакер в столовой"

    День 200-ый

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


  1. delvin-fil
    17.07.2017 13:04

    Я не разбирался с API ТМ, засим вопрос: НЛО может банить вопросы. А поднимать или опускать?


    1. Mehdzor
      17.07.2017 13:16

      Это вопрос стоит задать разработчикам хабра, поскольку это API нигде не торчит и послушать его нет возможности.


      1. delvin-fil
        17.07.2017 13:27

        Хм… То есть, к опциям НЛО доступа нет?
        В общем то логично.


  1. kafeman
    17.07.2017 13:22

    Пожалуйста, перестаньте называть AJAX-запросы API. Это вносит путаницу.

    /me создатель API-библиотеки для питона.


    1. Mehdzor
      17.07.2017 13:31

      Знакомые лица на гитхабе)


    1. Carburn
      18.07.2017 13:04

      AJAX запросы к API


  1. youROCK
    17.07.2017 13:27

    Что касается четности id комментов: в mysql есть опции auto_increment_step и auto_increment_offset, которые влияют на это. Предназначены эти опции для мастер-мастер репликации, чтобы id строк, которые были вставлены на разных мастерах, не пересекались. Но можно и как-нибудь по-другому использовать эту опцию, все ограничивается лишь фантазией :)


    1. Mehdzor
      17.07.2017 13:34

      Добавил вариант в статью. Будет здорово, если какой-нибудь пруф еще подъедет.


      1. viper4u
        18.07.2017 11:26

        Необходимо для репликации master-master, чтобы счетчики не пересекались. Пример


  1. zRrr
    17.07.2017 13:30
    +1

    Молодой человек, вы ходите по удивительно тонкому льду.


    1. Mehdzor
      17.07.2017 13:42
      +1

      Ладно бы я куски кода из исходников хабра публиковал. А так все невинно, чуть более, чем полностью.


      1. vvzvlad
        19.07.2017 17:13
        +1

        Банили и за меньшее, тащемта.


  1. LoadRunner
    17.07.2017 14:49
    +1

    Кстати, возможно, некоторые вопросы про новую систему рейтинга Хабра раскрыты здесь. Но это не точно.


  1. d3us
    18.07.2017 19:50

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


    1. Mehdzor
      18.07.2017 19:50

      Думал, теория не подтвердилась.