Telegram бот на C#: создаем с нуля за 30 минут

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

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

Начать курс

Почему 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.

  1. Напишите команду /newbot.
  2. Придумайте имя бота (например, MyFirstCSharpBot).
  3. Придумайте username (обязательно заканчивается на bot, например MyFirstCSharpBot).
  4. Получите токен — длинную строку вида 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

Блоги

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