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



Было решено: нужно что-то удобное, приятное, своё. Что насчёт своего приложения для Хабра?
Давайте, для понимания ситуации, приведу несколько скриншотов.

Как-то так выглядит это — оф. приложение 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 авторизации пользователя (странно, но в репозитории про этот метод нет ничего, может, не предусмотрено?)

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

Спасибо за внимание!
Only registered users can participate in poll. Log in, please.
Пользуетесь ли вы мобильным приложением Хабра?
5.55%Да, пользуюсь, меня всё устраивает49
26.27%Да, пользуюсь, приложение доставляет неудобства232
34.88%Нет, пользуюсь веб-версией на телефоне308
33.3%Нет, пользуюсь Хабром с компьютера294
883 users voted. 77 users abstained.