toggle menu
0
Тектовый редактор

Инструкция по использованию API образовательной платформы NBICS.NET для разработки сторонних приложений и интеграции в сторонние сайты


1. Регистрация приложения

Для начала работы с API платформы стороннему разработчику понадобится зарегистрировать своё приложение в платформе.
Для этого необходимо связаться с сотрудником компании по телефону 8-800-234-23-29. Сотруднику необходимо сообщить адрес сайта (ApplicationSite) предполагаемого приложения и его название (ApplicationName – не превышает 31 символ). После регистрации приложения сторонний разработчик получит ApplicationPassword. Комбинация ApplicationName и ApplicationPassword является именным ключом для доступа приложения к API платформы.

2. Получение Token

Следующим шагом является получение Token временного ключа доступа к API платформы.
Для этого необходимо сделать запрос:

/Application/GetToken

Параметры:
ApplicationName название приложения (макс 31 символ) должно быть уникально в рамках платформы;
ApplicationPassword пароль приложения для доступа к API платформы.

Тип запроса:
GET/POST

Пример запроса:

/Application/GetToken?ApplicationName=SomeApplicationName&ApplicationPassword=SomeApplicationPassword


Пример ответа:

{
     "Token": "SomeToken" // Значение пароля токена
    ,"ValidTo": "2019-11-26T16:26:05" // Время, до которого действует токен
    ,"Success": true
    ,"Message": null // Заполняется в случае ошибки и Success = false
}


Примечание:
Поле ValidTo указывается для удобства отслеживания разработчиком стороннего приложения периода валидности токена.
Если токен устарел (ValidTo < Текущего времени), то необходимо повторно запросить токен с помощью данного запроса.
Период валидности токена 2 часа с момента его получения.
Токен для приложения существует в единственном экземпляре.
При повторном запросе предыдущий токен уничтожается и генерируется новый.


3. Регистрация пользователя

Для фиксации факта прохождения урока необходимо создать пользователя, который будет проходить урок.
Для этого необходимо сделать запрос:

/Application/RegisterUser

Параметры:
Token временный ключ, полученный на шаге 2;
Login уникальный идентификатор пользователя в платформе (предпочтительно Email).

Тип запроса:
GET/POST

Пример запроса:

/Application/RegisterUser?Token=SomeToken&Login=SomeLogin


Пример ответа:

{
     "User": {
         "Login": "SomeLogin"
        ,"PasswordHash": "SomePasswordHash"
      }
      ,"Success": true
      ,"Message": null // Заполняется в случае ошибки и Success = false
}


Примечание:
После регистрации пользователь сразу привязывается к приложению-владельцу токена.


4. Регистрация пользователя с параметрами

Для фиксации факта прохождения урока необходимо создать пользователя, который будет проходить урок.
Для этого необходимо сделать запрос:

/Application/RegisterUserWithData

Параметры:
Token – временный ключ, полученный на шаге 2;
UserData – данные о регистрируемом пользователе.


Пример параметра UserData:

{ 
      Login: "SomeLogin"
     ,LastName: "Иванов"
     ,FirstName: "Иван"
     ,SecondName: "Иванович" 
}


Тип запроса:
GET/POST

Пример запроса:

/Application/RegisterUser?Token=SomeToken&UserData={ Login:"SomeLogin", LastName:"Иванов", FirstName:"Иван", SecondName: "Иванович" }


Пример ответа:

{
      "User": {
         "Login": "SomeLogin"
        ,"PasswordHash": "SomePasswordHash"
        ,"LastName": "Иванов"
        ,"FirstName": "Иван"
        ,"SecondName": "Иванович"
      }
      ,"Success": true
      ,"Message": null // Заполняется в случае ошибки и Success = false
}


Примечание:
После регистрации пользователь сразу привязывается к приложению-владельцу токена.


5. Изменение данных пользователя

Для изменения данных уже зарегистрированного пользователя необходимо сделать запрос:

/Application/UpdateUserData

Параметры:
Token – временный ключ, полученный на шаге 2;
UserData – данные о пользователе;

UserDataUpdateMap – перечень свойств, которые необходимо обновить.

Пример параметра UserData:

{ 
      Login: "SomeLogin"
     ,LastName: "Иванов"
     ,FirstName: "Иван"
     ,SecondName: "Иванович" 
}

Пример параметра UserDataUpdateMap:

{ 
      LastName: true
    , SecondName: true
    , FirstName: true 
}


Тип запроса:
GET/POST

Пример запроса:

/Application/UpdateUserData?Token=SomeToken&UserData={ Login: "SomeLogin",  LastName: "Иванов", FirstName: "Иван", SecondName: "Иванович" }&UserDataUpdateMap={ LastName: true, SecondName: true, FirstName: true }


Пример ответа:

{
    "Success": true
   ,"Message": null
   ,"ErrorCode": null
}


Коды ошибок:

В случае ошибки в ответе возвращается Success=false, при этом поля Message и ErrorCode содержат информацию об ошибке.

ErrorCode
Message
Значение
-1
User "SomeLogin" not found
Пользователь с заданным логином отсутствует


6. Проверка существования пользователя в системе

Для проверки существования пользователя в системе, а также его привязок к приложениям:

/Application/CheckExistsUser

Параметры:
Token – временный ключ, полученный на шаге 2;
Login – логин пользователя;

Тип запроса:
GET/POST

Пример запроса:

/Application/CheckExistsUser?Token=SomeToken&Login=SomeLogin


Пример ответа 1:

{
   "Applications": ["BitrixIntegrationApp"]
   ,"Success": true
   ,"Message": null
   ,"ErrorCode": 0
}


Пример ответа 2:

{
   "Applications": []
   ,"Success": false
   ,"Message": "User SomeUserLogin not found"
   ,"ErrorCode": -1
}


Коды ошибок:

В случае ошибки в ответе возвращается Success=false, при этом поля Message и ErrorCode содержат информацию об ошибке.

ErrorCode
Message
Значение
-1
User "SomeLogin" not found
Пользователь с заданным логином отсутствует


7. Получение списка пользователей, привязанных к приложению

Для получения списка всех пользователей, привязанных к приложению, необходимо сделать запрос:

/Application/GetUsers


Параметры:
Token временный ключ, полученный на шаге 2.

Тип запроса:
GET/POST

Пример запроса:

/Application/GetUsers?Token=SomeToken


Пример ответа:

{
    "Users": [{
        "Login": "SomeLogin"
       ,"PasswordHash": "SomePasswordHash"
       ,"LastName":"Иванов"
       ,"FirstName":"Иван"
       ,"SecondName":"Иванович"
     }]
     ,"Success": true
     ,"Message": null // Заполняется в случае ошибки и Success = false
}


8. Удаление пользователя из аккаунта приложения

Для удаления пользователя из аккаунта приложения необходимо сделать запрос:

/Application/DeleteUser


Параметры:
Token временный ключ, полученный на шаге 2;
Login уникальный идентификатор пользователя в платформе, указанный при его регистрации.

Тип запроса:
GET/POST

Пример запроса:

/Application/DeleteUser?Token=SomeToken&Login=SomeLogin


Пример ответа:

{
     "Success": true
    ,"Message": null
}


9. Создание урока

Для создания урока необходимо сделать запрос:

/EducationHome/CreateLessonConfiguration


Параметры:
Token временный ключ, полученный на шаге 2;
ConfigurationName название создаваемого урока;
Login уникальный идентификатор пользователя в платформе, указанный при его регистрации;
PasswordHash хеш пароля пользователя, который платформа вернула при его регистрации.

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/CreateLessonConfiguration?Token=SomeToken&ConfigurationName=SomeConfigurationName&Login=SomeLogin&PasswordHash=SomePasswordHash


Пример ответа:

{
        "ConfigurationMetaData": {
                "Id": -2147382881
               ,"Parent": null
               ,"Guid": "2250789c-f83e-41c5-aa95-d8bb865ed038"
               ,"Name": "Новый урок API"
               ,"Code": "Novyj-urok-API"
               ,"Children": []
               ,"Type": "Configuration"
               ,"Author": null
               ,"Editor": null
               ,"CreationTime": null
               ,"LastModifyTime": null
               ,"Index": 0
               ,"ReadOnly": false
               ,"Editable": false
               ,"IsTemplateConfiguration": false
               ,"CreatedFromTemplate": false
               ,"Settings": {"WidgetContainers":[],"WidgetEventsPermissions":[]}
               ,"Description":null
        }
        ,"ErrorCode": 0
        ,"Success": true
        ,"Message":null
}

Примечание:
Созданный урок будет привязан к пользователю с указанными в параметрах Login и PasswordHash.


10. Изменение названия урока

Для изменения названия урока необходимо сделать запрос:

/EducationHome/UpdateLessonName


Параметры:
Token временный ключ, полученный на шаге 2;
LessonGuid Guid урока (обязателен если не указан LessonCode);

LessonCode Code урока (обязателен если не указан LessonGuid);
NewName новое название урока;
ToUpdateLessonCodeFromName сгенерировать на основе нового названия новый код урока (необязательный параметр, по умолчанию = false).

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/UpdateLessonName?Token=SomeToken&LessonGuid=SomeLessonGuid&NewName=SomeName 


Пример ответа:

{
        "ConfigurationMetaData": {
                "Id": -2147382881
               ,"Parent": null
               ,"Guid": "2250789c-f83e-41c5-aa95-d8bb865ed038"
               ,"Name": "Новый урок API"
               ,"Code": "Novyj-urok-API"
               ,"Children": []
               ,"Type": "Configuration"
               ,"Author": null
               ,"Editor": null
               ,"CreationTime": null
               ,"LastModifyTime": null
               ,"Index": 0
               ,"ReadOnly": false
               ,"Editable": false
               ,"IsTemplateConfiguration": false
               ,"CreatedFromTemplate": false
               ,"Settings": {"WidgetContainers":[],"WidgetEventsPermissions":[]}
               ,"Description":null
        }
        ,"ErrorCode": 0
        ,"Success": true
        ,"Message":null
}


11. Получение списка уроков

Для получения списка уроков необходимо сделать запрос:

/EducationHome/GetLessonsConfigurationsList


Параметры:
Token временный ключ, полученный на шаге 2;
Login уникальный идентификатор пользователя в платформе, к которому привязаны уроки (пользователь является либо владельцем урока, либо его редактором);

PasswordHash хеш пароля пользователя, который платформа вернула при его регистрации;
LessonsOwners  необязательный список идентификаторов (логинов) пользователей в платформе, уроки которых необходимо вернуть. Если данный параметр задан, то возвращается список уроков указанных пользователей, если не задан, то возвращается список уроков пользователя с идентификатором, переданным в параметре Login.


Тип запроса:
GET/POST

Пример запроса:

/EducationHome/GetLessonsConfigurationsList?Token=SomeToken&Login=SomeLogin&PasswordHash=SomePasswordHash&LessonsOwners=["Login1","Login2"]


Пример ответа:

[{
     "Name": "SomeName"
    ,"Code": "SomeCode"
    ,"Guid":"SomeGuid"
    // Редакторы урока - пользователи, которые имеют право редактировать урок
    ,"Editors":[{"LastName":"LastName1","FirstName":"FirstName1","SecondName":"SecondName1","Login":"Login1"}] 
}
,{
     "Name": "SomeName2"
    ,"Code": "SomeCode2"
    ,"Guid":"SomeGuid2"
    // Редакторы урока - пользователи, которые имеют право редактировать урок
    ,"Editors":[{"LastName":"LastName2","FirstName":"FirstName2","SecondName":"SecondName2","Login":"Login2"}]
}]


12. Удаление урока

Для удаления урока необходимо сделать запрос:

/EducationHome/DeleteLessonConfiguration


Параметры:
ConfigurationCode код (Code) урока, который необходимо удалить;
Token временный ключ, полученный на шаге 2;
Login уникальный идентификатор пользователя в платформе, к которому привязан урок;
PasswordHash хеш пароля пользователя, который платформа вернула при его регистрации.

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/DeleteLessonConfiguration?Token=SomeToken&Login=SomeLogin&PasswordHash=SomePasswordHash?ConfigurationCode=SomeConfigurationCode


Пример ответа:

{
      "Success": true
     ,"Message": null
}

Примечание:
Для удаления урока необходимо указать Login и PasswordHash пользователя, к которому этот урок привязан.


13. Получение списка редакторов урока

Для получения списка редакторов урока необходимо сделать запрос:

/EducationHome/GetLessonEditors


Параметры:
Token временный ключ, полученный на шаге 2;
LessonGuid  уникальный идентификатор урока в платформе (обязателен если не указан LessonCode);

LessonCode – код урока в платформе (обязателен если не указан LessonGuid).

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/GetLessonEditors?Token=SomeToken&LessonGuid=SomeLessonGuid


Пример ответа:

{
   "Users":[
      {"Login":"maitakov","PasswordHash":null,"LastName":"","FirstName":"","SecondName":""},
      {"Login":"petrenko","PasswordHash":null,"LastName":"","FirstName":"","SecondName":""}
   ]
   ,"Success":true
   ,"Message":null
   ,"ErrorCode":null
}

Примечание:

Если одновременно указаны LessonCode и LessonGuid, то будет использован LessonGuid.

Список пользователей включает в себя владельца урока и всех его редакторов.  Список редакторов уроков также возвращается в методе "Получение списка уроков" (п. 10).


14. Добавление редакторов урока

Для добавления редакторов к уроку необходимо сделать запрос:

/EducationHome/AddLessonEditors


Параметры:
Token временный ключ, полученный на шаге 2;

LessonGuid  уникальный идентификатор урока в платформе (обязателен если не указан LessonCode);

LessonCode – код урока в платформе (обязателен если не указан LessonGuid);

EditorsToAdd  список пользователей, добавляемых в качестве редакторов урока.

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/AddLessonEditors?Token=SomeToken&LessonGuid=SomeLessonGuid&EditorsToAdd=[{Login: "SomeLogin"}, {Login: "SomeLogin2"}]


Пример ответа:

{
    "Success":true
    ,"Message":null
    ,"ErrorCode":null
}

Примечание:

Если одновременно указаны LessonCode и LessonGuid, то будет использован LessonGuid.


15. Удаление редакторов урока

Для удаления редакторов урока необходимо сделать запрос:

/EducationHome/RemoveLessonEditors


Параметры:
Token временный ключ, полученный на шаге 2;

LessonGuid  уникальный идентификатор урока в платформе (обязателен если не указан LessonCode);

LessonCode – код урока в платформе (обязателен если не указан LessonGuid);

EditorsToRemove  список пользователей-редакторов, удаляемых из урока.

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/RemoveLessonEditors?Token=SomeToken&LessonGuid=SomeLessonGuid&EditorsToRemove=[{Login: "SomeLogin"},{Login: "SomeLogin2"}]


Пример ответа:

{
    "Success":true
    ,"Message":null
    ,"ErrorCode":null
}

Примечание:

Если одновременно указаны LessonCode и LessonGuid, то будет использован LessonGuid.

При удалении владельца урока (пользователь создавший урок) владельцем становится первый редактор. Единственного редактора урока (он же владелец) удалить нельзя.


16. Встраивание урока в свой сайт

Для получения урока с целью вставки на свой сайт необходимо сделать запрос:

/Application/GetConfigurationFragment


Параметры:
ConfigurationCode код (Code) урока;
Token временный ключ, полученный на шаге 2;
Login уникальный идентификатор пользователя в платформе;
PasswordHash хеш пароля пользователя, который платформа вернула при его регистрации;
ColorSchemeName цветовая схема урока (необязательный параметр, возможные варианты: blue (по умолчанию), green, orange, red, purple);

CurrentLocalizationCode код языка интерфейса урока (необязательный параметр, возможные варианты: ru (по умолчанию), en).

Тип запроса:
GET/POST


Пример запроса:

/Application/GetConfigurationFragment?Token=SomeToken&Login=SomeLogin&PasswordHash=SomePasswordHash&ConfigurationCode=SomeConfigurationCode

Пример ответа:
html-страница

Примечание:
Если Login и PasswordHash принадлежат пользователю-владельцу урока, то урок будет доступен для редактирования, в противном случае только для прохождения.


17. Статистика прохождения уроков

Для получения статистики прохождения уроков необходимо сделать запрос:

/EducationHome/GetStatistics


Параметры:
Lessons уроки, по которым необходимо получить статистику (необязательный параметр, если не указан, то будет отобрана статистика по всем урокам);
Users пользователи, по которым необходимо получить статистику (необязательный параметр, если не указан, то будет отобрана статистика по всем пользователям);
Token временный ключ, полученный на шаге 2;
LastLoadedDataTime временная метка последней порции данных статистики, загруженной в предыдущем запросе (необязательный параметр, при указании параметра будет загружена статистика после указанного времени, новая метка возвращается в результате каждого запроса);
Portion размер порции данных (количество этапов уроков), которое будет выгружено запросом (необязательный параметр, можно указать значение от 1 до 1000, по умолчанию 1000).

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/GetStatistics?Token=SomeToken&Lessons=[{Code:"SomeLessonCode"}]&Users=[{Email:"SomeUserEmail"}]&LastLoadedDataTime=01/27/2020 10:04:42&Portion=10


Пример ответа:

{
        "IsDataFull": false, // Если true, то загружены все данные статистики по указанным параметрам, 
                                      // если нет, то нужно делать ещё запрос, предварительно изменив 
                                      // параметр LastLoadedDataTime
        "Data": [{
                            // идентификатор попытки прохождения урока
                            "LessonTryGuid": "33017099-ecb1-4435-97fd-2a90e921d746"
                            // пользователь, который проходил урока
                            ,"Student": {
                                     "ConnectionIds": [],
                                     "Id": -2147475976,
                                     "Name": null,
                                     "Photo": null,
                                     "Email": "maitakov@mail.ru",
                                     "SharedCount": 0,
                                     "IsShared": false,
                                     "IsRejected": false,
                                     "Type": 0
                             },
                             "Configuration": { // урок, который проходил пользователь
                                     "Id": -2147375499,
                                     "Parent": null,
                                     "Guid": "018c016d-6421-49a9-9f4a-6a7cd55544e5",
                                     "Name": null,
                                     "Code": "NewLessonMaitakov",
                                     "Children": [],
                                     "Type": "Configuration",
                                     "Author": null,
                                     "Editor": null,
                                     "CreationTime": null,
                                     "LastModifyTime": null,
                                     "Index": 0,
                                     "ReadOnly": false,
                                     "Editable": false,
                                     "IsTemplateConfiguration": false,
                                     "CreatedFromTemplate": false,
                                     "Settings": {
                                             "WidgetContainers": [],
                                             "WidgetEventsPermissions": []
                                      },
                                     "Description": null
                              },
                              // этап урока, который проходил пользователь
                              "Phase": { 
                                                     // идентификатор этапа
                                                     "Guid": "2b694061-1712-40da-ba26-246ade18a2fd",
                                                     // название этапа
                                                     "Name": "Новый этап",
                                                     // тип этапа. Возможны варианты: Construction, Process, Classification, 
                                                     // Test, PDFDocument, Iframe
                                                     "Type": "Test",
                                                     // результат прохождения этапа: 
                                                     // true - этап пройден успешно, false - этап не пройден
                                                     "Success": true,
                                                     // количество баллов, которое пользователь 
                                                     // набрал в данном этапе (возможно дробное значение)
                                                     "StudentSuccessTestCount": 3.0,
                                                     // процент успешного прохождения этапа, начиная с которого 
                                                     // этап считается пройденным (устанавливается автором урока)
                                                     "SuccessPercent": 100,
                                                     // признак, что этап ожидает ручной оценки преподавателем
                                                     "WaitForManualCheck": false,
                                                     // количество этапов в уроке
                                                     "LessonPhasesCount": 1,
                                                     // общее количество баллов, которое можно набрать в данном этапе
                                                     "TotalTestCount": 3,
                                                     // порядковый номер этапа в уроке в момент прохождения
                                                     "PhaseIndexInLesson": 0,
                                                     // время начала прохождения этапа
                                                     "StartTime": "2020-01-27T09:14:28",
                                                     // время окончания прохождения этапа
                                                     "EndTime": "2020-01-27T09:14:32",
                                                     // статистика по этапу типа "Тест"
                                                     "TestStatistics": {
                                                           // Вопросы, на которые отвечал студент
                                                           "Questions": [{
                                                                  // Возможные ответы на вопрос
                                                                  "Answers": [{
                                                                         "Guid": "cd6a441b-9bde-47d5-84c1-20908106318a",
                                                                         "Text": "1"
                                                                  }, {
                                                                         "Guid": "dbc0cf2c-7822-4b9d-bc92-0ff42e1fa0fc",
                                                                         "Text": "2"
                                                                  }, {
                                                                         "Guid": "5894b5dd-5406-456e-952a-09affb4cc608",
                                                                         "Text": "3"
                                                                  }, {
                                                                         "Guid": "4da324dd-0c47-45e5-ad89-42a8a2b77717",
                                                                         "Text": "4"
                                                                  }],
                                                                  // Guid`ы правильных ответов (их может быть несколько)
                                                                  "RightAnswersGuids": ["dbc0cf2c-7822-4b9d-bc92-0ff42e1fa0fc"],
                                                                  // Блоки частей вопроса (текста и пропусков) для типа вопроса
                                                                  // Gaps
                                                                  "Blocks": [
                                                                  {
                                                                         // Text, Gap (текст или пропуск)
                                                                         "Type":"Text",
                                                                         "Guid":"d7df5875-d4b4-447e-8a81-2d465e948ba2",
                                                                         "Text":"Начало текста"
                                                                   },
                                                                   {
                                                                         "Type":"Gap",
                                                                         "Guid":"aa3497db-bd19-4aa4-ac06-3e83dd9d6cba",
                                                                         // Input, select (ввод текста или выбор из вариантов)
                                                                         "Mode":"Input",
                                                                         "RightAnswersGuids":[],
                                                                         "IsCaseSensitive":false,
                                                                         // Правильные варианты вводимого текста
                                                                         "Elements":[{
                                                                             "Guid":"f733af6b-ac0f-473e-a6e8-3e6516a5d530",
                                                                             "Text":"1"
                                                                          },{
                                                                              "Guid":"4a2ae4d4-957a-4dc7-8852-4800e08cc516",
                                                                              "Text":"2"
                                                                          }]
                                                                    },
                                                                    {
                                                                          "Type":"Text",
                                                                          "Guid":"6ebb671b-6fd1-4133-89e1-a1ce10114576",
                                                                          "Text":"продолжение текста"
                                                                    },
                                                                    {
                                                                          "Type":"Gap",
                                                                          "Guid":"4a124798-8c9e-4b3c-8b9f-2bf65d4ac596",
                                                                          "Mode":"Select",
                                                                          "RightAnswersGuids":
                                                                          [
                                                                              "bdfec37a-a84e-4b9a-b86b-4c5b40aa1e93"
                                                                          ],
                                                                          "IsCaseSensitive":false,
                                                                          // варианты ответов
                                                                          "Elements":[
                                                                          {
                                                                              "Guid":"26845223-29d6-4208-94f1-592607b9fec5",
                                                                              "Text":"Вариант 1"
                                                                           },
                                                                           {
                                                                              "Guid":"bdfec37a-a84e-4b9a-b86b-4c5b40aa1e93",
                                                                              "Text":"Вариант 2"
                                                                            }]
                                                                       }
                                                                   ],
                                                                  "Guid": "8ddf1537-3422-45f6-a94a-ac07aee7eae1",
                                                                  // Количество баллов, которые получит студент 
                                                                  // при правильном ответе на вопрос
                                                                  "PointsForRightAnswer": 3.0,
                                                                  // Текст правильного ответа (для вопросов типа "Текст")
                                                                  "RightTextAnswer": "",
                                                                  // Текст вопроса
                                                                  "Text": "1+1=?",
                                                                  // Тип вопроса: 
                                                                  // Single - один правильный ответ из многих
                                                                  // Multiple - несколько правильных ответов из многих
                                                                  // Gaps - заполнение пропусков
                                                                  // Text - текстовый ответ
                                                                  "Type": "Single"
                                                            }],
                                                            // Ответы, которые дал студент
                                                            "StudentAnswers": [{
                                                                  // идентификаторы ответов, которые дал студент
                                                                  "AnswersGuids": ["dbc0cf2c-7822-4b9d-bc92-0ff42e1fa0fc"],
                                                                  // максимальное количество баллов, 
                                                                  // которое можно набрать за этот вопрос
                                                                  "MaxPointsForQuestion": 3.0,
                                                                  // идентификатор вопроса, на который был дан ответ
                                                                  "QuestionGuid": "8ddf1537-3422-45f6-a94a-ac07aee7eae1",
                                                                  // количество баллов, 
                                                                  // которое набрал студент за этот вопрос
                                                                  "StudentPoints": 3.0,
                                                                  // тип вопроса
                                                                  "Type": "Single",
                                                                  "Blocks": [
                                                                  {
                                                                      // тут тип всегда = Gap
                                                                      "Type":"Gap",
                                                                      "Guid":"aa3497db-bd19-4aa4-ac06-3e83dd9d6cba",
                                                                      "Mode":"Input",
                                                                      "StudentAnswer":
                                                                      {
                                                                          "Text":"2",
                                                                          "Guid":"4a2ae4d4-957a-4dc7-8852-4800e08cc516"
                                                                      }
                                                                  },
                                                                  {
                                                                      "Type":"Gap",
                                                                      "Guid":"4a124798-8c9e-4b3c-8b9f-2bf65d4ac596",
                                                                      "Mode":"Select",
                                                                      "StudentAnswer":
                                                                      {
                                                                          "Text":"Вариант 2",
                                                                          "Guid":"bdfec37a-a84e-4b9a-b86b-4c5b40aa1e93"
                                                                      }
                                                                  }]
                                                             }]
                                                      }
                                }
                    }],
                    // временная метка (самое позднее время окончания этапа в рамках текущего запроса), 
                    // необходимо для порционной выгрузки статистики.
                    // этот параметр в таком же формате необходимо
                    // передать в следующем запросе, чтобы выгрузить все этапы, 
                    // которые были пройдены после этого времени.
                    "LastLoadedDataTime": "01/27/2020 09:14:32", 
                    // Результат запроса
                    "Success": true,
                    // Сообщение, появляется в случае ошибки
                    "Message": null 
}

Примечание:
Все параметры фактически фильтруют запрашиваемую статистику. Таким образом, можно отбирать данные по конкретному пользователю и уроку, начиная с определённого этапа.
Необходимо отбирать данные порционно и при этом сохранять параметр "LastLoadedDataTime", который необходимо использовать в следующем запросе (это снимает необходимость каждый раз запрашивать всю статистику целиком).
Без указания параметра "LastLoadedDataTime" сервер вернёт первые Portion (по умолчанию 1000) этапов. Более 1000 этапов сервер не возвращает.


18. Агрегированная статистика прохождения уроков

Для получения агрегированной по урокам статистики прохождения уроков необходимо сделать запрос:

/EducationHome/GetStatisticsAggregatedByLesson


Параметры:
Lessons уроки, по которым необходимо получить статистику (необязательный параметр, если не указан, то будет отобрана статистика по всем урокам);
Users пользователи, по которым необходимо получить статистику (необязательный параметр, если не указан, то будет отобрана статистика по всем пользователям);
Token временный ключ, полученный на шаге 2;

GetOnlyFinalResult отбор только конечного результата без самих попыток (необязательный параметр, по умолчанию равен "true");

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/GetStatisticsAggregatedByLesson?Token=SomeToken&Lessons=[{Code:"SomeLessonCode"}]&Users=[{Email:"SomeUserEmail"}]


Пример ответа:

{
   "Data":[{
      // Уроки
      "Lessons":  [{
            // Попытки (отбираются при GetOnlyFinalResult = false)
            "Tries": []
            // Идентификатор урока
           ,"Guid": "659c6dc3-4478-4bc8-af3a-58f08ba3c174"
           // Код урока (тоже уникальный)
        , "Code": "Kofemashiny"
            // Название урока
           ,"Name": "Кофемашины"
            // Урок пройден успешно (Success == true && SomeTryWaitForManualCheck = false) 
            // или урок ожидает проверки (Success == true && SomeTryWaitForManualCheck = true)
            // или урок не пройден (Success == false)
           ,"Success": true
            // Время завершения первой успешной попытки прохождения урока 
           , "SuccessTime": "2022-10-20T09:26:00"
           // Урок ожидает проверки
           ,"SomeTryWaitForManualCheck": false
      }]
      // Студент
      ,"Student": {
           "ConnectionIds": []
          ,"Id": -2147445699
          ,"Name": null
          ,"FamilyName": null
          ,"Patronymic": null
          ,"Entity": null
          ,"Photo": null
          ,"Email": "efe65e86d23086336f37b6c73a47745e/16281"
          ,"SharedCount": 0
          ,"IsShared": false
          ,"IsRejected": false
          ,"Type": 0
      }
}


19. Удаление статистики прохождения уроков

Для удаления статистики прохождения уроков необходимо сделать запрос:

/EducationHome/DeleteUsersStatistics


Параметры:
Lessons уроки, по которым необходимо удалить статистику (необязательный параметр, если не указан, то будет удалена статистика по всем урокам);
Users пользователи, по которым необходимо удалить статистику (необязательный параметр, если не указан, то будет удалена статистика по всем пользователям);
Token временный ключ, полученный на шаге 2;
TimeFrom временная метка, начиная с которой будет удаляться статистика (необязательный параметр, если не указан, то будет удалена статистика за всё время).

Тип запроса:
GET/POST

Пример запроса:

/EducationHome/DeleteUsersStatistics?Token=SomeToken&Lessons=[{Code:"SomeLessonCode"}]&Users=[{Email:"SomeUserEmail"}]&TimeFrom=04/06/2020 15:01:00


Пример ответа:

{ 
       "Success": true
      ,"Message": null
      ,"ErrorCode": null
}

Примечание:
Все параметры фактически фильтруют удаляемую статистику. Таким образом, можно удалять данные по конкретному пользователю и уроку, начиная с определённого времени.


20. Подписка на события урока (встроенного в iframe) родительской страницей (страница, в которой находится iframe)

Урок, встраиваемый с помощью iframe в сторонний сайт, может отправлять некоторые события родительскому для iframe окну.
Чтобы подписаться на какое-либо событие необходимо вставить следующий код (или его модификацию) на языке JavaScript в страницу, в которую встроен iframe:

var eventMethod = window.addEventListener ? "addEventListener" : "attachEvent";
var eventer = window[eventMethod];
var messageEvent = eventMethod === "attachEvent" ? "onmessage" : "message";
eventer(messageEvent, function (e) {
      let Event = e.data || e.message;
      console.log(Event);
});


Пример структуры параметра Event:

{
      Type: "LessonFinished", // тип события
      Data: {
              Success: true, // успешность прохождения урока
              Code: "Novaya-konfiguraciya12345678921", // код урока
              Name: "Новая конфигурация", // название урока
              Guid: "29904894-0928-4c4d-99c7-339f2bd1bd7c", // guid урока
              SuccessPhasesCount: 7, // количество успешно пройденных этапов
              TotalPhasesCount: 7, // количество этапов всего
              TotalPhasesWithProgressCount: 1, // количество этапов с заданиями
              TotalProgressPercent: 100 // общий процент выполнения урока
      }
}


Примечание:
При успешном прохождении урока (Success = true) общий процент выполнения урока (TotalProgressPercent) не всегда будет равен 100.

Загрузка
1_Гости
Корзина
Заказы
Подписки