Стандартизированный протокол возврата адаптера ErisPulse
1. Описание
Почему существует этот стандарт?
Для обеспечения единообразия и совместимости с OneBot12 возвращаемых интерфейсов отправки на разных платформах, адаптер ErisPulse использует стандартную структуру возвращаемых данных OneBot12 для формата ответа API.
Однако протокол ErisPulse имеет некоторые специфические определения:
- В базовых полях поле message_id обязательно, но в стандарте OneBot12 такого поля нет.
- В возвращаемых данных необходимо добавить поле {platform_name}_raw, которое используется для хранения необработанных данных ответа.
2. Базовая структура ответа
Все ответы на действия должны содержать следующие базовые поля:
| Имя поля | Тип данных | Обязательно | Описание |
|---|---|---|---|
| status | string | Да | Статус выполнения, должен быть "ok" или "failed" |
| retcode | int64 | Да | Код возврата, следует правилам кодов возврата OneBot12 |
| data | any | Да | Данные ответа, содержит результат запроса при успешном выполнении, и null при ошибке |
| message_id | string | Да | Идентификатор сообщения, используется для идентификации сообщения, если нет, пустая строка |
| message | string | Да | Сообщение об ошибке, пустая строка при успешном выполнении |
| {platform_name}_raw | any | Нет | Исходные данные ответа |
Необязательные поля:
| Имя поля | Тип данных | Обязательно | Описание |
|---|---|---|---|
| echo | string | Нет | Возвращается в том же виде, если в запросе присутствовал поле echo |
3. Полный список полей
3.1 Общие поля
Пример успешного ответа
{
"status": "ok",
"retcode": 0,
"data": {
"message_id": "1234",
"time": 1632847927.599013
},
"message_id": "1234",
"message": "",
"echo": "1234",
"telegram_raw": {...}
}
Пример неудачного ответа
{
"status": "failed",
"retcode": 10003,
"data": null,
"message_id": "",
"message": "Отсутствует обязательный параметр: user_id",
"echo": "1234",
"telegram_raw": {...}
}
3.2 Спецификация кодов возврата
0 Успешно (OK)
- 0: Успешно (OK)
1xxxx Ошибки запроса (Request Error)
| Код ошибки | Название ошибки | Описание |
|---|---|---|
| 10001 | Bad Request | Недопустимый запрос действия |
| 10002 | Unsupported Action | Неподдерживаемый запрос действия |
| 10003 | Bad Param | Недопустимый параметр запроса действия |
| 10004 | Unsupported Param | Неподдерживаемый параметр запроса действия |
| 10005 | Unsupported Segment | Неподдерживаемый тип сегмента сообщения |
| 10006 | Bad Segment Data | Недопустимый параметр сегмента сообщения |
| 10007 | Unsupported Segment Data | Неподдерживаемый параметр сегмента сообщения |
| 10101 | Who Am I | Не указан аккаунт бота |
| 10102 | Unknown Self | Неизвестный аккаунт бота |
2xxxx Ошибки обработчика действия (Handler Error)
| Код ошибки | Название ошибки | Описание |
|---|---|---|
| 20001 | Bad Handler | Ошибка реализации обработчика действия |
| 20002 | Internal Handler Error | Исключение, выброшенное во время выполнения обработчика действия |
3xxxx Ошибки выполнения действия (Execution Error)
| Диапазон кодов ошибки | Тип ошибки | Описание |
|---|---|---|
| 31xxx | Database Error | Ошибка базы данных |
| 32xxx | Filesystem Error | Ошибка файловой системы |
| 33xxx | Network Error | Ошибка сети |
| 34xxx | Platform Error | Ошибка платформы бота |
| 35xxx | Logic Error | Ошибка логики действия |
| 36xxx | I Am Tired | Реализация решила бастовать |
Зарезервированные диапазоны ошибок
- 4xxxx, 5xxxx: Зарезервированные диапазоны, не должны использоваться
- 6xxxx–9xxxx: Другие диапазоны ошибок, доступны для пользовательских реализаций
4. Требования к реализации
- Все ответы должны содержать поля
status,retcode,dataиmessage - Если в запросе присутствует непустое поле
echo, ответ должен содержать полеechoс тем же значением - Коды возврата должны строго соответствовать спецификации OneBot12
- Сообщения об ошибках (
message) должны быть понятны человеку
5. Расширения спецификации
ErisPulse вносит следующие расширения в стандартный структурный ответ OneBot12:
5.1 Обязательное поле message_id
В стандарте OneBot12 поле message_id находится внутри объекта data и не является обязательным. ErisPulse выделяет его на уровень верхнего уровня как обязательное поле:
- Если
message_idневозможно получить, его следует установить в пустую строку"" - Обеспечьте, чтобы
message_idвсегда существовал, модулям не нужно проверять на null
5.2 Поле {platform}_raw с исходными ответами
В ответе должно содержаться поле {platform}_raw, в котором хранится полная копия исходных данных ответа платформы:
{
"status": "ok",
"retcode": 0,
"data": {"message_id": "1234", "time": 1632847927},
"message_id": "1234",
"message": "",
"telegram_raw": {
"ok": true,
"result": {"message_id": 1234, "date": 1632847927, ...}
}
}
Требования:
{platform}_rawдолжен быть глубокой копией исходного ответа, а не ссылкойplatformдолжен полностью совпадать с именем платформы, зарегистрированной адаптером (чувствительно к регистру)- Ошибки в исходном ответе также должны быть сохранены, чтобы облегчить отладку
5.3 Расширенные коды возврата фреймворка (34xxx, пользовательские младшие три цифры в сегменте платформы)
OneBot12 позволяет реализациям использовать пользовательские младшие три цифры в диапазоне 3xxxx. Сегмент 34xxx означает Platform Error (ошибка платформы бота, например, ограничения платформы, вызвавшие сбой). Внутри 34xxx используются низшие три цифры по уровню ответственности:
| Сегмент младших трех цифр | Ответственность | Назначение |
|---|---|---|
340xx |
Реализация адаптера | Семейство запросов (Запрос не найден / Уже обработан / Не поддерживается / Отказано в доступе, см. request-action-spec §7) |
341xx–345xx |
Реализация адаптера | Ошибки платформы, связанные с правами, риск-контролем, ограничениями аккаунта и т.д. (реализуйте пользовательские младшие три цифры, исходные ошибки поместите в {platform}_raw) |
346xx |
Фреймворк ErisPulse (зарезервирован) | Ошибки, возникающие внутри фреймворка, адаптеры/модули не должны использовать эти коды |
347xx–349xx |
Реализация адаптера | Другие ошибки выполнения платформы |
Фреймворк ErisPulse в настоящее время использует коды 346xx:
| Код ошибки | Название ошибки | Описание |
|---|---|---|
| 34600 | SDK Failure | Общая ошибка фреймворка (значение по умолчанию, возвращаемое make_error()) |
| 34601 | Action Denied | Выходное действие заблокировано с помощью scope.actions, вызов не инициирован, возвращается этот ответ |
Разграничение ответственности:
34601— это блокировка фреймворком до вызова (модуль не имеет права на действие);34004/34xxx— это ошибки платформы после отправки действия (например, у бота нет прав, он заблокирован). При проверке проблем с правами модуль должен проверять оба типа: сначала34601(действие заблокировано scope), затем34xxx(платформа ограничивает).
Структура ответа соответствует стандартному неудачному ответу §2:
{
"status": "failed",
"retcode": 34601,
"data": null,
"message_id": "",
"message": "action 'send' denied by scope.actions"
}
5.5 Проверочный список реализации адаптера
- Включает поля
status,retcode,data,message_id,message - Коды возврата соответствуют спецификации OneBot12 (см. §3.2)
- Поле
message_idвсегда существует (если невозможно получить, устанавливается в пустую строку) - Поле
{platform}_rawсодержит исходные данные ответа платформы
6. Примечания
- Для кодов ошибок 3xxxx последние три цифры могут быть определены реализацией
- Избегайте использования зарезервированных диапазонов ошибок (4xxxx, 5xxxx)
34600/34601зарезервированы для фреймворка ErisPulse (см. §5.3), адаптеры/модули должны избегать их использования- Сообщения об ошибках должны быть краткими и понятными, для облегчения отладки