Почему C# — отличный выбор для Telegram бота?
Если вы до сих пор думали, что Telegram-боты пишут только на Python или JavaScript, приготовьтесь удивиться. C# с его строгой типизацией, огромной экосистемой и скоростью работы — настоящий «тяжеловес» для создания ботов. Представьте: вы пишете код один раз, а бот работает годами без сбоев, обрабатывая тысячи сообщений в секунду. Звучит заманчиво, правда?
В этом гайде мы создадим Telegram бота на C# с нуля. Вы узнаете, как зарегистрировать бота у BotFather, подключить библиотеку Telegram.Bot и написать рабочий код с обработкой команд. Никакой воды — только практика и реальные примеры.
Что нам понадобится?
Перед стартом убедитесь, что у вас есть:
- .NET SDK (версия 6.0 или новее) — скачать можно с официального сайта;
- Visual Studio или VS Code (любая IDE, где вы чувствуете себя комфортно);
- Аккаунт в Telegram — без него никак;
- 5 минут свободного времени — остальное сделает C#.
Готовы? Поехали!
Шаг 1. Получаем токен бота через BotFather
Прежде чем писать код, нужно «родить» самого бота. Откройте Telegram и найдите @BotFather — это главный «создатель ботов» в Telegram.
- Напишите команду
/newbot. - Придумайте имя бота (например, MyFirstCSharpBot).
- Придумайте username (обязательно заканчивается на bot, например MyFirstCSharpBot).
- Получите токен — длинную строку вида
123456:ABC-DEF1234ghIkl-zyx57W2v1u123ew11.
Важно: токен — это ключ доступа к вашему боту. Никому его не показывайте и не публикуйте в открытом коде. Лучше хранить в appsettings.json или переменных окружения.
Шаг 2. Создаем проект и устанавливаем библиотеку
Откройте терминал и выполните команды:
dotnet new console -n TelegramBotCSharp
cd TelegramBotCSharp
dotnet add package Telegram.Bot
Мы используем библиотеку Telegram.Bot — это самая популярная и поддерживаемая библиотека для работы с Telegram API на C#. Она берет на себя всю «грязную работу»: подключение к серверу, обработку обновлений, отправку сообщений.
После установки откройте файл Program.cs — здесь мы будем писать магию.
Шаг 3. Пишем базовый код бота
Начнем с самого простого: бот будет отвечать на команды /start и /help. Вот минимальный рабочий код:
using Telegram.Bot;
using Telegram.Bot.Exceptions;
using Telegram.Bot.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
var botClient = new TelegramBotClient("ВАШ_ТОКЕН_ЗДЕСЬ");
using var cts = new CancellationTokenSource();
var receiverOptions = new ReceiverOptions
{
AllowedUpdates = Array.Empty<UpdateType>() // получаем все типы обновлений
};
botClient.StartReceiving(
updateHandler: HandleUpdateAsync,
pollingErrorHandler: HandlePollingErrorAsync,
receiverOptions: receiverOptions,
cancellationToken: cts.Token
);
Console.WriteLine("Бот запущен! Нажмите Enter для остановки.");
Console.ReadLine();
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}' от {chatId}");
if (messageText == "/start")
{
await botClient.SendTextMessageAsync(
chatId: chatId,
text: "Привет! Я бот на C#. Напиши /help, чтобы узнать, что я умею.",
cancellationToken: cancellationToken);
}
else if (messageText == "/help")
{
await botClient.SendTextMessageAsync(
chatId: chatId,
text: "Я пока умею только отвечать на /start и /help. Но скоро научусь большему!",
cancellationToken: cancellationToken);
}
else
{
await botClient.SendTextMessageAsync(
chatId: chatId,
text: $"Ты написал: {messageText}. Пока я не знаю, что на это ответить 😅",
cancellationToken: cancellationToken);
}
}
Task HandlePollingErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
var errorMessage = exception switch
{
ApiRequestException apiRequestException
=> $"Telegram API Error:\n[{apiRequestException.ErrorCode}]\n{apiRequestException.Message}",
_ => exception.ToString()
};
Console.WriteLine(errorMessage);
return Task.CompletedTask;
}
Как это работает?
TelegramBotClient— основной класс для взаимодействия с API.StartReceivingзапускает «прослушку» сообщений в фоновом режиме.HandleUpdateAsync— функция-обработчик, которая вызывается при каждом новом сообщении.- Мы проверяем текст сообщения и отвечаем соответствующим образом.
Замените "ВАШ_ТОКЕН_ЗДЕСЬ" на реальный токен, полученный от BotFather, и запустите программу:
dotnet run
Откройте Telegram, найдите своего бота по username и напишите /start. Если всё сделано правильно — бот ответит!
Шаг 4. Добавляем логику и кнопки
Обычный текст — это скучно. Давайте добавим inline-кнопки, чтобы бот стал интерактивным. Например, сделаем меню с выбором действия.
Установите дополнительный пакет для работы с клавиатурами (он уже есть в Telegram.Bot, но нам нужны Inline-кнопки):
using Telegram.Bot.Types.ReplyMarkups;
Теперь модифицируем обработчик команды /start:
if (messageText == "/start")
{
var inlineKeyboard = new InlineKeyboardMarkup(new[]
{
new[]
{
InlineKeyboardButton.WithCallbackData("Узнать погоду", "weather"),
InlineKeyboardButton.WithCallbackData("Случайный факт", "fact"),
},
new[]
{
InlineKeyboardButton.WithCallbackData("Помощь", "help"),
}
});
await botClient.SendTextMessageAsync(
chatId: chatId,
text: "Привет! Выбери действие:",
replyMarkup: inlineKeyboard,
cancellationToken: cancellationToken);
}
Теперь нужно обработать нажатие на кнопки. Для этого добавим обработку CallbackQuery