|
1 | | -<h1 align = "center">Java MyITMO API</h1> |
2 | | -<p align = "center"><strong>Интерфейс для сервиса <a href="https://my.itmo.ru">MyITMO</a> на Java</strong></p> |
| 1 | +<h1 align="center">Java MyITMO API</h1> |
3 | 2 |
|
4 | | -### 🌟 Текущие возможности |
5 | | -- **Вход по логину/паролю ITMO ID** |
6 | | -- Вход по refresh_token MyITMO |
7 | | -- Автоматическое обновление токенов |
8 | | -- Можно получать: |
9 | | - - **Расписание (как уроков, так и спорта)** |
10 | | - - **QR-пропуск в корпуса (в HEX-формате)** |
11 | | - - **Свои записи на спорт (а также редактировать их)** |
12 | | - - **Свои записи во время выборности (и изменять их)** |
13 | | - - Зачётную книжку |
14 | | - - Персоналии по ID (а также искать по ФИО) |
| 3 | +<p align="center"><strong>Неофициальная Java-библиотека для работы с <a href="https://my.itmo.ru">MyITMO</a></strong></p> |
15 | 4 |
|
16 | | -### 🛠️ Зависимости |
| 5 | +## Возможности |
17 | 6 |
|
18 | | -- `Retrofit` |
19 | | -- `OkHttp` |
20 | | -- `Gson` |
21 | | -- `Lombok` |
| 7 | +- Аутентификация через ITMO ID по логину и паролю или refresh token. |
| 8 | +- Автоматическое обновление access token. |
| 9 | +- Получение личного учебного расписания и временных слотов. |
| 10 | +- Получение зачётки и дерева контрольных мероприятий дисциплины. |
| 11 | +- Получение структуры учебного плана. |
| 12 | +- Просмотр и поиск персоналий. |
| 13 | +- Работа со спортом: |
| 14 | + - расписание и фильтры; |
| 15 | + - личный календарь и выбранные секции; |
| 16 | + - запись на занятия и отмена записи; |
| 17 | + - баллы, попытки, задолженность и медицинская группа; |
| 18 | + - отборы, нормативы и специальные проекты. |
| 19 | +- Получение раскладки главного экрана, меню и каталога сервисов MyITMO. |
| 20 | +- Получение списка пользовательских заявок. |
| 21 | +- Получение суммарных выплат по категориям. |
| 22 | +- Просмотр и изменение выбора дисциплин и потоков. |
| 23 | +- Получение QR-пропуска в корпуса в HEX-формате. |
22 | 24 |
|
23 | | -### 🚀 Использование |
| 25 | +## Требования |
24 | 26 |
|
25 | | -Добавьте в pom.xml: |
| 27 | +- Java 8 или новее. |
| 28 | +- Maven или другая система сборки с поддержкой Maven Central. |
| 29 | + |
| 30 | +Основные зависимости библиотеки: Retrofit, OkHttp, Gson и Lombok. |
| 31 | + |
| 32 | +## Подключение |
| 33 | + |
| 34 | +Добавьте зависимость в `pom.xml`: |
26 | 35 |
|
27 | 36 | ```xml |
28 | | -<dependencies> |
29 | | - <dependency> |
30 | | - <groupId>dev.alllexey</groupId> |
31 | | - <artifactId>my-itmo-api</artifactId> |
32 | | - <version>1.5.0</version> |
33 | | - </dependency> |
34 | | -</dependencies> |
| 37 | +<dependency> |
| 38 | + <groupId>dev.alllexey</groupId> |
| 39 | + <artifactId>my-itmo-api</artifactId> |
| 40 | + <version>1.6.0</version> |
| 41 | +</dependency> |
35 | 42 | ``` |
36 | 43 |
|
37 | | -#### Аутентификация |
| 44 | +## Аутентификация |
38 | 45 |
|
39 | | -* Логин через почту/ID и пароль |
40 | | - ```java |
41 | | - MyItmo myItmo = new MyItmo(); |
42 | | - myItmo.auth("my_cool_id", "my_strong_password"); |
43 | | - ``` |
44 | | -* Логин через refresh_token (можно получить через F12 → cookies в браузере) |
45 | | - ```java |
46 | | - MyItmo myItmo = new MyItmo(); |
47 | | - myItmo.getStorage().setRefreshToken("long_refresh_token"); |
48 | | - myItmo.getStorage().setRefreshExpiresAt(Long.MAX_VALUE); |
49 | | - myItmo.forceRefreshTokens(); |
50 | | - ``` |
51 | | -* Своя реализация Storage (далее) |
| 46 | +### Логин и пароль |
52 | 47 |
|
53 | | -**Логины и пароли не сохраняются, и используются только один раз - при входе.** |
54 | | -Подробнее: [AuthHelper.java](/src/main/java/api/myitmo/utils/AuthHelper.java) |
| 48 | +```java |
| 49 | +MyItmo myItmo = new MyItmo(); |
| 50 | +myItmo.auth("my_cool_id", "my_strong_password"); |
| 51 | +``` |
| 52 | + |
| 53 | +Логин и пароль не сохраняются и используются только во время входа. |
| 54 | + |
| 55 | +### Refresh token |
| 56 | + |
| 57 | +```java |
| 58 | +MyItmo myItmo = new MyItmo(); |
| 59 | +myItmo.getStorage().setRefreshToken("long_refresh_token"); |
| 60 | +myItmo.getStorage().setRefreshExpiresAt(Long.MAX_VALUE); |
| 61 | +myItmo.forceRefreshTokens(); |
| 62 | +``` |
55 | 63 |
|
56 | | -По умолчанию токены хранятся в памяти, рекомендуется создать свою реализацию Storage, чтобы хранить как-то иначе: |
| 64 | +Токены по умолчанию хранятся только в памяти. Для постоянного хранения передайте собственную реализацию `Storage`: |
57 | 65 |
|
58 | 66 | ```java |
59 | 67 | MyItmo myItmo = new MyItmo(); |
60 | | -myItmo.setStorage(customStorageImpl); |
| 68 | +myItmo.setStorage(customStorage); |
61 | 69 | ``` |
62 | 70 |
|
63 | | -Время жизни refreshToken - 30 дней, accessToken - 30 минут; если он устареет - токены обновятся. |
| 71 | +Не записывайте access token, refresh token, логин и пароль в логи или сообщения об ошибках. |
| 72 | + |
| 73 | +## Использование API |
64 | 74 |
|
65 | | -#### API |
| 75 | +Методы доступны через `MyItmo#getApi()` и возвращают Retrofit `Call`. |
66 | 76 |
|
67 | | -Методы API доступны через **MyItmo#getApi()** <br> |
68 | | -Например, получение расписания на сегодня и завтра: |
| 77 | +### Учебное расписание |
69 | 78 |
|
70 | 79 | ```java |
71 | 80 | MyItmo myItmo = new MyItmo(); |
72 | | -myItmo.setStorage(storageWithTokens); // или получите токены любым способом выше |
| 81 | +myItmo.setStorage(storageWithTokens); |
| 82 | + |
| 83 | +LocalDate today = LocalDate.now(); |
| 84 | +DataResponse<List<Schedule>> response = myItmo.getApi() |
| 85 | + .getPersonalSchedule(today, today.plusDays(1)) |
| 86 | + .execute() |
| 87 | + .body(); |
73 | 88 |
|
74 | | -LocalDate now = LocalDate.now(); |
75 | | -MyItmoResponse<List<Schedule>> r = myItmo.getApi().getPersonalSchedule(now, now.plusDays(1)).execute().body(); |
76 | | -List<Schedule> schedules = r.getData(); |
| 89 | +List<Schedule> schedules = response == null ? null : response.getData(); |
77 | 90 | ``` |
78 | 91 |
|
79 | | -#### QR |
| 92 | +### Зачётка |
| 93 | + |
| 94 | +```java |
| 95 | +ResultResponse<List<Specialization>> response = myItmo.getApi() |
| 96 | + .getSpecializations() |
| 97 | + .execute() |
| 98 | + .body(); |
| 99 | +``` |
80 | 100 |
|
81 | | -Генерировать QR-код (почти) 1-в-1 как приложение можно с помощью [io.nayuki/qrcodegen](https://central.sonatype.com/artifact/io.nayuki/qrcodegen) таким образом: |
| 101 | +Большинство методов использует `ResultResponse<T>`, где `errorCode == 0` означает успешный ответ. Старые сервисы расписания используют `DataResponse<T>` с аналогичным значением `code == 0`. |
| 102 | + |
| 103 | +Полный перечень методов и параметров находится в [`MyItmoApi.java`](src/main/java/api/myitmo/MyItmoApi.java). |
| 104 | + |
| 105 | +## QR-пропуск |
| 106 | + |
| 107 | +Полученный HEX можно преобразовать в QR-код, например с помощью [io.nayuki/qrcodegen](https://central.sonatype.com/artifact/io.nayuki/qrcodegen): |
82 | 108 |
|
83 | 109 | ```java |
84 | 110 | String qrHex = "12345ABC"; |
85 | 111 | QrSegment segment = QrSegment.makeBytes(qrHex.getBytes(StandardCharsets.ISO_8859_1)); |
86 | | -QrCode qr = QrCode.encodeSegments(Collections.singletonList(segment), QrCode.Ecc.LOW, 1, 1, -1, false); |
| 112 | +QrCode qr = QrCode.encodeSegments( |
| 113 | + Collections.singletonList(segment), |
| 114 | + QrCode.Ecc.LOW, |
| 115 | + 1, |
| 116 | + 1, |
| 117 | + -1, |
| 118 | + false |
| 119 | +); |
87 | 120 | ``` |
| 121 | + |
| 122 | +## Особенности |
| 123 | + |
| 124 | +MyITMO не предоставляет публичную документацию для всех используемых сервисов. Модели основаны на наблюдаемых ответах API, поэтому сервер может добавлять новые поля и справочные значения. Неизвестные, но подтверждённо присутствующие поля отмечены в моделях закомментированными объявлениями до уточнения их типов. |
0 commit comments