Одним томным и уже порядком надоевшим вечером, я, листая официальное приложение хабра, в который раз загибал пальцы, по одному за каждую нерабочую фичу. Тут, например, нельзя прокомментировать, здесь отказывают в праве голоса, и вообще, почему не видно формул на экране?
Было решено: нужно что-то удобное, приятное, своё. Что насчёт своего приложения для Хабра?
Давайте, для понимания ситуации, приведу несколько скриншотов.
Как-то так выглядит oku — оф. приложение habr.com
Список «неудобств»
Нельзя оценить публикацию, рейтинг которой отличен от 0
Не всегда можно написать комментарий
Не работают опросы
В тёмной теме не видно формул (чёрное на чёрном)
Доступны не все закладки
Да, приложение не обновляли с августа прошлого года, но всё равно плохо. В общем, надо исправлять.
Часть первая. В поисках доступа.
Быстрый запрос к Google «habrahabr API» выдает уже порядком устаревший indawo yokugcina на гитхабе, не обновлявшийся с November 21 2016, а это, на минуточку, два с половиной года.
Не обращая внимания на то, что это — PHP, листаем вниз и читаем:
Получение идентификатора приложения
Ukuthatha inzuzo этой формой на Хабрахабре, нужно кратко описать суть нового приложения и цель, для которой ему нужен API.
Не вопрос, если надо получать доступ, значит надо. Пишем письмо (в сокращении):
Ileta
Есть желание сделать приложение для Хабра на основе PWA. Причин этому несколько.
Первая и самая понятная: приложение для Android не удовлетворяет моим персональным требованиям.
Вторая: не хватает нативных уведомлений о всяческих вещах, которые обычно приходят на почту (комментарии, например).
Третья: персональные дайджесты (как перспектива) по интересующим меня людям/хабам, учитывая мои интересы.
Ответ, конечно, был не очень приятным, но хоть честным:
К сожалению, доступ к нашему API в настоящий момент не предоставляется. Мы планируем возобновить предоставление доступа после того как закончим доработку API, но каких-либо точных дат у нас пока нет, т.к. в данный момент мы заняты решением других приоритетных задач.
«Ладно, не беда! Что-нибудь придумаем!» — сказал я себе, и начал искать.
Часть вторая. Глубокие раскопки.
Исходя из логики, если приложение работает, то у него есть доступ к API, и он зашит в приложение. Давайте анализировать.
Так как мы имеем дело с трафиком, то Wireshark — наш выбор. Не без мучений подключив телефон к интернету через стационарный компьютер, открываем приложение и смотрим на запросы:
Понятно, что ничего не понятно
Да, всё зашифровано, а с криптографией возиться не хочется. Тогда надо смотреть внутрь самого приложения.
Декомпилировав .apk, начинаем искать. Что нужно любому API? Правильно, i siphelo, место, куда идут все запросы. Это наверняка http(s), попробуем найти «https://»:
Это код для виртуальной машины Android (UDalvik VM), не очень понятный для человека, но всё же достаточно информативный. Три эти константы, судя по их содержанию и названию, а также GitHub-репозиторию, используются для запроса токена доступа методом GET.
Смотрим дальше. Следующим в поиске попадается файл NetworkModule.smali:
const-string v0, "https://habr.com/api/v1/"
А вот и место, куда нужно обращаться запросами!
Для нормальной работы самописного клиента осталось выяснить лишь одну вещь — client_id, что скорее всего является уникальным идентификатором приложения.
Однако поиски этого текста в исходниках к нахождению релевантной информации не привели…
Но вдруг в одном файлов глаза зацепились за интересные строчки:
Это, как можно понять, запись в лог. Но запись чего?
Часть третья. Вот так логи!
Sisebenzisa adb logcat для просмотра логов приложения.
Неожиданно, но логи оказались ещё более подробными, чем ожидалось.
Здесь есть не только нужный нам client_idkodwa uphawu пользователя/приложения, а также логин и iphasiwedi открытым текстом!
Немного теорий заговораСамо по себе присутствие а логах логина и пароля ничем не вредит, так как эти логи можно прочитать лишь имея либо рут-права, либо подключение через adb. Но из-за того, что среди людей, читающих Хабр, есть разработчики на андроид, у которых может быть включена отладка, это становится проблемой.
В таком случае «бесплатная зарядка» в аэропорту может обернуться угоном аккаунта, хотя кому он нужен?
Из этих логов можно вынести:
client_id и apikey, необходимые для доступа к Api;
URL авторизации пользователя (странно, но в репозитории про этот метод нет ничего, может, не предусмотрено?)
Вот так и получилось. На базе этого крохотного исследования уже ведется работа над небольшим проектом — собственной реализацией мобильного приложения. Желающих помочь прошу написать в сообщения, а всех остальных — проголосовать (ибо хочется понять, нужно ли это кому-нибудь).