Как написать telegram бота на C#
Первое, что нужно сделать — это зарегистрировать своего бота и получить токен для доступа к 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); }
Первое действие здесь показывает красивое пропадающее сообщение, второе — прячет клавиатуру.