Ваш первый чат-бот на 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