Как написать telegram бота на C#

26.11.2017 at 21:03

Первое, что нужно сделать — это зарегистрировать своего бота и получить токен для доступа к API. Сделать это очень просто с помощью официального бота @botfather.

Бота создали, токен получили, можно писать код. Сначала нужно добавить враппер telegram api.

dotnet add package Telegram.Bot

Создадим инстанс клиента апи и получим имя нашего бота

TelegramBotClient botClient = new TelegramBotClient("<token>");
var me = botClient.GetMeAsync().Result;
Console.WriteLine(me.Username);

Особенность ботов в телеграмме: они не могут писать первыми. Т.е. общение с ботом обязательно должен инициировать человек, доступа к поиску контактов у ботов нет. Так же нельзя написать человеку, зная его логин. Единственное, что бот может — запомнить ИД чата и писать в этот чат.
Обработка полученных сообщение и отправка сообщений по ИД чата выглядят так:

botClient.OnMessage +=  HandleMessage;
botClient.StartReceiving();

static void HandleMessage(
    object sender, MessageEventArgs messageEventArgs)
{
    chatId = messageEventArgs.Message.Chat.Id;
    botClient.SendTextMessageAsync(chatId, "Hello world");
}

Телеграм предоставляет ботам широкие возможности для улучшения взаимодействия с пользователем. Например клавиатуры. Их 2: обычная и инлайн. Отличаются тем, что обычная — большая и висит под чатом
Создается она вот так:

var markup = new ReplyKeyboardMarkup(new[]
{
        new KeyboardButton("Privet"),                        
        new KeyboardButton("Hello"),
        new KeyboardButton("Zdarova"),
});
markup.OneTimeKeyboard = true;
botClient.SendTextMessageAsync(chatId, "Hello", replyMarkup: markup);

Свойство OneTimeKeyboard позволяет спрятать клавиатуру после нажатия кнопки.

Инлайн клавиатура создается и отправляется так:

var markup = new InlineKeyboardMarkup(new[]
{
    new InlineKeyboardCallbackButton("Privet", "privet"),
    new InlineKeyboardCallbackButton("Hello", "hello"),
    new InlineKeyboardCallbackButton("Zdarova", "zdarova")
    
});
botClient.SendTextMessageAsync(258362107, "Hello", replyMarkup: markup);

Свойства OneTimeKeyboard у нее нет, для того, чтобы ее спрятать — нужно повесить обработчик на нажатие кнопки:

botClient.OnCallbackQuery += HandleCallbackQuery;

static async void HandleCallbackQuery(object sender, CallbackQueryEventArgs callbackQueryEventArgs)
{
    await botClient.AnswerCallbackQueryAsync(callbackQueryEventArgs.CallbackQuery.Id,
        "Received message " + callbackQueryEventArgs.CallbackQuery.Data);
    await botClient.EditMessageReplyMarkupAsync(callbackQueryEventArgs.CallbackQuery.Message.Chat.Id,
        callbackQueryEventArgs.CallbackQuery.Message.MessageId, null);                
}

Первое действие здесь показывает красивое пропадающее сообщение, второе — прячет клавиатуру.