Оболочка для удобного использования мобильного API Дневника на Java
В стадии разработки...
Retrofit
Gson
RxJava3
Lombok
Официальная документация отсутствует
- Добавьте в pom.xml:
<dependency>
<groupId>io.github.alllexey123</groupId>
<artifactId>dnevnik-mobile-api</artifactId>
<version>1.1.0</version>
</dependency>
- Создайте объект Dnevnik:
Dnevnik dnevnik = Dnevnik.create();
- Получение данных для использования API:
- Передача токенов, айди пользователя и т.д. напрямую:
Credentials credentials = new Credentials(); credentials.setUserId(12345L); // used in many methods credentials.setAccessToken("abc123"); // used in almost all methods ... dnevnik.getStorage().setCredentials(credentials);
- Вход по логину/паролю Дневника:
dnevnik.getStorage().setCredentials(credentials); dnevnik.auth("my_cool_username", "my_strong_password") .blockingSubscribe(r -> {}, Throwable::printStackTrace);
- Вход через Госуслуги:
Через полученную ссылку нужно войти в аккаунт Госуслуг в браузере (или в эмуляторе), а после использовать полученный taskId для входа:dnevnik.getEsiaRegions() .flattenAsFlowable(EsiaRegionsResponse::getRegions) .map(region -> region.getRegionId() + " " + region.getName() + " " + region.getEsiaUrl()) .blockingSubscribe(System.out::println, Throwable::printStackTrace); // print regions and their auth links
String taskId = "123123-123123123-123123123-123123"; int regionId = 123; dnevnik.esiaAuth(taskId, regionId) .blockingSubscribe(System.out::println, Throwable::printStackTrace);
- Обновление контекста пользователя:
dnevnik.updateUserContext()
.blockingSubscribe(System.out::println, Throwable::printStackTrace); // print user context (example)
Обновление контекста необходимо для получения дополнительной информации о пользователе (группа, школа, личные данные и т.п.). Многое из этого используется в других запросах к API.
- Дальнейшее использование библиотеки: Класс Dnevnik содержит в себе все реализованные методы API, в которые не надо передавать такие параметры, как userId, groupId, accessToken и т.д., они передаются из объекта Storage. Можно создать свою реализацию Storage (например, хранить данные в БД). Доступ к чистому API можно получить так:
Dnevnik dnevnik = Dnevnik.create();
DnevnikApi api = dnevnik.api();
Взаимодействие с API реализовано благодаря RxJava3, все методы возвращают объект Single с результатом, либо исключение, которое можно обработать инструментами этой библиотеки. Если объект, возвращённый API, наследуется от Restrictable, то поля в нём могут быть скрыты из-за отсутствия подписки (это может быть оценка, рейтинг и т.д.).
// user context is required
dnevnik.getPeriodMarks(dnevnik.getStorage().getUserContext().getCurrentPeriod().getId())
.flattenAsFlowable(PeriodMarksResponse::getPeriodMarks)
.subscribe(finalMark -> {
System.out.println(finalMark.getSubject().getName() + " " + finalMark.getAverageMarks().getAverageMark());
}, Throwable::printStackTrace);
dnevnik.getUserFeed().flattenAsFlowable(FeedResponse::getRecentMarks)
.map(FeedRecentMarkWrapper::getContent)
.subscribe(recentMark -> {
System.out.println(recentMark.getDate() + " " + recentMark.marksToString());
}, Throwable::printStackTrace);