Как написать телеграм бота c
Перейти к содержимому

Как написать телеграм бота c

  • автор:

Как создать telegram бот на C# быстро?

В этой статье мы рассмотрим заготовку для создания телеграм бота на 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 перестают работать после обновления библиотеки.

Нужно использовать другую схему. Давайте попробуем в этом разобраться.

Пошаговая инструкция

Итак ниже я набросал следующий список шагов, которые приведут вас к рабочему telegram боту.

1. Запускаем Visual Studio Community, создаем консольное приложение.

Если у Вас отсутствует Visual Studio Community, Вы можете установить ее используя статью или несколько устаревшее видео. При этом желательно выбирать установку Visual Studio Community 2022 как наиболее актуальную версию на текущий момент.

Создаем проектНазываем проект как нам удобноВыбираем платформу .NET 3.1Проект создан!

2. Добавляем в консольное приложение библиотеку Telegram.Bot, Telegram.Bot.Extentions.Polling и Netonsoft.Json

Открытие NuGetПоиск библиотекиУстановка пакета

По завершению у Вас должны быть установлены и отображены названия пакетов, которые мы установили.

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

3. Создаем telegram бот в BotFather. Копируем его api key для работы.

Находим в telegram BotFather, отправляем ему /newbot, название и логин бота

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 бот с нуля и протестировали его на работоспособность. Созданную заготовку можно будет использовать в дальнейшем для создания полномасштабных коммерческих проектов.

Как подключить платежную систему с Payments к Telegram

Рассказываем, как подключить платежную систему к Telegram-боту и разместить его на сервере.

Эта инструкция — часть курса «Как создавать Telegram-ботов».

Смотреть весь курс

Введение

Telegram-боты обладают широкой функциональностью и решают массу задач клиентов самых разных бизнесов. Рассказываем, как создать и разместить бота для приема платежей в Telegram на Python.

В Telegram есть встроенная система оплаты, поэтому сценариев, как использовать бота для приема платежей, достаточно много. Это может быть разовая оплата заказа или ежемесячная подписка.

Платежные системы Telegram

Сейчас мессенджер поддерживает оплату в более чем 200 странах через такие шлюзы, как: Stripe, YooMoney, Sberbank, LiqPay, PayMaster и другие.

Все начинается с установки библиотеки aiogram. Сейчас, пожалуй, это самая популярная библиотека для разработки ботов на Python.

python -m pip install aiogram

Переходим в Telegram и пишем тут BotFather’у команду /newbot. Вводим имя нового бота. Важно, чтобы оно заканчивалось словом Bot.

Получаем уникальный токен нового бота. Теперь напишем код простейшего эхо-бота, чтобы проверить его работу.

Связать бота с приложением

Создаем файл config.py и вписываем в него токен, который выдал BotFather. В основном файле main.py прописываем базовый код любого бота.

Обратите внимание на один важный момент: бот должен обрабатывать каждое сообщение с серверов Telegram. Для этого при запуске бота обязательно нужно поставить аргумент skip_updates в значение False. Это спасет от проблем при обработке платежей.

import config import logging from aiogram import Bot, Dispatcher, executor, types from aiogram.types.message import ContentType # log logging.basicConfig(level=logging.INFO) # init bot = Bot(token=config.TOKEN) dp = Dispatcher(bot) # echo bot @dp.message_handler() async def echo(message; types.Message): await message.answer (message.text) # run long-polling if __name__ == "main": executor.start_polling(dp, skip_updates=False)

Теперь можно запустить код и проверить, работает ли бот. Убедившись, что все хорошо, приступаем к подключению платежей.

Возвращаемся к BotFather’у, даем команду /mybots и выбираем из списка своего бота.

В открывшемся меню кликаем на кнопку «Payments». Из предоставленного списка выбираем нужный платежный шлюз. В качестве теста используем PayMaster. Чтобы подключить оплату в Telegram-бота, сначала нужно выполнить тест, поэтому выбираем «PayMaster Test».

Следуем простым инструкциям бота платежной системы и получаем тестовый токен PayMaster. Его сразу же можно сохранить в config.py.

TOKEN = "5432877141:AAHEwBEb2mwnZX56oaHM10o33ZBZwVkvv-s" PAYMENTS_TOKEN = "1744374395:TEST:f14d9f0d42528b780370"

Возвращаемся к коду бота. Для того, чтобы запросить оплату товаров/услуг, нужно сгенерировать invoice с деталями платежа. Отправить его клиенту и обработать результат.

Подключаем оплату

Указываем список доступных цен на продукты. В качестве цены нужно передать целочисленное значение в минимально возможных единицах валюты. Если речь идет о рублях, то стоимость нужно указывать в копейках. То есть место 500 рублей мы тут укажем 500 * 100 или же 50 000 копеек. В случае с долларами будет почти также, $1=100 центов. Если предполагается работа с другими валютами, можно использовать currencies.json от Telegram API.

Дальше в коде бота платежной системы мы создаем обработчик команды /buy. Команда будет генерировать и отправлять пользователю invoice платежа. В примере используется оплата месячной подписки.

import config import logging from aiogram import Bot, Dispatcher, executor, types from aiogram.types.message import ContentType # log logging.basicConfig(level=logging.INFO) # init bot = Bot(token=config.TOKEN) dp = Dispatcher(bot) # prices PRICE = types.LabeledPrice(label="Подписка на 1 месяц", amount=500*100) # в копейках (руб) # buy @dp.message_handler(commands=['buy']) async def buy(message: types.Message): if config.PAYMENTS_TOKEN.split(':')[1] == 'TEST': await bot.send_message(message.chat.id, "Тестовый платеж. ") await bot.send_invoice(message.chat.id, title="Подписка на бота", description="Активация подписки на бота на 1 месяц", provider_token=config.PAYMENTS_TOKEN, currency="rub", photo_url="https://www.aroged.com/wp-content/uploads/2022/06/Telegram-has-a-premium-subscription.jpg", photo_width=416, photo_height=234, photo_size=416, is_flexible=False, prices=[PRICE], start_parameter="one-month-subscription", payload="test-invoice-payload")

Сам процесс генерации invoice довольно простой. Не стоит беспокоиться большому количеству аргументов. Это названия продуктов или услуг, описания, цена, валюта и т.п.

Настройки платежей

Обратите внимание на аргумент is_flexible. Его нужно указывать в значение True только в том случае, если финальная стоимость зависит от выбранного способа доставки, если речь идет о продаже какого-то физического продукта.

О других параметрах метода send_invoice вы всегда можете прочитать в официальной документации Telegram API.

Теперь нужно создать еще два обработчика: Pre Checkout Query и Successful Payment.

Pre Checkout Query отвечает за обработку и утверждение платежа перед тем, как пользователь его совершит. Так можно проверить доступность товара на складе или уточнить стоимость.

Важно, что серверам Telegram ответ нужен в течение 10 секунд. Если его не будет, платеж не пройдет.

Successful Payment отвечает за обработку успешно проведенного платежа.

# pre checkout (must be answered in 10 seconds) @dp.pre_checkout_query_handler(lambda query: True) async def pre_checkout_query(pre_checkout_q: types.PreCheckoutQuery): await bot.answer_pre_checkout_query(pre_checkout_q.id, ok=True) # successful payment @dp.message_handler(content_types=ContentType.SUCCESSFUL_PAYMENT) async def successful_payment(message: types.Message): print("SUCCESSFUL PAYMENT:") payment_info = message.successful_payment.to_python() for k, v in payment_info.items(): print(f" = ") await bot.send_message(message.chat.id, f"Платеж на сумму  прошел успешно. ") # run long-polling if __name__ == "__main__": executor.start_polling(dp, skip_updates=False)

Тут можно выдать пользователю тот самый месяц подписки, за которую он заплатил или любую другую услугу.

Как бот работает на практике

Получив invoice на оплату от бота, нажимаем «Оплатить». Поскольку сначала мы проводим тестирование бота, воспользуемся специальной тестовой картой.

Вводим данные и оплачиваем подписку — все работает. При переходе на боевой проект важно не забыть выбрать правильный счет.

Теперь возвращаемся в BotFather, чтобы получить реальный токен от выбранного платежного шлюза. Если есть запрос на разные тарифы или способы оплаты, лучше запросить сразу 2-3 токена от разных платежных шлюзов. Далее нужно будет генерировать invoice с помощью токена выбранного провайдера.

Перенос бота на боевой сервер

Чтобы бот работал 24/7 вне зависимости от того, включен компьютер или нет, зальем его на реальный сервер.

Для этого воспользуемся облачным сервером линейки Shared Line от Selectel. Калькулятор панели управления позволяет выбрать гибкую конфигурацию сервера и сразу узнать, сколько будет стоить решение. Все продукты и услуги собраны у провайдера в одном месте, поэтому ими легко управлять. Арендовать сервер можно от 10 ₽/день, а в консоли есть возможность быстро масштабировать вычислительные ресурсы при необходимости.

Регистрируемся и входим в панель управления my.selectel.ru. Переходим в раздел «Облачная платформа» и выбираем «Серверы». Создаем сервер — после этого шага он загорится в списке как «ACTIVE».

Настраиваем конфигурацию. Для примера используем 1 ядро, 512 МБ DDR4 и 5 ГБ на диске.

Теперь переходим к выгрузке бота на боевой сервер. Сначала нужно подключиться к серверу через SSH. Для этого мы можем воспользоваться программой WinSCP для Windows. В Linux и MAC для этого есть свои встроенные инструменты.

Запускаем WinSCP. В качестве имени хоста указываем IP адрес нашего нового сервера. Логин и пароль можно взять во вкладке «Консоль» в панели управления.

Теперь перенесем сюда файлы нашего бота: config.py и main.py. Далее открываем отдельное соединение с сервером по SSH в консоли.

Для этого в WinSCP нажать кнопку и открыть PuTTY. Можно также воспользоваться командной строкой, принципиальной разницы нет.

Как написать Telegram бота на C#? [Часть 1]

Приветствую всех в своем уроке по написанию Telegram бота на языке программирования C#. В этом уроке я постараюсь максимально просто и понятно объяснить как написать своего бота с нуля. Конечно, здесь не будет какого-то трудного проекта, я дам вам необходимую базу, с помощью которой вы сможете писать своих ботов.

Начало

Для начала нам требуется зарегистрировать нашего бота. Делается это через «Ботобатю» (кликабельно) в самом Telegram.

Пример того, как все должно выглядеть.

  1. Переходим по ссылке и попадаем в диалог с BotFather и жмем «Запустить». BotFather — это официальный бот Telegram`а, через которого проходит регистрация и настройка ваших ботов.
  2. От вашего лица должна отправиться команда /start , на которую бот ответит большим списком команд с описаниями. Подробно изучить каждую Вы можете сами, а мы двигаемся к шагу 3.
  3. Используем команду /newbot. На этом шаге нужно отправить боту имя Вашего будущего бота. Например, пусть это будет Александр Николаевич.
  4. Далее нас попросят ввести username бота, учтите, что он должен быть написан строго на латинице, а также содержать bot или _bot в конце.Username — это уникальный идентификатор аккаунта (вашего или бота), по которому люди могут найти аккаунт в поиске. В случае, если username уже занят, вас попросят использовать другой.
  5. После всех выполнений действий, Ботобатя присылает нам небольшое сообщение, в котором говорится об успешном создании бота. Из этого сообщения нам нужен 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 и проверяем 🙂

It works!

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

И тут тоже все прекрасно, теперь давайте дополним наш метод 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

Чат-бот — это автоматизированный многофункциональный помощник, который может показывать информацию подписчикам и собирать информацию по запросу согласно заранее подготовленным сценариям.

Следуйте пошаговой инструкции, чтобы создать своего первого чат-бота для Telegram мессенджера или подключить существующий к сервису SendPulse для дальнейшей настройки.

Содержание

Если у вас уже создан бот, переходите сразу к третьему пункту.

Зачем нужен чат-бот Telegram

Чаще всего чат-боты применяются для автоматизации обслуживания клиентов. Боты могут быстро и эффективно отвечать на вопросы и запросы клиентов 24/7, автоматически собирать обратную связь от клиентов после покупки или обслуживания. Для этого вам необходимо создать сценарий бота с необходимыми командами, которые будет выбирать подписчик для решения своих вопросов.

Боты могут отправлять мгновенные уведомления через рассылки о новых акциях, событиях или важных обновлениях бизнеса, что помогает удерживать клиентов в курсе и повышать узнаваемость бренда.

Как создать свой бот в Telegram

Откройте мессенджер Telegram, войдите в вашу учетную запись или создайте новую.

Введите в поле поиска @BotFather и выберите бот.

У официального бота Telegram будет стоять синий подтверждающий знак возле имени в виде галочки.

Нажмите Запустить для активации бота BotFather.

В ответ вы получите список команд по управлению ботом.

Выберите или напечатайте и отправьте команду /newbot .

Дайте имя боту — клиенты увидят это имя при общении с ботом. И никнейм бота — по нему можно будет найти бота в Telegram. Никнейм должен быть уникальным, не повторять существующие в базе и заканчиваться на слово bot.

После того как вы выберите подходящее имя бот будет создан. Вы получите сообщение со ссылкой на бота t.me/ , рекомендации по настройке аватарки, описание бота и список команд для его настройки.

Для подключения бота в SendPulse вам понадобится токен. Скопируйте значение токена и перейдите к последнему пункту.

Где найти ключ для уже существующего бота

Перейдите к боту @BotFather и введите команду /token .

Вы увидите кнопки с созданными ботами.

Выберите бот, который нужно подключить.

Скопируйте значение токена.

Как подключить бот в Sendpulse

Перейдите в раздел Чат-боты в вашем аккаунте SendPulse. Если у вас нет подключенных каналов, нажмите на кнопку Подключить каналы.

Если вы уже подключали ботов, перейдите в раздел Управление ботами и нажмите Добавить бот. Также вы можете выбрать Подключить напротив нужного канала.

В секции Telegram введите ключ доступа — токен полученный в созданном боте. Нажмите Подключить.

Нажмите на кнопку Подписаться на бота. Таким образом вы сможете тестировать каждое сообщение и цепочку и отправлять их себе перед реализацией.

Вы будете перенаправлены в приложение Telegram, нажмите на кнопку Запустить и вы подпишетесь на свой бот.

После успешного подключения чат-бота вы получите приветственную цепочку, бот появится у вас в списке ботов и вы можете начинать создавать приветственные и триггерные цепочки, массовые рассылки.

Как создать сценарий чат-бота

По умолчанию доступны цепочки Приветственная серия, Стандартный ответ и После отписки. Также вы можете создавать свои триггеры и сценарии.

Вы можете создавать сценарии самостоятельно, редактировать на основе готовых шаблонов под разные запросы в SendPulse или генерировать с помощью искусственного интеллекта от OpenAI.

Самостоятельно

Сначала определите, для чего вы создаете бот. Например, это может быть автоматизация клиентского обслуживания, сбор контактных данных, предоставление информации о продуктах или услугах и так далее.

Определите основные диалоги, которые ваш бот должен поддерживать. Напишите их на бумаге или создайте диаграммы, чтобы визуализировать последовательность.

Используйте разные блоки в одном сценарии: текст, картинки, фильтр, поле ввода, чтобы сделать сценарий полезным и динамичным для подписчика.

По шаблону

Также вы можете использовать готовые решения или вдохновиться ими. В разделе Шаблоны есть шаблоны цепочек по разным темам. Вы можете взять один из них за основу, а потом работать с ним в конструкторе, добавляя необходимый контент в блоки.

С помощью AI

Также вы можете задействовать искусственный интеллект для создания сценариев цепочек под ваши запросы. Это позволит существенно сократить время на генерацию творческих идей и продумывание логики.

Откройте конструктор и нажмите кнопку Создать цепочку с помощью ИИ (Create a flow with AI). Продумайте все детали, которые вы хотели бы включить в бот, и впишите требования в подсказку для генерации цепочки.

Искусственный интеллект можно подключить и для того, чтобы нейронная сеть генерировала ответы пользователям в режиме реального времени, не по сценариям. Подключите ChatGPT и предоставьте основные данные о вашей компании, на которые вы хотите, чтобы бот отвечал.

После того как вы создали бот в Telegram и настроили сценарии ответов, вы можете добавить ссылку на бот на ваш сайт или подключить его к умным попапам. Если у вас есть список ID подписчиков из 8-10 чисел, можете его импортировать.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *