Поиск скрытых подсайтов на DTF с помощью открытых данных (и одного бага)
Как я их искал, сколько их, и жив ли ньюбай. Скандалы, интриги, расследования — показать все, что скрыто.
Как я искал скрытые подсайты
В своем посте про анализ пользователей DTF по открытым данным я сделал один технический вывод, который не очень интересен обычному человеку, но который полезен мне:
Получается, 27 мая 2018 на DTF была миграция базы данных и/или рефакторинг, чтобы и пользователи, и подсайты были в одном и том же пространстве идентификаторов.
Это значит, что, например, сущность с ID 12 может быть пользователем, а сущность с ID 13 — подсайтом. Если я запрашиваю пользователя с ID 13, то получаю ошибку 404 — не найдено.
Когда я собирал базу данных пользователей, то я записывал не только самих пользователей, но и ошибки, если они случались. У меня в базе 436 идентификаторов, для которых я получил ошибку 404. Это могут быть либо удаленные пользователи, либо подсайты. Я могу попробовать запросить информацию о подсайтах с такими идентификаторами. Если это действительно подсайт, и у меня есть к нему доступ, то я получу информацию о нем. Если это удаленный пользователь, то я получу ошибку 404 — подсайт не найден. А если это закрытый подсайт, то я скорее всего получу ошибку 403 (нет доступа) или 483 (доступ только для одобренных пользователей).
Чтобы еще сильнее сократить перебор, я запросил список всех открытых подсайтов DTF. Для этого не нужно перебирать все идентификаторы, так как у API основы есть команда, через которую можно запросить все открытые подсайты:
- https://api.dtf.ru/v1.9/subsites_list/sections — обычные подсайты
- https://api.dtf.ru/v1.9/subsites_list/companies — корпоративные подсайты
Так я записал себе в базу 282 подсайта. Получается, теперь мне нужно перебрать всего 154 идентификатора — это можно сделать за пару минут (250000 пользователей я записывал 4 суток).
Сказано-сделано. Я перебрал эти идентификаторы и для трех из них получил ошибку 483:
- 104593
- 141288
- 203796
Получается, на DTF есть три скрытых подсайта. Но что это за подсайты?
Спасибо Простагме за пул-реквест в моем репозитории со скриптами для анализа Очобы — благодаря ему я узнал про эту команду API:
Она дает все посты для какого-то подсайта. Сама по себе команда мне не очень интересна, но у нее есть полезная особенность. Если у меня нет доступа к подсайту, то эта команда вернет пустой массив. Но если в нем есть закрепленный пост, то эта команда его покажет, даже если подсайт закрытый. А у каждого поста есть информация о том, где он опубликован. Получается, одного закрепленного поста мне достаточно, чтобы через эту команду получить адрес, название, и описание скрытого подсайта.
Возможно, это баг. А может, оно так и должно работать? Откуда мне знать? Ширяев, не бань меня!
В общем, я смог идентифицировать два из трех подсайтов:
С третьим подсайтом это не прокатило, так как там не было закрепленного поста. Но по очень удачному совпадению Простагма в комментариях к одному моему посту написал вот это:
Да, мне очень повезло, что упоминание notacowlevel было именно в тот день, когда я расследовал скрытые подсайты. Так что спасибо Простагме уже второй раз. Так я получил информацию о последнем скрытом подсайте.
Как я изучал активность в скрытых подсайтах
С постами принцип тот же, что с пользователями и подсайтами. Их можно просто запрашивать один за другим, и если это пост из закрытого подсайта, то я для него получу ошибку 403 или 483. А так как я сохраняю все ошибки, я могу построить график.
Но тут не все так просто. Если для какого-то поста я получил ошибку 403, то я не знаю, когда он был опубликован. Когда создается новый пост, он получает идентификатор, который на 1 больше, чем пост, который был создан до него.
Проблема в том, что созданием поста считается его первое появление в черновике, а дата — это время публикации. Между моментом создания и моментом публикации может пройти сколько угодно времени, так как иногда посты лежат месяцами в черновиках. Но с некоторой погрешностью все-таки можно принять, что посты с близкими идентификаторами имеют близкое время публикации. Я считал время публикации скрытого поста как среднее время между 10 открытыми постами до него и 10 открытыми постами после него.
Получаем такой график:
В январе 2020 что-то случилось. Увеличим график:
На самом деле, я знаю, что случилось в январе 2020. Примерно 13-14 января 2020 появился ньюбай. Потом Ширяев начал его шатать. Огромный пик 18-19 января — это битва за ньюбай. Потом подсайт стал закрытым, и я не знаю, что там происходило дальше.
Из того же графика видно, что какая-то движуха в скрытых подсайтах все еще есть. Это точно не подсайт с коровами, так как там всего 174 поста за все время. Админский подсайт тоже вряд ли генерирует столько постов.
Бритва Оккама говорит, что если такое количество постов началось с созданием ньюбая, то и сейчас эти посты создаются в ньюбае.
Так что признавайтесь, я вас спалил, жив ньюбай или нет? Я вижу, что жив.