StepikApiClient 2.1.4

There is a newer version of this package available.
See the version list below for details.
dotnet add package StepikApiClient --version 2.1.4
                    
NuGet\Install-Package StepikApiClient -Version 2.1.4
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="StepikApiClient" Version="2.1.4" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="StepikApiClient" Version="2.1.4" />
                    
Directory.Packages.props
<PackageReference Include="StepikApiClient" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add StepikApiClient --version 2.1.4
                    
#r "nuget: StepikApiClient, 2.1.4"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package StepikApiClient@2.1.4
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=StepikApiClient&version=2.1.4
                    
Install as a Cake Addin
#tool nuget:?package=StepikApiClient&version=2.1.4
                    
Install as a Cake Tool

StepikApiClientLibrary

Неофициальная клиентская библиотека для работы со Stepik.org API на .NET.

NuGet NuGet Models NuGet Downloads .NET License


Содержание


Описание

Библиотека предоставляет типизированный .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 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. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

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
Loading failed