Как обработать сообщение telegram bot c
Перейти к содержимому

Как обработать сообщение telegram bot c

  • автор:

Как обрабатывать ботом сообщения -Telegram Bot Api C#

Как обрабатывать ботом сообщения, которые будут приходить, только тогдда, когда я запущу программу? Сейчас у меня так как на скрине, и когда я запускаю, то он обрабатывает все новые, которые были до того, как запустился.

Отслеживать

задан 29 мая 2017 в 15:24

65 3 3 серебряных знака 7 7 бронзовых знаков

Скрин не прикрепился.

29 мая 2017 в 20:28

Пока сообщение не обработано оно не помечается обработанным, соответственно бот будет их получать

30 мая 2017 в 5:06

0

Сортировка: Сброс на вариант по умолчанию

Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.

  • c#
  • telegram-bot
  • telegram

Как сохранить и обработать ответ пользователя в telegram боте. (C#)

Часто на просторах интернета вижу, как люди сталкиваются с проблемой сохранения последующего ответа пользователя на сообщения бота, когда пишут бота на c#. Например, в библиотеке telebot для python есть отдельный метод register_next_step_handler, который регистрирует следующее сообщение пользователя. Сегодня я подробно разберу реализацию этого на c#.

P.S. Кто и так знает, как работать с базами данных и создавать элементарных ботов, сразу переходите к основной части.

Создание базы данных и элементарного бота

Заходим в Visual Studio, создаём консольное приложение и подключаем нужные пакеты через nuget:

Прописываем нужные директивы в код.

using System.Data; using System.Data.SqlClient; using Telegram.Bot;

Далее в обозревателе решений создаём базу данных.

Далее открываем обозреватель серверов (Вид => Обозреватель серверов) , открываем нашу базу данных. В ней нам нужно лишь создать таблицу.

Создаём 2 колонки с типом данных int, называем таблицу и нажимаем «Обновить». Когда таблица создана перейдём к написанию элементарного бота.

В классе Program создаём 2 экземпляра класса:

static TelegramBotClient client = new TelegramBotClient(token); static SqlConnection sql = new SqlConnection(connectionString);

connectionString находится в свойстве базы данных. (пкм по database1.mdf в обозревателе серверов => свойства => строка подключения/connection string)

в main методе пропишем обработчики на сообщения и запустим приём обновлений (по возможности использовать webhook). В обработчике сообщений создадим экземпляр этого же сообщения.

static void Main(string[] args) < client.OnMessage += BotOnMessage; //Создаём обработчик событий на сообщение client.StartReceiving(); //Начинаем получать апдейты с сервера телеграмма Console.ReadKey(); client.StopReceiving(); >async static void BotOnMessage(object sender, MessageEventArgs e) < Message msg = e.Message; //создаём переменную, которая содержит все свойства сообщения >

Шаблон бота готов, можем перейти к основной теме статьи.

Основная часть. Обработка сообщений.

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

Начнём с того, что при вводе /start мы запишем в таблицу идентификатор пользователя и начальное значение второй колонки, пускай будет 0.

if (msg.Text == /start) < if(sql.State == ConnectionState.Closed) // Проверяем, закрыто ли sql подключение < sql.Open(); //Открываем sql подключение SqlCommand command = new SqlCommand($"insert into %Название_таблицы% (%Колонка_1%, %Колонка_2%) values ('', '0')", sql); //Прописываем добавление данных в таблицу await command.ExecuteNonQueryAsync(); //Выполняем команду sql.Close(); > >

Потом обработчики на кнопки клавиатуры.

if (msg.Text == "Сумма двух чисел") < if(sql.State == ConnectionState.Closed) //Проверяем состояние подключения < //Отправляем сообщение, что-бы ввели 2 числа sql.Open(); SqlCommand command = new SqlCommand($"Update %Название_таблицы% Set %Колонка_2% = '1' where %Колонка_1% = ''", sql); //Так, тут мы установили второй колонке значение 1 (это может быть любое число) await command.ExecuteNonQueryAsync(); sql.Close(); > > if(msg.Text == "Произведение двух чисел") < if(sql.State == ConnectionState.Closed) < sql.Open(); SqlCommand command = new SqlCommand($"Update %Название_таблицы% Set %Колонка_2% = '2' where %Колонка_1% = ''", sql); await command.ExecuteNonQueryAsync(); //Здесь мы уже присваиваем значение '2' sql.Close(); > > 

Далее, при поступлении каждого сообщения, нам нужно проверять значение второй колонки у написавшего пользователя. Тогда мы сможем отловить момент, когда у него во второй колонке 1 или 2 и обработать это сообщение. После обработки нужно обратно установить ‘0’ во вторую колонку, что-бы его сообщения дальше не триггерили. В обработчике сообщений напишем вот такой код (этот блок кода должен идти после if(msg.Text == «/start») а также перед остальным кодом).

if (sql.State == ConnectionState.Closed) < sql.Open(); SqlCommand command = new SqlCommand($"Select %Колонка_2% From %Таблица% Where %Колонка_1% = ''", sql); SqlDataReader reader = command.ExecuteReader(); await reader.ReadAsync(); count = Convert.ToInt64(reader[0]); //count - обычная int переменная. Мы считали данные с таблицы и присвоили значение второй колонки этой переменной. reader.Close(); sql.Close(); >

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

if(count == 1) < //Здесь вы прописываете, что хотите. Напрмер, отправляете сумму чисел await client.SendTextMessageAsync(msg.Chat.Id, $"Сумма чисел - "); sql.Open(); SqlCommand command = new SqlCommand($"Update %Таблица% Set %Колонка_2% = '0' where %Колонка_1% = ''", sql); command.ExecuteNonQuery(); //Анулируем вторую колонку. >

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

Saved searches

Use saved searches to filter your results more quickly

Cancel Create saved search

You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session. You switched accounts on another tab or window. Reload to refresh your session.

Создание бота-магазина в Telegram

License

asvirin/shop_telegram_bot

This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Switch branches/tags
Branches Tags
Could not load branches
Nothing to show
Could not load tags
Nothing to show

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?

Cancel Create

  • Local
  • Codespaces

HTTPS GitHub CLI
Use Git or checkout with SVN using the web URL.
Work fast with our official CLI. Learn more about the CLI.

Sign In Required

Please sign in to use Codespaces.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching GitHub Desktop

If nothing happens, download GitHub Desktop and try again.

Launching Xcode

If nothing happens, download Xcode and try again.

Launching Visual Studio Code

Your codespace will open once ready.

There was a problem preparing your codespace, please try again.

Latest commit

Git stats

Files

Failed to load latest commit information.

Latest commit message
Commit time

README.md

Прототипы магазина для Telegram с CMS Moltin и базой данных Redis

Автор проекта: Алексей Свирин, телеграм — @svirin

Цель проекта: создание интернет-магазина в телеграме

Этап 1. Получить все авторизационные ключи

Этап 1.1 Для запуска бота в Телеграме необходимо:

  1. Создать бота для пользователй в telegram через Отца ботов и взять токен для авторизации.
  2. Создать бота для сервисных сообщений в telegram через Отца ботов и взять токен для авторизации.
  3. Узнать свой ID через специального бота.

Этап 1.2 Получить ключи авторизации CMS Moltin:

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

Этап 2. Установить переменные окружения

  1. REDIS_HOST — Host базы данных Redis;
  2. REDIS_PORT — Port базы данных Redis;
  3. REDIS_PASSWORD — Пароль базы данных Redis;
  4. REDIS_DB — Номер базы данных Redis, по умолчанию ставить 0;
  5. TELEGRAM_TOKEN — токен для авторизации бота в Телеграме;
  6. TELEGRAM_BOT_INFORMATION_TOKEN — токен для авторизации бота для информационных сообщений;
  7. CHAT_ID_TELEGRAM_INFORMATION — кому бот для информационных сообщений будет писать;
  8. CLIENT_ID_MOLTIN — ваш id в Moltin;
  9. CLIENT_SECRET_MOLTIN — секретный ключ к вашему аккаунту в Moltin.

Этап 3. Запустить бота

Пример запуска в консоли

python3 tg-bot.py

Требования к окружению

Все требуемые модули указаны в файле requirements.txt
Для установки запустите команду:

python3 pip install -r requirements.txt

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

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

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