Как написать Telegram бота на C#? [Часть 1]
Приветствую всех в своем уроке по написанию Telegram бота на языке программирования C#. В этом уроке я постараюсь максимально просто и понятно объяснить как написать своего бота с нуля. Конечно, здесь не будет какого-то трудного проекта, я дам вам необходимую базу, с помощью которой вы сможете писать своих ботов.
Начало
Для начала нам требуется зарегистрировать нашего бота. Делается это через «Ботобатю» (кликабельно) в самом Telegram.

- Переходим по ссылке и попадаем в диалог с BotFather и жмем «Запустить». BotFather — это официальный бот Telegram`а, через которого проходит регистрация и настройка ваших ботов.
- От вашего лица должна отправиться команда /start , на которую бот ответит большим списком команд с описаниями. Подробно изучить каждую Вы можете сами, а мы двигаемся к шагу 3.
- Используем команду /newbot. На этом шаге нужно отправить боту имя Вашего будущего бота. Например, пусть это будет Александр Николаевич.
- Далее нас попросят ввести username бота, учтите, что он должен быть написан строго на латинице, а также содержать bot или _bot в конце.Username — это уникальный идентификатор аккаунта (вашего или бота), по которому люди могут найти аккаунт в поиске. В случае, если username уже занят, вас попросят использовать другой.
- После всех выполнений действий, Ботобатя присылает нам небольшое сообщение, в котором говорится об успешном создании бота. Из этого сообщения нам нужен token (уникальный ключ), с помощью которого мы будем авторизировать нашего бота в дальнейшем, он имеет примерно такой вид:13523457:AFAgd_SDFG6sd7f6asdf67asdf78. Учтите, что абсолютно никому нельзя присылать этот token! Это ваш секретный ключ для доступа к боту.
Создание проекта в IDE
После того, как мы создали бота, перейдем к созданию проекта в вашей IDE. У меня это Rider от компании JetBrains. Вы можете использовать эту же IDE, либо Visual Studio от компании Microsoft, либо все от той же компании Visual Studio Code.
По сути, вы можете создать любой тип проекта, будь то консольное приложение или же какой-нибудь WinForms. Я всегда создаю консольное приложение, так как в будущем делаю деплой на Linux, да и как-то не вижу смысла в создании бота с программным интерфейсом.
Если же вы до сих пор не знаете, что такое IDE, как создавать проекты, то вам явно рано писать ботов, займитесь для начала изучением языка!
После того, как мы создали проект, нам нужно установить библиотеку Telegram.Bot (GitHub библиотеки, Nuget пакет). Сделать это можно либо через терминал в IDE, написав команду
dotnet add Telegram.Bot
либо же использовать графический интерфейс. На момент написания статьи была установлена самая последняя и самая актуальная версия пакета (19.0.0).
У библиотеки есть своя документация, можете посмотреть ее здесь.
Написание бота
Теперь приступим к написанию бота, для начала напишем стандартный класс Program. Добавим туда объект интерфейса ITelegramBotClient и в методе Main создадим стандартные переменные и присвоим им соответствующие значения.
class Program < // Это клиент для работы с Telegram Bot API, который позволяет отправлять сообщения, управлять ботом, подписываться на обновления и многое другое. private static ITelegramBotClient _botClient; // Это объект с настройками работы бота. Здесь мы будем указывать, какие типы Update мы будем получать, Timeout бота и так далее. private static ReceiverOptions _receiverOptions; static async Task Main() < _botClient = new TelegramBotClient(""); // Присваиваем нашей переменной значение, в параметре передаем Token, полученный от BotFather _receiverOptions = new ReceiverOptions // Также присваем значение настройкам бота < AllowedUpdates = new[] // Тут указываем типы получаемых Update`ов, о них подробнее расказано тут https://core.telegram.org/bots/api#update < UpdateType.Message, // Сообщения (текст, фото/видео, голосовые/видео сообщения и т.д.) >, // Параметр, отвечающий за обработку сообщений, пришедших за то время, когда ваш бот был оффлайн // True - не обрабатывать, False (стоит по умолчанию) - обрабаывать ThrowPendingUpdates = true, >; using var cts = new CancellationTokenSource(); // UpdateHander - обработчик приходящих Update`ов // ErrorHandler - обработчик ошибок, связанных с Bot API _botClient.StartReceiving(UpdateHandler, ErrorHandler, _receiverOptions, cts.Token); // Запускаем бота var me = await _botClient.GetMeAsync(); // Создаем переменную, в которую помещаем информацию о нашем боте. Console.WriteLine($" запущен!"); await Task.Delay(-1); // Устанавливаем бесконечную задержку, чтобы наш бот работал постоянно > >
Теперь давайте в этом же классе (можно и в другом) напишем методы UpdateHandler и ErrorHandler.
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) < // Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок try < // Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update switch (update.Type) < case UpdateType.Message: < Console.WriteLine("Пришло сообщение!"); return; >> > catch (Exception ex) < Console.WriteLine(ex.ToString()); >> private static Task ErrorHandler(ITelegramBotClient botClient, Exception error, CancellationToken cancellationToken) < // Тут создадим переменную, в которую поместим код ошибки и её сообщение var ErrorMessage = error switch < ApiRequestException apiRequestException =>$"Telegram API Error:\n[]\n", _ => error.ToString() >; Console.WriteLine(ErrorMessage); return Task.CompletedTask; >
Теперь давайте посмотрим, работает ли наш код ? Жмем на кнопку Debug и проверяем 🙂

Как мы видим, бот успешно запустился, теперь давайте напишем пару сообщений, чтобы понять, получает ли он сообщения

И тут тоже все прекрасно, теперь давайте дополним наш метод UpdateHandler и напишем эхо бота. Также чуть-чуть попозже расскажу немного о типах Update.
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) < // Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок try < // Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update switch (update.Type) < case UpdateType.Message: < // эта переменная будет содержать в себе все связанное с сообщениями var message = update.Message; // From - это от кого пришло сообщение (или любой другой Update) var user = message.From; // Выводим на экран то, что пишут нашему боту, а также небольшую информацию об отправителе Console.WriteLine($"() написал сообщение: "); // Chat - содержит всю информацию о чате var chat = message.Chat; await botClient.SendTextMessageAsync( chat.Id, message.Text, // отправляем то, что написал пользователь replyToMessageId: message.MessageId // по желанию можем поставить этот параметр, отвечающий за "ответ" на сообщение ); return; > > > catch (Exception ex) < Console.WriteLine(ex.ToString()); >>

Как мы видим, все работает идеально. Теперь расскажу о типах Update, так как дальше мы напишем кое-что посложнее. Итак, типы Update:
- Message — принимает в себя все сообщения. Обычные текстовые, фото или видео, аудио или видео сообщения (кружочки), стикеры, контакты, геопозицию, голосование и так далее. Всё, что мы отправляем в чат — это все Message.
- EditedMessage — тут все просто: этот тип принимает в себя любое обновление сообщения. Схож с Message.
- ChannelPost — как и Message, но направлен на каналы.
- EditedChannelPost — аналогичен EditedMessage, но также направлен на каналы.
- CallbackQuery — отвечает за Inline кнопки, они висят под сообщением, возможно, вы их уже видели в других ботах.
- Poll — получает все связанное с голосованием.
- PollAnswner — а этот тип работает только тогда, когда пользователь изменил свой ответ в голосовании.
- ChatMember — всё, что касается людей в чате/канале: зашел, вышел, повысили, понизили, замьютили и т.д.
- MyChatMember — всё, что касается бота в диалоге между пользователем и ботом, т.е. изменения в личных сообщениях.
- ChatJoinRequest — получение информации о поданной заявки на вступление в чат/канал.
- InlineQuery — получение входящих inline запросов. Inline запрос — это, когда вы в чате используете @ и username бота и вводите какой-то запрос, а результат выполнения отправляется в чат от вашего лица с надписью «сделано с помощью. «.
- ChosenInlineResult — а это уже то, что как раз таки выбрал пользователь. Т.е. InlineQuery это просто как разрешение использовать эту функцию, а ChosenInlineResult получает выбор пользователя и обрабатывает его. Знаю, что вы думаете «Они что, совсем идиоты ? Не могли сделать нормально ?», но привыкайте, такого будет полно)
- PreCheckoutQuery — сюда приходит информация о платеже, который начал оплачивать пользователь.
- ShippingQuery — а это срабатывает тогда, когда успешно сработал PreCheckoutQuery , т.е. этот update уже подтверждает успешную оплату пользователем.
Фух, ну вроде все, если желаете посмотреть оригинал, то он находится здесь.
Теперь давайте напишем что-нибудь посложнее. Добавим в AllowedUpdates тип CallbackQuery:
AllowedUpdates = new[] // Тут указываем типы получаемых Update`ов, о них подробнее расказано тут https://core.telegram.org/bots/api#update < UpdateType.Message, // Сообщения (текст, фото/видео, голосовые/видео сообщения и т.д.) UpdateType.CallbackQuery // Inline кнопки >,
Теперь в нашем UpdateHandler добавим обработку команды /start и сделаем там несколько клавиатур, чтобы вы поняли, как работать с разными типами update, а также увидели еще одну клавиатуру, которая называется Reply клавиатура.
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) < // Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок try < // Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update switch (update.Type) < case UpdateType.Message: < // эта переменная будет содержать в себе все связанное с сообщениями var message = update.Message; // From - это от кого пришло сообщение var user = message.From; // Выводим на экран то, что пишут нашему боту, а также небольшую информацию об отправителе Console.WriteLine($"() написал сообщение: "); // Chat - содержит всю информацию о чате var chat = message.Chat; // Добавляем проверку на тип Message switch (message.Type) < // Тут понятно, текстовый тип case MessageType.Text: < // тут обрабатываем команду /start, остальные аналогично if (message.Text == "/start") < await botClient.SendTextMessageAsync( chat.Id, "Выбери клавиатуру:\n" + "/inline\n" + "/reply\n"); return; >if (message.Text == "/inline") < // Тут создаем нашу клавиатуру var inlineKeyboard = new InlineKeyboardMarkup( new List() // здесь создаем лист (массив), который содрежит в себе массив из класса кнопок < // Каждый новый массив - это дополнительные строки, // а каждая дополнительная строка (кнопка) в массиве - это добавление ряда new InlineKeyboardButton[] // тут создаем массив кнопок < InlineKeyboardButton.WithUrl("Это кнопка с сайтом", "https://habr.com/"), InlineKeyboardButton.WithCallbackData("А это просто кнопка", "button1"), >, new InlineKeyboardButton[] < InlineKeyboardButton.WithCallbackData("Тут еще одна", "button2"), InlineKeyboardButton.WithCallbackData("И здесь", "button3"), >, >); await botClient.SendTextMessageAsync( chat.Id, "Это inline клавиатура!", replyMarkup: inlineKeyboard); // Все клавиатуры передаются в параметр replyMarkup return; > if (message.Text == "/reply") < // Тут все аналогично Inline клавиатуре, только меняются классы // НО! Тут потребуется дополнительно указать один параметр, чтобы // клавиатура выглядела нормально, а не как абы что var replyKeyboard = new ReplyKeyboardMarkup( new List() < new KeyboardButton[] < new KeyboardButton("Привет!"), new KeyboardButton("Пока!"), >, new KeyboardButton[] < new KeyboardButton("Позвони мне!") >, new KeyboardButton[] < new KeyboardButton("Напиши моему соседу!") >>) < // автоматическое изменение размера клавиатуры, если не стоит true, // тогда клавиатура растягивается чуть ли не до луны, // проверить можете сами ResizeKeyboard = true, >; await botClient.SendTextMessageAsync( chat.Id, "Это reply клавиатура!", replyMarkup: replyKeyboard); // опять передаем клавиатуру в параметр replyMarkup return; > return; > // Добавил default , чтобы показать вам разницу типов Message default: < await botClient.SendTextMessageAsync( chat.Id, "Используй только текст!"); return; >> return; > > > catch (Exception ex) < Console.WriteLine(ex.ToString()); >>
Как мы видим, бот теперь реагирует на /start:

Вот так выглядит inline клавиатура:

А вот так reply клавиатура:

Причем, если вы понажимаете на кнопки, то как вы уже поняли, ничего не произойдет:)

Конечно, это логично, ведь мы не добавили обработчики этих кнопок. Как вы могли заметить, reply клавиатура — это просто как заготовленный текст для пользователя, поэтому с обработкой этих кнопок у вас не должно возникнуть проблем. Так как это просто дополнительные if в блоке case MessageType.Text. Но я все же покажу, как это сделать, после перейдем к кейсу с Inline клавиатурой.
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) < // Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок try < // Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update switch (update.Type) < case UpdateType.Message: < // тут все переменные // Добавляем проверку на тип Message switch (message.Type) < // Тут понятно, текстовый тип case MessageType.Text: < // а тут обработчики команд if (message.Text == "Позвони мне!") < await botClient.SendTextMessageAsync( chat.Id, "Хорошо, присылай номер!", replyToMessageId: message.MessageId); return; >if (message.Text == "Напиши моему соседу!") < await botClient.SendTextMessageAsync( chat.Id, "А самому что, трудно что-ли ?", replyToMessageId: message.MessageId); return; >return; > // тут остальной код > return; > > > catch (Exception ex) < Console.WriteLine(ex.ToString()); >>
Ну, вот так как-то вышло:

Теперь перейдем к блоку с Inline клавиатурами. Для обработки этой клавиатуры нам потребуется добавить в
switch(update.Type) < case UpdateType.Message: < // тут весь код из примеров выше >>
case UpdateType.CallbackQuery: < // Переменная, которая будет содержать в себе всю информацию о кнопке, которую нажали var callbackQuery = update.CallbackQuery; // Аналогично и с Message мы можем получить информацию о чате, о пользователе и т.д. var user = callbackQuery.From; // Выводим на экран нажатие кнопки Console.WriteLine($"() нажал на кнопку: "); // Вот тут нужно уже быть немножко внимательным и не путаться! // Мы пишем не callbackQuery.Chat , а callbackQuery.Message.Chat , так как // кнопка привязана к сообщению, то мы берем информацию от сообщения. var chat = callbackQuery.Message.Chat; // Добавляем блок switch для проверки кнопок switch (callbackQuery.Data) < // Data - это придуманный нами id кнопки, мы его указывали в параметре // callbackData при создании кнопок. У меня это button1, button2 и button3 case "button1": < // В этом типе клавиатуры обязательно нужно использовать следующий метод await botClient.AnswerCallbackQueryAsync(callbackQuery.Id); // Для того, чтобы отправить телеграмму запрос, что мы нажали на кнопку await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > case "button2": < // А здесь мы добавляем наш сообственный текст, который заменит слово "загрузка", когда мы нажмем на кнопку await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "Тут может быть ваш текст!"); await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > case "button3": < // А тут мы добавили еще showAlert, чтобы отобразить пользователю полноценное окно await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "А это полноэкранный текст!", showAlert: true); await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > > return; >
В конечном счете UpdateHandler должен выглядеть вот так:
private static async Task UpdateHandler(ITelegramBotClient botClient, Update update, CancellationToken cancellationToken) < // Обязательно ставим блок try-catch, чтобы наш бот не "падал" в случае каких-либо ошибок try < // Сразу же ставим конструкцию switch, чтобы обрабатывать приходящие Update switch (update.Type) < case UpdateType.Message: < // Эта переменная будет содержать в себе все связанное с сообщениями var message = update.Message; // From - это от кого пришло сообщение (или любой другой Update) var user = message.From; // Выводим на экран то, что пишут нашему боту, а также небольшую информацию об отправителе Console.WriteLine($"() написал сообщение: "); // Chat - содержит всю информацию о чате var chat = message.Chat; // Добавляем проверку на тип Message switch (message.Type) < // Тут понятно, текстовый тип case MessageType.Text: < // тут обрабатываем команду /start, остальные аналогично if (message.Text == "/start") < await botClient.SendTextMessageAsync( chat.Id, "Выбери клавиатуру:\n" + "/inline\n" + "/reply\n"); return; >if (message.Text == "/inline") < // Тут создаем нашу клавиатуру var inlineKeyboard = new InlineKeyboardMarkup( new List() // здесь создаем лист (массив), который содрежит в себе массив из класса кнопок < // Каждый новый массив - это дополнительные строки, // а каждая дополнительная кнопка в массиве - это добавление ряда new InlineKeyboardButton[] // тут создаем массив кнопок < InlineKeyboardButton.WithUrl("Это кнопка с сайтом", "https://habr.com/"), InlineKeyboardButton.WithCallbackData("А это просто кнопка", "button1"), >, new InlineKeyboardButton[] < InlineKeyboardButton.WithCallbackData("Тут еще одна", "button2"), InlineKeyboardButton.WithCallbackData("И здесь", "button3"), >, >); await botClient.SendTextMessageAsync( chat.Id, "Это inline клавиатура!", replyMarkup: inlineKeyboard); // Все клавиатуры передаются в параметр replyMarkup return; > if (message.Text == "/reply") < // Тут все аналогично Inline клавиатуре, только меняются классы // НО! Тут потребуется дополнительно указать один параметр, чтобы // клавиатура выглядела нормально, а не как абы что var replyKeyboard = new ReplyKeyboardMarkup( new List() < new KeyboardButton[] < new KeyboardButton("Привет!"), new KeyboardButton("Пока!"), >, new KeyboardButton[] < new KeyboardButton("Позвони мне!") >, new KeyboardButton[] < new KeyboardButton("Напиши моему соседу!") >>) < // автоматическое изменение размера клавиатуры, если не стоит true, // тогда клавиатура растягивается чуть ли не до луны, // проверить можете сами ResizeKeyboard = true, >; await botClient.SendTextMessageAsync( chat.Id, "Это reply клавиатура!", replyMarkup: replyKeyboard); // опять передаем клавиатуру в параметр replyMarkup return; > if (message.Text == "Позвони мне!") < await botClient.SendTextMessageAsync( chat.Id, "Хорошо, присылай номер!", replyToMessageId: message.MessageId); return; >if (message.Text == "Напиши моему соседу!") < await botClient.SendTextMessageAsync( chat.Id, "А самому что, трудно что-ли ?", replyToMessageId: message.MessageId); return; >return; > // Добавил default , чтобы показать вам разницу типов Message default: < await botClient.SendTextMessageAsync( chat.Id, "Используй только текст!"); return; >> return; > case UpdateType.CallbackQuery: < // Переменная, которая будет содержать в себе всю информацию о кнопке, которую нажали var callbackQuery = update.CallbackQuery; // Аналогично и с Message мы можем получить информацию о чате, о пользователе и т.д. var user = callbackQuery.From; // Выводим на экран нажатие кнопки Console.WriteLine($"() нажал на кнопку: "); // Вот тут нужно уже быть немножко внимательным и не путаться! // Мы пишем не callbackQuery.Chat , а callbackQuery.Message.Chat , так как // кнопка привязана к сообщению, то мы берем информацию от сообщения. var chat = callbackQuery.Message.Chat; // Добавляем блок switch для проверки кнопок switch (callbackQuery.Data) < // Data - это придуманный нами id кнопки, мы его указывали в параметре // callbackData при создании кнопок. У меня это button1, button2 и button3 case "button1": < // В этом типе клавиатуры обязательно нужно использовать следующий метод await botClient.AnswerCallbackQueryAsync(callbackQuery.Id); // Для того, чтобы отправить телеграмму запрос, что мы нажали на кнопку await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > case "button2": < // А здесь мы добавляем наш сообственный текст, который заменит слово "загрузка", когда мы нажмем на кнопку await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "Тут может быть ваш текст!"); await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > case "button3": < // А тут мы добавили еще showAlert, чтобы отобразить пользователю полноценное окно await botClient.AnswerCallbackQueryAsync(callbackQuery.Id, "А это полноэкранный текст!", showAlert: true); await botClient.SendTextMessageAsync( chat.Id, $"Вы нажали на "); return; > > return; > > > catch (Exception ex) < Console.WriteLine(ex.ToString()); >>
Теперь запускаем проект и проверяем кнопки!
Заключение
К сожалению, на этом пока всё. Скорее всего будет вторая часть этой статьи или полноценный видеоурок на Youtube, но пока вот так.
Прошу оценить мою статью и оставить комментарий, так как это первая моя подобная работа, до этого мне не доводилось писать статьи или что-нибудь подобное.
Как написать Telegram-бота на Python: делаем ремайндер
Создаём простого бота-ремайндера в Telegram на языке Python, единственная задача которого — напоминать пользователю о важных делах.
В этой иструкции разберем процесс создания простого бота-ремайндера, единственная задача которого — напоминать пользователю о важных делах. Это базовая конструкция, которую можно усложнять и менять под свои потребности.
Инструкция подойдет для новичков, которые знают Python на базовом уровне, пробовали писать код и установили на компьютер редактор кода.
Первый этап: подготовка проекта и развертывание окружения
Найдем в поиске Telegram BotFather — официального бота мессенджера, который создает другие боты и управляет ими. В интерфейсе выбираем /start, затем — /newbot, и следом задаем имя и адрес. В этой иструкции это будут Elbrus Reminder и elbrus_reminder_bot соответственно.
После этого BotFather пришлет сообщение с токеном и ссылкой на бот:
Токен нужно хранить в безопасном месте — он дает контроль над ботом. и, как следствие, позволяет получить доступ к данным пользователей.
На время закроем Telegram и создадим на компьютере папку с именем проекта: например, reminder_bot. Откроем папку в среде разработки и создадим рабочий файл с понятным названием — bot.py.
Откроем терминал редактора кода и создадим для проекта новое окружение. В среде разработки с помощью команды python -m venv .venv создадим папку с окружением .venv .
Если окружение не активировалось автоматически, можно сделать это вручную, прописав путь к файлу активации в формате source .venv/bin/activate , где source — команда языка программирования Bash. Другой вариант — перезапустить среду разработки. Он работает для Visual Studio Code, но нужно предварительно принять предложение редактора привязать среду к папке проекта сразу после создания окружения.
Практика создания нового окружения под каждый проект позволяет повыстить безопасности и стабильность проекта — в окружении вы можете использовать только те библиотеки и их версии, которые требуются в проекте. Если в проекте появятся дополнительные функции, все изменения будут храниться в этом окружении. При этом оно будет изолировано от других окружений и проектов — это повысит безопасность проекта.
Второй этап: подключаем библиотеки
Проект создан и окружение готово: пора переходить к написанию кода. По правилам хорошего тона в первую очередь через import добавляем несколько предустановленных библиотек Python. При создании бота нам пригодятся logging и time , которые отвечают за определение времени и логирование сообщений.
import time import logging
Затем добавим асинхронную библиотеку aiogram, на основе которой будет работать бот. Она, например, определяет, какое сообщение пришло, как его нужно обработать и какие порты нужны. Сначала устанавливаем ее через терминал командой pip install aiogram , а в редакторе кода пишем следующее:
from aiogram import Bot, Dispatcher, executor, types
Из этой библиотеки нам нужны только отдельные модули и классы — все ее возможности для создания базовой версии бота не пригодятся. Поэтому вместо одиночного import использована команда from <> import <> .
Когда библиотеки импортированы, создадим переменные с токеном бота и сообщением, которое он будет отправлять пользователю. Вы можете заменить это сообщение на любое другое, которое вам необходимо. Это статические переменные, поэтому их имена написаны капслоком:
TOKEN = "здесьбудетваштокенот от BotFather" MSG = "Программировал ли ты сегодня, <>?"
Токены, ключи и прочие данные для настройки проекта лучше загружать более безопасным способом (например, создавать переменные окружения или файлы конфигурации). Но в данном случае сделаем все в одном файле для наглядности, а примеры более безопасной работы с такими переменными разберем в следующих постах.
Теперь создадим экземпляр класса Bot , передав ему в качестве аргумента наш токен, и экземпляр класса Dispatcher (dp), который в качестве аргумента получит bot . В результате получаем связку объекта класса bot с ключем, который привязан к боту, и диспетчера, который привязан к этому боту:
bot = Bot(token=TOKEN) dp = Dispatcher(bot=bot)
Следующим шагом добавим конструкцию под названием декоратор ( massage_handler ) — она помогает получить из диспетчера нужный функционал. В качестве аргумента прописываем команды, которые обрабатывает декоратор — в данном случае это команда /start , которая запускает бот.
@dp.message_handler(commands=['start'])
Под декоратором прописываем функцию, которая будет обрабатывать команду /start и определяет логику, в соответствии с которой будет работать бот. Поскольку мы работаем с асинхронной библиотекой, функция тоже должна быть асинхронной. Для этого перед указанием def добавим ключевое слово async :
async def start_handler(message: types.Message):
Функция приветствует пользователя и обрабатывает сообщение, которое он отправляет в ответ. Из сообщения можно получить информацию о пользователе, который его прислал, время отправки и его ID.
Создаем переменную и сохраняем в ней user id :
user_id = message.from_user.id
Затем получаем из сообщения короткое и полное имя пользователя:
user_name = message.from_user.first_name user_full_name = message.from_user.full_name
Для того, чтобы в логах отображалась информация о пользователе, передаем в виде текста ID и полное имя, а также используем возможности библиотеки time , чтобы определить время, когда писал пользователь:
logging.info(f' ')
Здесь отойдем в сторону и проверим корректность работы модуля time . Сделать это можно в терминале: для этого напишем import time , а затем — time.asctime
Вернемся к коду. Поскольку функция, которую мы используем, асинхронна, вместо обычного для функций return используем await :
await message.reply(f"Привет, !")
Ответить пользователю в боте можно несколькими способами — в данном случае используем reply. Выше в переменной MSG мы задали стандартное сообщение: «Программировал ли ты сегодня, <>?». Зададим частоту напоминаний: семь раз каждые семь суток (60х60х24 — количество секунд в одних сутках) с момента отправки команды /start боту от пользователя:
for i in range(7): await asyncio.sleep(60*60*24)
Затем настроим отправку сообщения с указанием имени пользователя в этом же цикле:
await bot.send_message(user_id, MSG.format(user_name))
Третий этап: финал
Переходим к финальной части: в конце скрипта напишем несколько строк. Они могут показаться странными для новичка, но это общепринятая практика, к которой многие программисты прибегают при разработке. В этой строке мы проверяем, равна ли переменная __name__ строке «__main__» . Это условие всегда будет True, если мы запускаем этот файл как python-скрипт через терминал:
if __name__ == '__main__':
Теперь делаем нашего бота доступным в сети:
executor.start_polling(dp)
Сохраняем файл. Запускаем бота в терминале, открытом в папке проекта, с помощью команды python bot.py .
Вернемся в BotFather и перейдем по ссылке, которую получили вместе с токеном. Нажимаем «Начать» — готово, бот, написанный меньше, чем в 30 строк, работает.
Так выглядит его код целиком:
import time import logging import asyncio from aiogram import Bot, Dispatcher, executor, types TOKEN = "здесьбудетваштокенот@BotFather" MSG = "Программировал ли ты сегодня, <>?" logging.basicConfig(level=logging.INFO) bot = Bot(token=TOKEN) dp = Dispatcher(bot=bot) @dp.message_handler(commands=["start"]) async def start_handler(message: types.Message): user_id = message.from_user.id user_name = message.from_user.first_name user_full_name = message.from_user.full_name logging.info(f' ') await message.reply(f"Привет, !") for i in range(7): await asyncio.sleep(60*60*24) await bot.send_message(user_id, MSG.format(user_name)) if __name__ == "__main__": executor.start_polling(dp)
В следующий раз подробно расскажем, как написать подобный бот на языке программирования JavaScript. Подписывайтесь, чтобы не пропустить инструкцию.
Как создать чат-бота в Telegram

Эта статья будет полезна тем, кто хочет создать свой бот в Телеграме самостоятельно без навыков разработки, знания языков программирования и сложных команд. Для запуска понадобится только продуманный сценарий работы и настройки, с которыми справится каждый.
Зачем нужен бот в Telegram
С его помощью можно автоматизировать рутинные бизнес-процессы. Можно даже заменить телеграм-каналом полноценный сайт. Чат-бот полезен, когда нужен удобный источник справочной информации или полуавтоматическая линия поддержки пользователей.
Простые боты в Телеграме работают с помощью команд: выдают в чат несколько готовых пунктов и продолжают диалог в зависимости от выбора пользователя. Но этим возможности не ограничиваются. Например, SaluteBot умеет анализировать текст в сообщении, что позволяет вести настоящую беседу.
Создайте своего чат-бота в Telegram
Простая настройка чат-бота в личном кабинете Цифровой витрины
Попробовать
Как создать telegram-бот
Чтобы сделать чат-бот без навыков программирования, воспользуйтесь визуальным конструктором в личном кабинете Цифровой витрины. Это бесплатно и несложно: в интерфейсе представлены блоки с сообщениями и кнопками, из которых вы составляете нужный сценарий.
Но, чтобы бот заработал в Телеграме, нужно настроить интеграцию нескольких систем: личный кабинет Цифровой витрины, Telegram и Jivo.
Поэтому пошаговая инструкция выглядит так:
- Создание бота в Telegram.
- Регистрация на платформе Jivo.
- Интеграция Jivo с Telegram.
- Создание бота в личном кабинете Цифровой витрины.
- Разработка сценария бота в конструкторе.
- Тестирование и отладка бота.
Разберём каждый этап подробно.
Создание бота в Телеграме
Создать самостоятельно чат-бот в Telegram можно бесплатно за несколько шагов:
- Перейдите в диалог с инструментом для разработки чатов — https://telegram.me/BotFather.
- Нажмите кнопку «Start» или введите в диалоге команду /start.
- Далее введите команду /newbot, чтобы сделать новый бот.
- Укажите название — как будет отображаться чат в списке контактов.
- Последнее — системное имя: это то, что будет ником после знака @.
Название может быть любым: нестрашно, если оно будет дублировать уже существующие. Но системное имя обязательно должно быть уникальным. Если имя уже занято, вы увидите подсказку: «Sorry, this username is already taken. Please try something different».
После успешного создания вы получите токен. Сохраните его, он понадобится для дальнейшей интеграции. Если вы закрыли окно и нужно снова найти токен, напишите в диалоге команду /token.

Регистрация в Jivo
Чтобы разработать чат в Телеграме на платформе личного кабинета Цифровой витрины, понадобится учётная запись в сервисе Jivo. При регистрации укажите email и задайте пароль. В поле «Адрес сайта» можно ввести любые данные.
Интеграция Jivo с Telegram
Авторизуйтесь на платформе Jivo, в боковом меню откройте раздел «Управление», блок «Каналы связи».

В списке сервисов найдите Telegram и нажмите кнопку «Добавить», далее — «Подключить Telegram». В открывшемся окне введите токен, который вы получили при создании бота.

Если токен указан верно, появится всплывающее сообщение о том, что бот успешно подключён. В меню «Уведомления» настройте, куда вы хотите получать все диалоги и на какой email отправить сообщение, если нет свободных операторов.
Создание бота в личном кабинете Цифровой витрины
В предыдущих шагах мы настроили площадку для диалогов и сервис Jivo для интеграции чата и конструктора. Далее предстоит разработка сценария, то есть набора команд и логики, по которой бот будет общаться с пользователями.
Сценарий мы будем создавать в личном кабинете Цифровой витрины: пройдите бесплатную регистрацию и войдите в аккаунт.
Далее следуйте инструкции:
- Нажмите «Создать проект» на главном экране.
- Если хотите заказать разработку бота, в списке инструментов выберите «SaluteBot Под ключ» и отправьте онлайн-заявку.
- Если будете создавать бот сами, то в списке инструментов выберите «SaluteBot Конструктор». Дальше говорим именно о самостоятельном конструировании SaluteBot.
- Выберите готовый шаблон или «Новый проект».
- Придумайте название и нажмите кнопку «Создать проект».
- Введите название бота.
- Выберите язык.
- Выберите тип сценария.
- Нажмите кнопку «Добавить аккаунт Jivo» и укажите данные для авторизации в сервисе Jivo.
- Перейдите в личный кабинет Jivo, чтобы связать его с личным кабинетом Цифровой витрины.
В меню выбора типа сценария доступно несколько вариантов:

- Готовый сценарий — включает базовую сборку экранов и команд с ответами на частые запросы. Можете использовать сценарий без изменений или подстроить его под логику вашего бизнеса: добавить и убрать любые блоки.
- Graph — это разработка сценария в конструкторе.
- Code — написание сценария с помощью кода, подходит для разработчиков. Важно помнить о том, что в Code можно собрать чат-бот только для сайта, не для мессенджеров, поэтому в данной статье мы этот тип не рассматриваем.
Разберём тип сценария Graph: с его помощью вы сможете сами составить схему работы чат-бота в конструкторе.
Разработка сценария
Перейти к редактированию сценария можно со страницы базовых настроек, которую мы рассмотрели на предыдущем этапе. В блоке «Сценарий бота» нажмите кнопку со всплывающей подсказкой «Перейти к проекту».


Прежде чем начать разработку карты, рекомендуем составить перечень запросов, на которые вы хотите отвечать с помощью бота. Запишите, какие сообщения должен отправлять бот на вопросы пользователей, какие варианты развития беседы возможны. Так будет проще построить диалоги и логику работы бота.
Сценарий состоит из блоков со следующими возможностями:
- Написание текстового ответа. Это самый простой блок, когда пользователю должно прийти в ответ сообщение с готовым текстом. Ответы бота можно разнообразить: если указать в блоке несколько фраз, то ответ будет выбираться случайным образом.
- Запрос данных. Пользователь должен отправить в сообщении данные определённого формата. Бот определяет, является ли значение телефоном, электронной почтой или числом.
- Проверка условия. В сценарий можно добавить разветвление, чтобы строить диалог исходя из ответа клиента.
- Перевод диалога на сотрудника. Когда бот собрал все нужные сведения или затрудняется с ответом, он может перевести диалог на оператора.
- Вызов произвольного кода. Данные из чата можно сохранять и обрабатывать в сторонних системах. Пример: клиент указывает в сообщении номер заказа, который отправляется в CRM-систему, а затем в телеграм-диалог возвращаются детали по этому заказу. Другой пример — обновление персональных данных заказчика: из чата они передаются в CRM-систему.
Если вы хотите быстро начать работу с ботом, на экране «Создание проекта SaluteBot Конструктор» выберите готовый отраслевой шаблон. Например, для e-commerce подходит шаблон «Приём и оформление онлайн-заказов».

Шаблон включает блоки про выбор товара, оформление покупки прямо в телеграм-канале, уточнение статуса заказа, перевод на оператора:

Сценарий можно адаптировать под свой бизнес: отредактировать сообщения и кнопки, добавить или удалить экраны и блоки.
Проверка работоспособности
После настройки сценария нажмите кнопки «Сохранить» и «Собрать» в нижнем правом углу.

Дождитесь сообщения об успешной сборке, а затем проверьте, заработал ли ваш телеграм-бот. Для этого перейдите в диалог, нажмите кнопку «Start» или введите команду /start. Напишите какое-нибудь сообщение и убедитесь, что бот отвечает по той схеме, которую вы составили. Если получаете некорректные ответы или забыли добавить какую-то пользовательскую ситуацию, скорректируйте сценарий в конструкторе.
Телеграм-боты для бизнеса
Посмотрим, зачем нужны боты интернет-магазинам, инфобизнесу, рекламным агентствам и представителям других сфер.
Инфобизнес
Чат-бот может взять на себя все важные этапы работы с пользователем, а именно:
- помощь в создании профиля;
- рекламу и описание продуктов;
- отправку бесплатных «прогревающих» материалов;
- сопровождение клиента до оформления заказа.
Event-индустрия
В telegram-канал можно перенести рутинные задачи:
- помощь в бронировании мест на мероприятие;
- предоставление информации об адресе, спикерах;
- показ актуального расписания мероприятия;
- сбор обратной связи.
Питоном по телеграму! Пишем пять простых Telegram-ботов на Python

В этой статье мы реализуем простой, но крайне полезный проект на Python — бота для Telegram. Боты — это небольшие скрипты, которые могут взаимодействовать с API, чтобы получать сообщения от пользователя и отправлять информацию в разные чаты и каналы.
Python для новичков
Если ты совсем не ориентируешься в Python, то отличным началом будет прочтение трех вводных статей, которые я публиковал в «Хакере» этим летом, либо посещение курса «Python для новичков», который я начну вести для читателей «Хакера» уже совсем скоро — 30 ноября.
- Python с абсолютного нуля. Учимся кодить без скучных книжек
- Python с абсолютного нуля. Учимся работать со строками, файлами и интернетом
- Python с абсолютного нуля. Работаем с ОС, изучаем регулярные выражения и функции
Чтобы создать бота, нам нужно дать ему название, адрес и получить токен — строку, которая будет однозначно идентифицировать нашего бота для серверов Telegram. Зайдем в Telegram под своим аккаунтом и откроем «отца всех ботов», BotFather.
Жмем кнопку «Запустить» (или отправим / start ), в ответ BotFather пришлет нам список доступных команд:
- / newbot — создать нового бота;
- / mybots — редактировать ваших ботов;
- / setname — сменить имя бота;
- / setdescription — изменить описание бота;
- / setabouttext — изменить информацию о боте;
- / setuserpic — изменить фото аватарки бота;
- / setcommands — изменить список команд бота;
- / deletebot — удалить бота.
Отправим бате‑боту команду / newbot , чтобы создать нового бота. В ответ он попросит ввести имя будущего бота, его можно писать на русском. После ввода имени нужно будет отправить адрес бота, причем он должен заканчиваться на слово bot. Например, xakepbot или xakep_bot . Если адрес будет уже кем‑то занят, BotFather начнет извиняться и просить придумать что‑нибудь другое.
Когда мы наконец найдем свободный и красивый адрес для нашего бота, в ответ получим сообщение, в котором после фразы Use this token to access the HTTP API будет написана строка из букв и цифр — это и есть необходимый нам токен. Сохраним ее где‑нибудь на своем компьютере, чтобы потом использовать в скрипте бота.
Для взаимодействия с Telegram API есть несколько готовых модулей. Самый простой из них — Telebot. Чтобы установить его, набери
pip install pytelegrambotapi
В Linux, возможно, понадобится написать pip3 вместо pip , чтобы указать, что мы хотим работать с третьей версией Python.
Эхо-бот
Для начала реализуем так называемого эхо‑бота. Он будет получать от пользователя текстовое сообщение и возвращать его.