Чат-боты на C#: пишем умного помощника с нуля

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Ваш первый чат-бот на C#: от идеи до работающего помощника

Вы когда-нибудь хотели создать своего умного помощника? Не того, который просто отвечает «Привет», а настоящего бота, который может заказать пиццу, напомнить о встрече или модерировать чат. Хорошая новость: для этого не нужно быть гуру машинного обучения. Достаточно знать C# и иметь пару свободных вечеров.

В этой статье мы разберем, как написать чат-бота на C# с нуля. Никакой магии — только понятный код, правильная архитектура и практические советы. Вы узнаете, как подключиться к Telegram Bot API, обрабатывать команды и строить диалоги. Поехали!

Почему C# идеален для чат-ботов?

Многие думают, что ботов пишут только на Python или JavaScript. Но C# — мощный и недооцененный инструмент для этой задачи. Вот почему:

  • Строгая типизация — вы поймаете ошибку на этапе компиляции, а не в продакшне.
  • Async/await — бот должен обрабатывать тысячи запросов одновременно. C# справляется с этим на ура.
  • Экосистема .NET — готовые библиотеки для Telegram, Discord, Slack и даже собственных протоколов.
  • Производительность — .NET Core / .NET 8 работает быстро и потребляет мало памяти.

Если вы уже пишете на C#, вы на полпути к созданию профессионального чат-бота. А если нет — это отличный повод начать.

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

Прежде чем писать код, давайте подумаем, как будет устроен наш чат-бот на C#. Плохая архитектура — причина 90% проблем. Хорошая новость: для простого бота достаточно трех компонентов:

  • Клиент API — общается с мессенджером (Telegram, VK, Discord).
  • Обработчик команд — парсит сообщения и решает, что делать.
  • Логика — сами функции: поиск, расчеты, запросы к БД.

Мы будем использовать паттерн Chain of Responsibility (цепочка обязанностей) для обработки команд. Это гибко и легко расширяется. Добавить новую команду — 5 минут.

Подготовка: что нужно установить

Для работы нам понадобится:

  • .NET SDK 8.0 или выше — скачайте с официального сайта.
  • Любая IDE: Visual Studio, Rider или VS Code.
  • Аккаунт в Telegram (для тестирования).

Создайте новый проект:

dotnet new console -n MyTelegramBot
cd MyTelegramBot
dotnet add package Telegram.Bot

Библиотека Telegram.Bot — самая популярная для C#. Она полностью покрывает API Telegram и активно поддерживается.

Получаем токен бота

Зайдите в Telegram, найдите @BotFather и выполните команду /newbot. Следуйте инструкциям. В конце вы получите токен — секретную строку вида:

1234567890:ABCdefGHIjklmNOPqrstUVwxyz-1234567

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

Пишем код: подключаемся к Telegram

Начнем с самого простого — бот, который отвечает «Привет!» на любое сообщение.

using Telegram.Bot;
using Telegram.Bot.Types;
using Telegram.Bot.Polling;

var botClient = new TelegramBotClient("ВАШ_ТОКЕН");

using var cts = new CancellationTokenSource();

var receiverOptions = new ReceiverOptions
{
    AllowedUpdates = { } // получаем все типы обновлений
};

botClient.StartReceiving(
    updateHandler: HandleUpdateAsync,
    pollingErrorHandler: HandlePollingErrorAsync,
    receiverOptions: receiverOptions,
    cancellationToken: cts.Token
);

Console.WriteLine("Бот запущен. Нажмите любую клавишу для остановки.");
Console.ReadKey();
cts.Cancel();

async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
    if (update.Message is not { } message)
        return;
    if (message.Text is not { } messageText)
        return;

    var chatId = message.Chat.Id;
    Console.WriteLine($"Получено сообщение: {messageText}");

    await botClient.SendTextMessageAsync(
        chatId: chatId,
        text: "Привет! Я простой бот на C#.",
        cancellationToken: cancellationToken);
}

Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
    Console.WriteLine($"Ошибка: {exception.Message}");
    return Task.CompletedTask;
}

Запустите программу и напишите боту в Telegram. Если всё сделано правильно — он ответит. Ура, первый чат-бот на C# работает!

Добавляем команды: бот становится умнее

Простое эхо — это скучно. Давайте добавим команды: /start, /help и /weather.

async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
    if (update.Message is not { } message)
        return;
    if (message.Text is not { } messageText)
        return;

    var chatId = message.Chat.Id;

    // Обработка команд
    if (messageText.StartsWith("/"))
    {
        var command = messageText.Split(' ')[0].ToLower();
        switch (command)
        {
            case "/start":
                await botClient.SendTextMessageAsync(chatId, "Добро пожаловать! Я бот-помощник. Напишите /help для списка команд.");
                break;
            case "/help":
                await botClient.SendTextMessageAsync(chatId, "Доступные команды:\n/start - приветствие\n/help - помощь\n/weather - погода (пока заглушка)");
                break;
            case "/weather":
                await botClient.SendTextMessageAsync(chatId, "Функция погоды в разработке. Скоро всё будет!");
                break;
            default:
                await botClient.SendTextMessageAsync(chatId, $"Команда '{command}' не найдена. Используйте /help.");
                break;
        }
    }
    else
    {
        // Если не команда — отвечаем эхом
        await botClient.SendTextMessageAsync(chatId, $"Вы написали: {messageText}");
    }
}

Теперь бот понимает команды. Но такой код быстро станет громоздким. Давайте рефакторим.

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

Создайте класс CommandHandler, который будет регистрировать и выполнять команды. Это сделает ваш чат-бот на C# гибким и тестируемым.

public interface ICommand
{
    string Name { get; }
    Task Execute(ITelegramBotClient botClient, Message message, CancellationToken ct);
}

public class StartCommand : ICommand
{
    public string Name => "/start";
    public async Task Execute(ITelegramBotClient botClient, Message                

Блоги

Рекомендаций по книгам