Одним томным и уже порядком надоевшим вечером, я, листая официальное приложение хабра, в который раз загибал пальцы, по одному за каждую нерабочую фичу. Тут, например, нельзя прокомментировать, здесь отказывают в праве голоса, и вообще, почему не видно формул на экране?
Было решено: нужно что-то удобное, приятное, своё. Что насчёт своего приложения для Хабра?
Давайте, для понимания ситуации, приведу несколько скриншотов.
Как-то так выглядит это — оф. приложение habr.com
- Нельзя оценить публикацию, рейтинг которой отличен от 0
- Не всегда можно написать комментарий
- Не работают опросы
- В тёмной теме не видно формул (чёрное на чёрном)
- Доступны не все закладки
Да, приложение не обновляли с августа прошлого года, но всё равно плохо. В общем, надо исправлять.
Часть первая. В поисках доступа.
Быстрый запрос к Google «habrahabr API» выдает уже порядком устаревший репозиторий на гитхабе, не обновлявшийся с 21 ноября 2016, а это, на минуточку, два с половиной года.
Не обращая внимания на то, что это — PHP, листаем вниз и читаем:
Получение идентификатора приложения
Воспользовавшись этой формой на Хабрахабре, нужно кратко описать суть нового приложения и цель, для которой ему нужен API.
Не вопрос, если надо получать доступ, значит надо. Пишем письмо (в сокращении):
Есть желание сделать приложение для Хабра на основе PWA. Причин этому несколько.
Первая и самая понятная: приложение для Android не удовлетворяет моим персональным требованиям.
Вторая: не хватает нативных уведомлений о всяческих вещах, которые обычно приходят на почту (комментарии, например).
Третья: персональные дайджесты (как перспектива) по интересующим меня людям/хабам, учитывая мои интересы.
Ответ, конечно, был не очень приятным, но хоть честным:
К сожалению, доступ к нашему API в настоящий момент не предоставляется. Мы планируем возобновить предоставление доступа после того как закончим доработку API, но каких-либо точных дат у нас пока нет, т.к. в данный момент мы заняты решением других приоритетных задач.
«Ладно, не беда! Что-нибудь придумаем!» — сказал я себе, и начал искать.
Часть вторая. Глубокие раскопки.
Исходя из логики, если приложение работает, то у него есть доступ к API, и он зашит в приложение. Давайте анализировать.
Так как мы имеем дело с трафиком, то Wireshark — наш выбор. Не без мучений подключив телефон к интернету через стационарный компьютер, открываем приложение и смотрим на запросы:
Понятно, что ничего не понятно
Да, всё зашифровано, а с криптографией возиться не хочется. Тогда надо смотреть внутрь самого приложения.
Декомпилировав .apk, начинаем искать. Что нужно любому API? Правильно, endpoint, место, куда идут все запросы. Это наверняка http(s), попробуем найти «https://»:
В файле AuthLinkManager.smali
находим
.field OAUTH:Ljava/lang/String; = "https://habrahabr.ru/auth/o/%s/"
.field OAUTH_PARAMS:Ljava/lang/String; = "?client_id=%s&response_type=token&redirect_uri=%s"
.field OAUTH_REDIRECT_URL:Ljava/lang/String; = "http://cleverpumpkin.ru"
Это код для виртуальной машины Android (Dalvik VM), не очень понятный для человека, но всё же достаточно информативный. Три эти константы, судя по их содержанию и названию, а также GitHub-репозиторию, используются для запроса токена доступа методом GET
.
Смотрим дальше. Следующим в поиске попадается файл NetworkModule.smali
:
const-string v0, "https://habr.com/api/v1/"
А вот и место, куда нужно обращаться запросами!
Для нормальной работы самописного клиента осталось выяснить лишь одну вещь — client_id
, что скорее всего является уникальным идентификатором приложения.
Однако поиски этого текста в исходниках к нахождению релевантной информации не привели...
Но вдруг в одном файлов глаза зацепились за интересные строчки:
const-string p8, "log-tag"
invoke-static {p8, p2}, Landroid/util/Log;->d(Ljava/lang/String;Ljava/lang/String;)I
Это, как можно понять, запись в лог. Но запись чего?
Часть третья. Вот так логи!
Используем adb logcat
для просмотра логов приложения.
Неожиданно, но логи оказались ещё более подробными, чем ожидалось.
Здесь есть не только нужный нам client_id
, но и токен пользователя/приложения, а также логин и пароль открытым текстом!
adb
. Но из-за того, что среди людей, читающих Хабр, есть разработчики на андроид, у которых может быть включена отладка, это становится проблемой. В таком случае «бесплатная зарядка» в аэропорту может обернуться угоном аккаунта
Из этих логов можно вынести:
client_id
иapikey
, необходимые для доступа к api;- URL авторизации пользователя (странно, но в репозитории про этот метод нет ничего, может, не предусмотрено?)
Вот так и получилось. На базе этого крохотного исследования уже ведется работа над небольшим проектом — собственной реализацией мобильного приложения. Желающих помочь прошу написать в сообщения, а всех остальных — проголосовать (ибо хочется понять, нужно ли это кому-нибудь).
Спасибо за внимание!