34

Ищем API Пикабу. Часть 1.5. Интермедия

Предыдущая часть: Сказ о том, как Рыцарь свежего смог достучаться до самого сердечка ИЛИ ищем API Пикабу

Сразу хочу поблагодарить комментаторов в предыдущем посте за проявленный к теме интерес, за вопросы и за предложения. Ознакомившись с комментариями (целых 14 штук, чуть не надорвался!), я решил написать этот промежуточный пост и разобрать альтернативные пути дальнейших действий.


Итак, прошлый пост закончился на том, что я успешно перехватил трафик с приложения Пикабу для Android, увидел волшебную ссылку https://api.pikabu.ru/v1 и определил, что обмен данными производится по JSON (логично). Но пикабушники не были бы пикабушниками, если бы обошлись без подколов в комментах. Люблю вас, честно.


Проблема в том, что в обнаруженном API мог оказаться вообще любой формат - JSON, XML, YAML или, прости хоспаде, голый HTML. И я покажу HTML внутри ответа от сервера в формате JSON чуть далее. Морально я был готов увидеть в протоколе вообще всё, что угодно, но это оказался JSON, чему я был несказанно рад, так как лично мне с ним работать много проще, чем с тем же XML, да и читать его в сыром виде приятнее, чего греха таить. В качестве особого извращения, можно возвращать результат в виде base64(zlib(protobuf())). Упаковка и распаковка ляжет целиком на плечи серверов и клиентов, зато, с высокой долей вероятности, будут пересылаться меньшие пакеты данных, что актуально для спутникового интернета где-нибудь у черта на куличиках.

Ладно, не буду превращать пост в ответы на комментарии, я только один раз, всего лишь на пол шишечки <3

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

На данный момент, самый горячий пост - Оскорбил. Его и буду препарировать. Погнали.

@krot2

А что помешало в хроме переключить на мобильную версию и открыть devtools

Справедливое замечание. Но мне это даже в голову не пришло. Наверняка, это была заводская блокировка, чтобы я не заморачивался всякими анализами HTML. У меня Firefox, поэтому выполню аналогичные действия. Тут это называется "Адаптивный дизайн".

Вероятно, так выглядит Пикабу на iPhone X/XS. Не знаю, не хочу проверять в живую. Открываю devtools (они же инструменты разработчка на F12) и первое, что я вижу - разметка страницы.  Допустим. Ищу текст статьи, вот он:

Чтобы до него добраться надо, как я понимаю, найти блок div с классом(-ами?) "story-block story-block_type_text". Но не пинайте строго, я в вебе не особо разбираюсь и сайты ранее не парсил, умею только читать (глазами и головой) разные штуки и анализировать прочитанное. Как по мне, такое название класса не выглядит чем-то фундаментально неизменяемым, но кто его знает, на самом деле. Могу ошибаться, но это, вроде, ссылка на таблицу стилей. Получается, если стилисты поменяют название класса, то парсер посыпется. Неприятно. Однако, хочу заметить, что посыпется любая программа, заточенная под специфическую строку, даже в случае JSON.

Итог - требуется парсер HTML. Конкретно эта страничка весит ~404 кб (для проверки размера я сохранил .html файл на диск и посмотрел его размер). Пока не знаю, много это или мало, разберемся чуть позже.

@gosnorkocontrol

не проще ходить парсером по https://pikabu.ru/new?twitmode=1&of=v2&page=1 и т.д.? там html в data - простетский, все посты удобно разбиты на обьекты.

Та-а-ак, а это уже интересно. Давай попробуем: Оскорбил

{"result":false,"message":"Krasavchik"}

Спасибо, товарищ программист бэкэнда, стараемся! Жаль, что не удалось договориться :) Ответ пришел, тем временем, в JSON. С конкретным постом не прокатило, надо попробовать в общей ленте: https://pikabu.ru/?twitmode=1&of=v2

Есть ответ! В JSON! Похоже, загрузилась какая-то часть из 7006 постов в горячем. Есть какая-то реклама (ключ ads), есть какие-то stories (aka посты), поглядим...

Спасибо, Киану. Ты очень точно передал моё выражение лица. Продолжим... Ключ "html", да и содержимое со всякими там div-ами. Да, похоже на правду. Вот только множество переносов строк (\n) и табуляций (\t) напрягает. Ладно, надо найти какой-нибудь html beautifier, чтобы посмотреть на это дело в нормальном виде.

Как обычно, искать лень, а на первом попавшемся сайте по выравниванию HTML эскейп-символы не убираются. Но я же программист C++, я знаю аж 2 способа, как от них избавиться. Их можно заменить в каком-нибудь Notepad++ на пустой символ или просто напечатать все содержимое в программе С++. Программисты С++ не всегда ищут простые пути. Зачастую, лучший путь тот, что занимает меньше кликов :)

Хорошо, но можно сделать еще лучше.

Во, в самый раз. И что же я теперь вижу? То же название класса в теге div, то же содержимое. Дальше углубляться не вижу смысла.

Сразу виден минус этого подхода - предоставленные мне ключи запроса не подошли для получения данных конкретного поста, а было бы хорошо грузить только конкретные посты, а не всю пачку целиком. И еще возникает вопрос о способе получения "среза" постов за определенный период. Думаю, способа запросить у сервера список допустимых ключей для запроса нет, ну да ладно. Требуется два инструмента - парсер для JSON и парсер HTML. Размер - ~156 кб, но это не один пост, а целая пачка с главной страницы. Требование двух инструментов не является таким критичным, как невозможность использовать этот способ при загрузке конкретно одного поста.

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

Третий способ - воспользоваться API мобильного приложения. Поехали.

Я буду пользоваться всё тем же mitmproxy и эмулятором с установленным пропатченным приложением Пикабу, хотя и ознакомлюсь с питоновскими библиотеками, предложенными в комментариях, чуть позже. Открываю через приложение страничку горячего. Запрос:

Щьёрт побьери! Пока писал пост, горячее обновилось и сравнить размеры не получится. Вижу номер запроса страницы. Хорошо. Ответ:

Содержимое ответа скрыто, поэтому предлагаю поверить мне на слово, что там JSON :) Никакой пользы этот скриншот, кроме размера в 241.9 кб в рамках текущего разбора не несет, но почему бы и нет? Интернет не казенный, так что расчехляйте свои байты, гулять так гулять! А, вы уже?...

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

Вах, целочисленный story_id, по которому можно просто в цикле грузить посты с Пикабу. Супер. Страница номер 1? Комментарии? В ответе пришла вся информация по посту, включая какой-то список комментариев, возможно полный. Приведу наиболее интересную часть ответа:

story_data - список блоков поста, в нашем случае, один блок типа "t" (text), но который содержит какие-то теги HTML. Вполне возможно, тут же будет присутствовать и форматирование, и ссылки, но с этим буду разбираться потом. Также, тут присутствует полный URL на пост. Я не знаю, возможно ли осуществлять переход по конкретным постам в десктопной/мобильной версии, имея на руках только номер поста, но тут есть полная ссылка, что, определенно, плюс. Хотя я бы возвращал только относительный путь к посту, независимо от домена, а сам домен настраивал в момент первого включения приложения или периодически возвращал бы его в процессе обновления ленты. Короче, я бы не стал отправлять его постоянно, только время от времени. Мало ли... Есть также информация о пользователе - его идентификатор в БД, ник и ссылка на профиль. Ну и был обнаружен интересный ключ sber_donation_url, но тут и так всё понятно :)


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

Плюсы - можно грузить что угодно, в каком угодно порядке и в любое время. Все эксперименты проводились на приложении без аккаунта :) Нужен один инструмент для работы с JSON. Данные приходят в подготовленном для обработки виде, удобнее не придумаешь. Размеры пакетов.... Ну хз, где-то может быть больше, где-то меньше. В готовой странице можно оставлять только необходимые для работы данные/ссылки, тут же прилетает куча дополнительной информации (количество плюсов и минусов для самостоятельного подсчета соотношения, например), многое дублируется. Я бы добавил в запрос еще ключ типа verbose, и если false - то присылать только то, что необходимо для отображения по минимуму, без комментариев. Короче, тут есть простор для воображения.

Минус я вижу только один - нужно исследовать алгоритм авторизации приложения и расколоть формат запросов (есть там один противный hash, пока не ясно, от чего он считается). К каждому запросу (кроме двух первых) прикрепляется два каких-то неопознанных идентификатора. Один из них - deviceuid, и вполне может оказаться, что он не просто сгенерирован на устройстве один раз. Есть подозрение, что придется изрядно помучаться, прежде чем получится эмулировать процесс получения данных по этому способу.

Для себя я сделал выбор - буду продолжать намеченный курс и исследовать приватный API приложения Пикабу. Мне он кажется наиболее гибким и наиболее простым в починке, в случае, если что-то поломается.

Это должен был быть маленький оффтоп-пост, я не хотел, честно! Благодарю за внимание, мне приятно, что вы проявляете интерес к моему творчеству. Будьте чуточку добрее, мы тоже люди.

Вы смотрите срез комментариев. Показать все
0
Автор поста оценил этот комментарий

Спасибо, очень интересно, подписался.


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

раскрыть ветку (15)
2
Автор поста оценил этот комментарий

Про время:

Я проводил эксперименты. Через пару минут уже нельзя повторить запрос с теми же параметрами, которые были. Ну и поле с текущим временем намекает, что оно как-то там замешано. Откуда берется правильное время что-то не посмотрел, увы.

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

раскрыть ветку (4)
2
Автор поста оценил этот комментарий
Ну хватит из меня вытягивать информацию, должны же у меня остаться хоть пара козырей в рукаве для создания вотэтоповоротов, правильно?)
раскрыть ветку (2)
1
Автор поста оценил этот комментарий
Ну вообще на мой взгляд, администрация не должна была пропускать такой пост. Тут у тебя прям жесткое препарирование ))) Плюсанул )
1
Автор поста оценил этот комментарий

Да я не вытягиваю, я наоборот ею делюсь =)

А постов всё равно буду ждать. Вдруг повезет и хватит терпения пройти весь этот путь до конца. Буду очень за вас рад. Потом может и сам тоже разберусь с этим маленьким неприятненьким хешем.

1
Debug mode
Автор поста оценил этот комментарий
про время, поля с текущим временем там в явном виде нет (хотя мб где-то в куках они на скрине явно не все), но в принципе есть стандартный http заголовок в который оно кладется
З.Ы. при использовании самого приложения ему наплевать на системное время с точностью до валидации сертификата
0
Debug mode
Автор поста оценил этот комментарий
администрация могла бы предоставить открытый api, пусть даже с ограниченными ключами дабы альтернативных клиентов не плодили

З.Ы. а как отреверсить хэш? соль мы не знаем, порядок конкатенации полей и сепараторы тоже (понятно что мы можем декомпилировать приложение, но это уже не реверс хэша)
раскрыть ветку (9)
0
Автор поста оценил этот комментарий

Про апи я уже давно общаюсь с администрацией, но всё никак, увы. Но надежды не теряю =)


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

раскрыть ветку (8)
0
Автор поста оценил этот комментарий
Я спалил ряд вызовов StringBuilder, штук 6-7 подряд, так что надежда теплится.

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

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

В данном случае уход в нативную означает, что они спрятали алгоритм расчета хеша из Java в C/C++, который уже сильно сложнее декомпилировать. У меня была мысль тупо взять эту библиотеку и использовать её прямо так, но это не так-то просто: и билд под правильную архитектуру процессора надо найти, и как-то с Java Native Interface разобраться. Слишком сложно для меня, я даже C/C++ не знаю.


Соль нигде не пересылается, она жестко зашита в код.

раскрыть ветку (6)
2
Автор поста оценил этот комментарий
Псст. Соль найдена. Алгоритм хеширования почти понятен. Надо разобраться с параметрами, там, возможно, все не так просто, как хотелось бы. Но как же я заебался, ты не представляешь. У меня бомбило так, что следующий пост будет тоже полон боли, уж я постараюсь поделиться ей в полном объёме :)
1
Debug mode
Автор поста оценил этот комментарий
достаточно понять что это, никто не будет заморачиваться с нестандартными хэшами, скорее всего какой-нибудь sha разрядность которого можно посчитать по длине выходной строки
раскрыть ветку (4)
0
Автор поста оценил этот комментарий
16 байт. Моя ставка на md5
раскрыть ветку (3)
0
Автор поста оценил этот комментарий

Сыграла ставка?)

раскрыть ветку (1)
0
Автор поста оценил этот комментарий
Да, тогда это был md5.
Автор поста оценил этот комментарий
Как это поможет найти баян в картинке на которой текст тот же, а оформлена по другому? Поиск текста делается легко в гугл site:pikabu.ru ключевое слово
Вы смотрите срез комментариев. Чтобы написать комментарий, перейдите к общему списку

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества