StepikApiClient 2.2.0
dotnet add package StepikApiClient --version 2.2.0
NuGet\Install-Package StepikApiClient -Version 2.2.0
<PackageReference Include="StepikApiClient" Version="2.2.0" />
<PackageVersion Include="StepikApiClient" Version="2.2.0" />
<PackageReference Include="StepikApiClient" />
paket add StepikApiClient --version 2.2.0
#r "nuget: StepikApiClient, 2.2.0"
#:package StepikApiClient@2.2.0
#addin nuget:?package=StepikApiClient&version=2.2.0
#tool nuget:?package=StepikApiClient&version=2.2.0
StepikApiClientLibrary
Неофициальная клиентская библиотека для работы со Stepik.org API на .NET.
Содержание
- Описание
- Установка
- Быстрый старт
- Доступные клиенты
- Примеры использования
- Обработка ошибок
- Конфигурация
- LongTask
- Версионирование
- Лицензия
Описание
Библиотека предоставляет типизированный .NET-клиент для Stepik.org API, позволяя работать с курсами, уроками, шагами, решениями, пользователями и другими ресурсами платформы. Аутентификация выполняется через OAuth2 Client Credentials. Библиотека ориентирована на .NET 9 и использует Newtonsoft.Json для сериализации.
Пакет StepikApiClient содержит клиентскую логику и зависит от StepikApiClient.Models, в котором хранятся все модели данных Stepik API.
Установка
Полный клиент (включает модели)
dotnet add package StepikApiClient
Только модели
dotnet add package StepikApiClient.Models
StepikApiClientавтоматически подтягиваетStepikApiClient.Modelsкак зависимость — устанавливать оба пакета вручную не нужно.
Быстрый старт
1. Получите OAuth2-реквизиты
Создайте приложение на https://stepik.org/oauth2/applications/ и скопируйте Client ID и Client Secret.
2. Зарегистрируйте клиент в DI
// Program.cs
builder.Services.AddStepikApiClient(options =>
{
options.ClientId = Environment.GetEnvironmentVariable("STEPIK_CLIENT_ID");
options.ClientSecret = Environment.GetEnvironmentVariable("STEPIK_CLIENT_SECRET");
});
3. Внедрите IApiClient и выполните первый запрос
public class MyService
{
private readonly IApiClient _client;
public MyService(IApiClient client)
{
_client = client;
}
public async Task<Course?> GetCourseAsync(int id)
{
return await _client.Courses.GetAsync(id);
}
}
Доступные клиенты
Все клиенты доступны как свойства интерфейса IApiClient.
| Свойство | Интерфейс | Описание |
|---|---|---|
Announcements |
IAnnouncementClient<Announcement> |
Объявления / почтовые рассылки |
Courses |
ICourseRequestClient<Course> |
Курсы |
Sections |
ISectionRequestClient<Section> |
Разделы курса |
Units |
IUnitRequestClient<Unit> |
Юниты курса |
Lessons |
ILessonRequestClient<Lesson> |
Уроки |
Steps |
IStepRequestClient<Step> |
Шаги урока |
StepSources |
IStepSourceClient<StepSource> |
Источники шагов (содержимое) |
CreateStepSources |
ICreateStepSourceClient |
Создание источников шагов |
Submissions |
ISubmissionRootClient<Submission> |
Решения пользователей |
Assignments |
IAssignmentClient<Assignment> |
Назначения |
DiscussionThreads |
IDiscussionThreadClient<DiscussionThread> |
Ветки обсуждений |
DiscussionProxies |
IDiscussionProxiesClient<DiscussionProxy> |
Прокси-объекты дискуссий |
Users |
IUserRequestClient<User> |
Пользователи |
UserActivities |
IUserActivityClient<UserActivity> |
Активность пользователей |
UserActivitySummaries |
IUserActivitySummaryClient<UserActivitySummary> |
Сводка активности пользователей |
CourseReviews |
ICourseReviewClient<CourseReview> |
Отзывы на курс |
CourseReviewSummaries |
ICourseReviewSummaryClient<CourseReviewSummary> |
Сводка отзывов |
SocialProfiles |
ISocialProfilesClient<SocialProfile> |
Социальные профили пользователей |
Comments |
ICommentClient<Comment> |
Комментарии |
Attempts |
IAttemptClient<Attempt> |
Попытки (attempts) |
LongTasks |
ILongTaskClient<LongTask> |
Длительные задачи |
Members |
IMemberRequestClient<Member> |
Участники групп |
FeedbackForms |
IFeedbackFormClient |
Создание/редактирование шагов через форму |
Certificates |
ICertificateClient |
Сертификаты |
PromoCodes |
IPromoCodeClient<PromoCode> |
Промокоды |
CourseBenefits |
ICourseBenefitClient |
Выплаты (course benefits) |
StepSnapshots |
IStepSnapshotClient |
История изменений шагов |
AuthClient |
AuthenticationClient |
Аутентификация OAuth2 (низкоуровневый) |
RootClient |
RootClient |
Произвольные HTTP-запросы к API (низкоуровневый) |
Примеры использования
Курсы
// Получить курс по ID
var course = await _client.Courses.GetAsync(courseId);
// Получить все курсы преподавателя
var courses = await _client.Courses.GetByTeacher(teacherId);
// Обновить курс
await _client.Courses.Update(course);
Разделы и юниты
// Получить разделы курса в виде потока
await foreach (var section in _client.Sections.GetByCourseAsync(course))
{
Console.WriteLine(section.Title);
}
// Получить юниты раздела
var units = await _client.Units.GetBySectionAsync(section);
Уроки и шаги
// Получить уроки курса
var lessons = await _client.Lessons.GetLessonsAsync(courseId);
// Получить шаги урока по ID
var steps = await _client.Steps.GetByLessonId(lessonId.ToString());
Источники шагов
// Получить источники шагов урока
var stepSources = await _client.StepSources.GetByLessonId(lessonId);
// Обновить источник шага
var updated = await _client.StepSources.Update(stepSource);
// Создать источник шага
var created = await _client.StepSources.Create(stepSource);
Решения (Submissions)
// Загрузить все решения по шагу в виде потока
await foreach (var submission in _client.Submissions.LoadAllByStepAsync(stepId, cancellationToken))
{
Console.WriteLine($"{submission.UserId}: {submission.Status}");
}
// Получить решения начиная с даты
await foreach (var submission in _client.Submissions.GetAllByStepAsync(stepId, fromDate, cancellationToken))
{
// ...
}
Пользователи
// Получить пользователя по ID
var user = await _client.Users.GetAsync(userId);
// Получить всех пользователей группы
var users = await _client.Users.GetAllFromGroup(groupId, cancellationToken);
// Получить пользователей по списку ID в виде потока
await foreach (var user in _client.Users.GetUsersByIdsAsync(ids, cancellationToken))
{
// ...
}
Комментарии
// Получить все комментарии к шагу
await foreach (var comment in _client.Comments.GetAllByStep(stepId, cancellationToken))
{
Console.WriteLine(comment.Text);
}
// Комментарии к курсу начиная с даты
await foreach (var comment in _client.Comments.GetByCourse(courseId, targetDate, cancellationToken))
{
// ...
}
Участники групп
// Получить всех участников группы в виде потока
await foreach (var member in _client.Members.GetMembersByGroupIdAsync(groupId, cancellationToken))
{
Console.WriteLine(member.UserId);
}
// Добавить пользователя в группу
var member = await _client.Members.AssignToGroup(groupId, userId);
// Добавить пользователя в несколько групп
var success = await _client.Members.AssignToGroups(groupIds, userId);
Отзывы на курс
// Загрузить все отзывы в виде потока
await foreach (var review in _client.CourseReviews.GetAllByCourse(courseId, cancellationToken))
{
Console.WriteLine(review.Text);
}
// Отзывы начиная с даты
await foreach (var review in _client.CourseReviews.GetLastByCourse(courseId, startDate, cancellationToken))
{
// ...
}
Сертификаты
// Получить сертификаты курса в виде потока страниц
await foreach (var page in _client.Certificates.GetByCourse(courseId, cancellationToken))
{
foreach (var cert in page)
Console.WriteLine(cert.UserId);
}
// Найти сертификат конкретного пользователя по курсу
var cert = await _client.Certificates.GetByUserAndCourse(userId, courseId, cancellationToken);
Промокоды
// Получить промокоды курса
var codes = await _client.PromoCodes.GetPromoCodes(courseId);
// Создать промокод
var created = await _client.PromoCodes.Create(new CreatePromoCode { ... });
Выплаты (CourseBenefits)
// Выплаты начиная с даты
await foreach (var page in _client.CourseBenefits.GetByCourseAsync(courseId, startDate, cancellationToken))
{
foreach (var benefit in page)
Console.WriteLine(benefit.Amount);
}
// Выплаты по месяцам
await foreach (var page in _client.CourseBenefits.GetCourseBenefitByMonths(courseId, cancellationToken))
{
// ...
}
История шагов (StepSnapshots)
// Получить историю изменений шага
await foreach (var snapshot in _client.StepSnapshots.GetSnapshots(stepId, cancellationToken))
{
Console.WriteLine(snapshot.CreateDate);
}
Обработка ошибок
| Исключение | Когда возникает |
|---|---|
BadRequestException |
Сервер вернул ответ с кодом 4xx/5xx |
NotFoundException |
Запрошенный объект не найден (пустой ответ API) |
OperationCanceledException |
Превышен тайм-аут LongTask или отменён CancellationToken |
TooManyIdsException |
Превышен лимит идентификаторов в одном запросе |
try
{
var course = await _client.Courses.GetAsync(courseId);
}
catch (NotFoundException ex)
{
Console.WriteLine($"Не найден: {ex.ObjectType.Name} id={ex.Id}");
}
catch (BadRequestException ex)
{
Console.WriteLine($"Ошибка API [{(int)ex.StatusCode}]: {ex.ResponseMessage}");
Console.WriteLine($"Эндпоинт: {ex.Endpoint}");
}
Конфигурация
Конфигурация передаётся через StepikApiConfiguration при регистрации сервиса.
| Свойство | Тип | Описание |
|---|---|---|
ClientId |
string? |
Client ID OAuth2-приложения Stepik |
ClientSecret |
string? |
Client Secret OAuth2-приложения Stepik |
builder.Services.AddStepikApiClient(options =>
{
options.ClientId = Environment.GetEnvironmentVariable("STEPIK_CLIENT_ID");
options.ClientSecret = Environment.GetEnvironmentVariable("STEPIK_CLIENT_SECRET");
});
Значения рекомендуется хранить в переменных окружения или в secrets.json — не в исходном коде.
LongTask
Некоторые операции Stepik API (например, генерация отчётов) выполняются асинхронно на стороне сервера и возвращают объект LongTask. Клиент LongTasks позволяет отправить запрос и дождаться его завершения.
// Отправить запрос на выполнение задачи
var task = await _client.LongTasks.SendRequest(courseId, "submissions_report");
if (task is not null)
{
// Ожидать завершения с тайм-аутом и токеном отмены
var result = await _client.LongTasks.GetAsync(
task.Id,
timeout: TimeSpan.FromMinutes(2),
cancellationToken: cts.Token
);
if (result?.Status == "ready")
{
Console.WriteLine(result.Tag); // URL или идентификатор результата
}
}
Если задача не завершается за время timeout, выбрасывается OperationCanceledException.
Версионирование
Пакеты StepikApiClient и StepikApiClient.Models версионируются независимо и следуют Semantic Versioning.
| Пакет | Текущая версия |
|---|---|
StepikApiClient |
2.0.1 |
StepikApiClient.Models |
2.0.2 |
Лицензия
Распространяется под лицензией MIT.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- Microsoft.Extensions.DependencyInjection.Abstractions (>= 9.0.10)
- Microsoft.Extensions.Http (>= 9.0.10)
- Newtonsoft.Json (>= 13.0.4)
- StepikApiClient.Models (>= 2.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 2.2.0 | 197 | 7/22/2026 |
| 2.1.9 | 130 | 7/21/2026 |
| 2.1.8 | 115 | 7/21/2026 |
| 2.1.7 | 141 | 7/16/2026 |
| 2.1.6 | 125 | 7/14/2026 |
| 2.1.5 | 114 | 7/13/2026 |
| 2.1.4 | 122 | 7/13/2026 |
| 2.1.3 | 117 | 7/13/2026 |
| 2.1.2 | 154 | 7/3/2026 |
| 2.1.1 | 115 | 7/3/2026 |
| 2.1.0 | 119 | 7/3/2026 |
| 2.0.2 | 154 | 6/12/2026 |
| 2.0.1 | 622 | 4/8/2026 |
| 2.0.0 | 121 | 4/7/2026 |
| 1.0.58 | 127 | 3/17/2026 |
| 1.0.57 | 147 | 2/26/2026 |
| 1.0.56 | 124 | 2/25/2026 |
| 1.0.55 | 131 | 2/25/2026 |
| 1.0.54 | 134 | 2/18/2026 |
| 1.0.53 | 151 | 12/29/2025 |