![](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/e77/8fc/902/e778fc902d5fc8c8016f600f4819584a.jpg)
Добрый день, уважаемые друзья!
В этой статье мы рассмотрим заготовку для создания телеграм бота на C#. В связи с последними обновлениями TelegramBotAPI, большая часть удачных с моей точки зрения публикаций на эту тему несколько устарело. Потому я принял решение написать статью на эту тему.
Процесс создания и отладки бота был записан и освещен в видеоролике в статье ниже. В телеграм группе можно задать вопрос по данной тематике.
Чуть подробнее
Мы будем пользоваться библиотеками Telegram.Bot и Telegram.Bot.Extentions.Polling, обновления будем получать периодически опрашивая Telegram сервер на наличие новых обновлений. Webhook'и мы использовать не будем...Тпру, подождите меня забрасывать гнилыми помидорами, матерые кодеры! Да, метод получения обновлений основанный на Webhook'ах лучше, но Polling проще в реализации поскольку не нужно получать SSL-сертификат и бот можно запустить сразу после написания кода без дополнительных заморочек. На этом новичок может застопориться. К тому же есть ряд нюансов при использовании Webhook'ов на моем сервере. Если они есть у меня, значит они могут быть и у Вас. Потому используем метод периодического опроса сервера Телеграма на наличие новых обновлений. Ладно, уважаемый читатель, если Вы все еще со мной не согласны и желаете получить сертификат и работать на Webhook'ах, можешь почитать о получении сертификата в этой статье.
Существующие схемы работы telegram бота
Мне нравится схема работы telegram бота на C#, описанная в этой статье. Считаю ее хорошим примером. Вот код:
using Telegram.Bot;
using Telegram.Bot.Args;
using Telegram.Bot.Types;
using Telegram.Bot.Types.Enums;
class Program
{
private static TelegramBotClient client;
static void Main(string[] args)
{
// token, который вернул BotFather
client = new TelegramBotClient(token);
client.OnMessage += BotOnMessageReceived;
client.OnMessageEdited += BotOnMessageReceived;
client.StartReceiving();
Console.ReadLine();
client.StopReceiving();
}
private async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
{
var message = messageEventArgs.Message;
if (message?.Type == MessageType.TextMessage)
{
await client.SendTextMessageAsync(message.Chat.Id, message.Text);
}
}
}
Там ничего лишнего. Создаем объект TelegramBotClient чтобы взаимодействовать с нашим ботом с помощью библиотеки, прописываем ему токен, который выдал нам BotFather. Далее создаем событие OnMessage, обрабатываем его методом BotOnMessageReceived и запускаем клиент.
Однако с выходом более новых версий TelegramBotAPI оказалось, что такая схема больше не работает. Более того, боты, написанные на более ранних версиях Telegram.Bot перестают работать после обновления библиотеки.
![](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/47a/094/3cd/47a0943cd1ee3daa6fc07c35996311cd.png)
Нужно использовать другую схему. Давайте попробуем в этом разобраться.
Пошаговая инструкция
Итак ниже я набросал следующий список шагов, которые приведут вас к рабочему telegram боту.
1. Запускаем Visual Studio Community, создаем консольное приложение.
Если у Вас отсутствует Visual Studio Community, Вы можете установить ее используя статью или несколько устаревшее видео. При этом желательно выбирать установку Visual Studio Community 2022 как наиболее актуальную версию на текущий момент.
![Создаем проект Создаем проект](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/c8c/e9e/bed/c8ce9ebed07f02c3ea791c098cb226d3.png)
![Называем проект как нам удобно Называем проект как нам удобно](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/1db/337/3de/1db3373deab02ce680c3b62a189a1474.png)
![Выбираем платформу .NET 3.1 Выбираем платформу .NET 3.1](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/8e7/d5d/36d/8e7d5d36d323860c26aecbcabec6a5e6.png)
![Проект создан! Проект создан!](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/d9d/cab/711/d9dcab7118cbb1d96c9734f1a2e19ebb.png)
2. Добавляем в консольное приложение библиотеку Telegram.Bot, Telegram.Bot.Extentions.Polling и Netonsoft.Json
![Открытие NuGet Открытие NuGet](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/c58/8e9/216/c588e921625eebc2ee7db67216f94b72.png)
![Поиск библиотеки Поиск библиотеки](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/235/06c/3a4/23506c3a4fffdf1436bb3a9f0f456690.png)
![Установка пакета Установка пакета](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/cad/f33/b49/cadf33b49e101acbbf116109c7d91d7d.png)
По завершению у Вас должны быть установлены и отображены названия пакетов, которые мы установили.
![](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/d6f/65d/5cf/d6f65d5cfb9dd85079a1c207488c6d84.png)
Netonsoft.Json применимо к нашей заготовке нужна для того, чтобы у нас была возможность вывести на консоль сообщение от пользователя.
![](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/6c8/828/48d/6c882848d7f10debefc550185dc13445.png)
3. Создаем telegram бот в BotFather. Копируем его api key для работы.
Находим в telegram BotFather, отправляем ему /newbot, название и логин бота
![](https://webcf.waybackmachine.org/web/20220917140353/https://habrastorage.org/getpro/habr/upload_files/08c/a0a/1c0/08ca0a1c0cbafb32c9a90a9e521b42a2.png)
BotFather должен нам предоставить API key, который мы должны вставить в код-каркас в следующем шаге в строке
static ITelegramBotClient bot = new TelegramBotClient("TOKEN");
4. В файл Program.cs вставляем следующий код-каркас:
using System;
using System.Threading;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Extensions.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Exceptions;
namespace TelegramBotExperiments
{
class Program
{
static ITelegramBotClient bot = new TelegramBotClient("TOKEN");
public static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
// Некоторые действия
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(update));
if(update.Type == Telegram.Bot.Types.Enums.UpdateType.Message)
{
var message = update.Message;
if (message.Text.ToLower() == "/start")
{
await botClient.SendTextMessageAsync(message.Chat, "Добро пожаловать на борт, добрый путник!");
return;
}
await botClient.SendTextMessageAsync(message.Chat, "Привет-привет!!");
}
}
public static async Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
// Некоторые действия
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(exception));
}
static void Main(string[] args)
{
Console.WriteLine("Запущен бот " + bot.GetMeAsync().Result.FirstName);
var cts = new CancellationTokenSource();
var cancellationToken = cts.Token;
var receiverOptions = new ReceiverOptions
{
AllowedUpdates = { }, // receive all update types
};
bot.StartReceiving(
HandleUpdateAsync,
HandleErrorAsync,
receiverOptions,
cancellationToken
);
Console.ReadLine();
}
}
}
5. Редактируем код под свои нужды и задачи.
Главное задачей, которую должен выполнять бот - это реагировать на сообщения, которые отправляет ему пользователь. Конечно, разработчики telegram'a заложили возможность отслеживания и реагирования на много других событий.
К важным я бы отнес еще нажатие кнопки inline клавиатуры пользователем, inline mode - когда пользователь вводит логин бота и поисковой запрос в текстовое поле и бот предоставляет список найденных объектов по этому запросу. Также интересно было бы рассмотреть событие публикации нового поста на канале. Получение от пользователя его номера телефона, файла или геолокации. Но это материал для следующих видеороликов и статей. Если Вам интересно увидеть этот материал на YouTube канале или в статье, ставьте лайки, делитесь статьей с друзьями. При достижении 200 лайков и 20 комментариев я буду знать, что вам нравится данная тема и напишу продолжение.
Итак что мы можем сделать когда пользователь отправил нашему боту сообщение?
Во-первых мы можем вывести ее на консоль. Для этого в Nuget установим либу Newtonsoft и пропишем в методе HandleUpdateAsync.
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(update));
Конечно, мы можем проверить что он нам прислал. И если текст сообщения будет тем, который мы ждем, выполнить определенные действия.Например если пользователь нажал кнопку Start и тем самым отправил боту текст "/start", мы можем отправить ему в ответ "Добро пожаловать на борт, добрый путник!".
if (update.Type == Telegram.Bot.Types.Enums.UpdateType.Message)
{
var message = update.Message;
if (message.Text.ToLower() == "/start")
{
await botClient.SendTextMessageAsync(message.Chat, "Добро пожаловать на борт, добрый путник!");
return;
}
await botClient.SendTextMessageAsync(message.Chat, "Здоров, братан! И тебе не хворать!");
}
if (update.Type == Telegram.Bot.Types.Enums.UpdateType.Message)
Здесь мы проверяем тип обновления. Если пользователь отправил нам сообщение, выполняем ниже описанные действия.
var message = update.Message;
Создаем новую переменную для удобства и записываем в нее всю информацию о пришедшем сообщении.
if (message.Text.ToLower() == "/start")
Проверяем какой текст отправил пользователь. Если текст сообщения в нижнем регистре (.ToLower()) является словом "/start", то пишем ему сообщение "Добро пожаловать на борт, добрый путник!". И останавливаем выполнение метода командой return.
Целесообразно также данные этого пользователя записать в какую-нибудь базу данных. Например MySQL, PostgreSQL или еще какую-то. Или просто в файл. Напишите в комментариях если Вам это интересно.
А если пользователь отправит боту другое сообщение, например "Здравствуй", мы можем написать боту, например, "Здоров, братан! И тебе не хворать"
await botClient.SendTextMessageAsync(message.Chat, "Здоров, братан! И тебе не хворать!");
Думаю принцип вы поняли.
Полный код ниже:
using System;
using System.Threading;
using System.Threading.Tasks;
using Telegram.Bot;
using Telegram.Bot.Extensions.Polling;
using Telegram.Bot.Types;
using Telegram.Bot.Exceptions;
namespace TelegramBotExperiments
{
class Program
{
static ITelegramBotClient bot = new TelegramBotClient("TOKEN");
public static async Task HandleUpdateAsync(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken)
{
// Некоторые действия
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(update));
if(update.Type == Telegram.Bot.Types.Enums.UpdateType.Message)
{
var message = update.Message;
if (message.Text.ToLower() == "/start")
{
await botClient.SendTextMessageAsync(message.Chat, "Добро пожаловать на борт, добрый путник!");
return;
}
await botClient.SendTextMessageAsync(message.Chat, "Привет-привет!!");
}
}
public static async Task HandleErrorAsync(ITelegramBotClient botClient, Exception exception, CancellationToken cancellationToken)
{
// Некоторые действия
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(exception));
}
static void Main(string[] args)
{
Console.WriteLine("Запущен бот " + bot.GetMeAsync().Result.FirstName);
var cts = new CancellationTokenSource();
var cancellationToken = cts.Token;
var receiverOptions = new ReceiverOptions
{
AllowedUpdates = { }, // receive all update types
};
bot.StartReceiving(
HandleUpdateAsync,
HandleErrorAsync,
receiverOptions,
cancellationToken
);
Console.ReadLine();
}
}
}
Не забудьте вставить в код API key от Вашего бота там, где написано TOKEN.
Для удобства записал видео.
Заключение
Итак в этой статье мы с вами создали telegram бот с нуля и протестировали его на работоспособность. Созданную заготовку можно будет использовать в дальнейшем для создания полномасштабных коммерческих проектов.