Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/103: Рейтинг темы: голосов - 103, средняя оценка - 4.78
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
1

Telegram bot. Как вычислить на какое именно сообщение получен ответ?

22.06.2017, 11:03. Показов 19360. Ответов 17

Author24 — интернет-сервис помощи студентам
Доброго времени суток, коллеги!
Пишу своего первого бота на основе WebApi, использую Webhook, столкнулся с таким вопросом: Как вычислить на какое именно сообщение получен ответ?

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 public class MessageController: ApiController
    {
        public async Task<IHttpActionResult> Update([FromBody] Update update)
        {
            var commands = Bot.Commands;
            var message = update.Message;
            var client = await Bot.Get();
 
            foreach (var command in commands)
            {
                command.Execute(message, client);
                //break;
            }
 
            return this.Ok(update);
        }
    }
Сейчас выполняются все команды, прикрученные к боту. Например, если первое сообщение, то срабатывает только команда приветствия
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 public class HelloCommand: Command
    {
        public override string Name => "hello";
        public override async void Execute(Message message, TelegramBotClient client)
        {
            if (message.Text != "/start")
                return;
 
            await client.SendTextMessageAsync(
                message.Chat.Id,
                message.From.FirstName + ", приветствуем Вас в центре поддержки!");
 
            await client.SendTextMessageAsync(
               message.Chat.Id,
               "Задайте свой вопрос");
            //replyToMessageId: messageId);
        }
    }
Но вставлять везде условия на выполнение команды не есть комильфо, далее в следующих командах просто непонятно будет на какое условие проверять, подскажите пожалуйста

Добавлено через 3 минуты
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public class ProblemCommand: Command
    {
        public override string Name => "problem";
        public override async void Execute(Message message, TelegramBotClient client)
        {
                if (message.Text == "/start" 
                    || !IsProblemMessage(message.Text))
                    return;
          
                await client.SendTextMessageAsync(message.From.Id, GetMenu());
            }
        }
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2017, 11:03
Ответы с готовыми решениями:

Telegram Bot Как получить ответ от ввода с клавиатуры в телеграмме
Здравствуйте. Пишу телеграм бота, столкнулся со слледующей проблемой: Не могу получать и...

Telegram Bot(Telepot). Как сохранить введенное пользователем сообщение
Здравствуйте. Допустим, при запуске бот попросил пользователя ввести номер телефона (адрес Email,...

Telegram bot | Как создать inline кнопки?
При создании бота столкнулся с одной, не очень приятной, проблемой. Связанна она с созданием inline...

Как создать реферальную систему в telegram bot?
Как создать реферальную систему в телеграмм? Ссылку я создал, но мне нужно подсчитать сколько...

17
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
22.06.2017, 11:21 2
Alex_trader, Ничего не понятно. Какие условия и где? И почему команды сделаны шиворот-на-выворот?
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
22.06.2017, 13:29  [ТС] 3
Цитата Сообщение от Alex_trader Посмотреть сообщение
C#
1
2
3
                if (message.Text == "/start" 
                    || !IsProblemMessage(message.Text))
                    return;
Чтобы в контроллере не нужная команда не выполнилась такое условие делаю в командах, таким образом при каждом новом сообщении процесс заходит во все команды, где условие не выполняется выходит по return

Добавлено через 1 минуту
Цитата Сообщение от Usaga Посмотреть сообщение
И почему команды сделаны шиворот-на-выворот?
По подробнее опишите, что не так?
0
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
22.06.2017, 13:30 4
Цитата Сообщение от Alex_trader Посмотреть сообщение
Чтобы в контроллере не нужная команда не выполнилась такое условие делаю в командах, таким образом при каждом новом сообщении процесс заходит во все команды, где условие не выполняется выходит по return
Это просто трындец.

Может стоит парсить входящие данные, чтобы понять что нужно сделать и потом вызвать нужный метод класса бота (дать ему команду)?

Добавлено через 1 минуту
Или завернуть команду в специальный класс и передать боту, который её выполнит?

То, что вы продемонстрировали в коде никакая не "команда".
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
22.06.2017, 15:06  [ТС] 5
Цитата Сообщение от Usaga Посмотреть сообщение
Может стоит парсить входящие данные, чтобы понять что нужно сделать и потом вызвать нужный метод класса бота (дать ему команду)?
Честно не совсем Вас понял, и что не так в командах, можно подробнее?

Добавлено через 30 секунд
Цитата Сообщение от Usaga Посмотреть сообщение
никакая не "команда".
Какая же она должна быть?

Добавлено через 1 минуту
Цитата Сообщение от Alex_trader Посмотреть сообщение
Пишу своего первого бота
Гуглил инет, ютуб, нашёл только такую структуру кода

Добавлено через 1 минуту
Правда непонятно как строить сценарий поведения/ответов бота

Добавлено через 35 минут
Цитата Сообщение от Usaga Посмотреть сообщение
То, что вы продемонстрировали в коде никакая не "команда".
Много критики без конкретных предложений
0
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
22.06.2017, 15:50 6
Alex_trader, командовать ботом можно через его открытые методы или накидывая ему в некую коллекцию объекты класса Command (не лучше применение командам, в данном случае).

А у вас что? Вы получаете некое сообщение, потом достаёте из бота команды и исполняете(!) в контроллере все по порядку в надежде, что какая-нибудь да разберёт сообщение и выполнится. Это вообще не "команда".

Команда - паттерн, где вы формируете указ системе что-то сделать, в виде некоего класса-команды (отсюда и название) и передаёте её на исполнение некоему сервису (в данном случае - боту). Сама команда может быть как простым набором параметров для метода, который поймёт, что с этим делать, так и содержать в себе всю логику исполнения команды, тогда сервису остаётся её просто выполнить (Execute()), даже не зная что в ней.

Ваше творчество ничего из этого не показывает.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
22.06.2017, 16:06  [ТС] 7
Usaga, можно кусок кода, ссылку чтобы понять к чему стремиться...
0
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
22.06.2017, 16:21 8
Alex_trader, я не думаю, что в данном случае вам нужен паттерн команда. Вполне возможно, будет достаточно набора методов у бота и всё.

По данному паттерну полно примеров в сети.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
26.06.2017, 10:14  [ТС] 9
Usaga, Изучил паттерн на метаните
Участники

Command: интерфейс, представляющий команду. Обычно определяет метод Execute() для выполнения действия, а также нередко включает метод Undo(), реализация которого должна заключаться в отмене действия команды

ConcreteCommand: конкретная реализация команды, реализует метод Execute(), в котором вызывается определенный метод, определенный в классе Receiver

Receiver: получатель команды. Определяет действия, которые должны выполняться в результате запроса.

Invoker: инициатор команды - вызывает команду для выполнения определенного запроса

Client: клиент - создает команду и устанавливает ее получателя с помощью метода SetCommand()
Кто в моём случае будет являться инициатором и клиентом? Получатель команды видимо сам бот
0
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
26.06.2017, 10:48 10
Alex_trader, инициатором выступает ваш контроллер, получателем - бот. Команды можно добавлять боту в очередь (типа AddCommand(new SomeCommand()), а тот их будет исполнять в отдельном потоке. Или можно асинхронно, если требуется результат, но тогда необходимость данного паттерна встанет под вопрос.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
26.06.2017, 11:28  [ТС] 11
Usaga, всё таки хотелось бы получить ответ на вопрос, ради которого завелась тема:
Как вычислить на какое именно сообщение получен ответ?

Добавлено через 1 минуту
Имеется ввиду, как вести боту переписку с пользователем, как однозначно определить что пользователь ответил на определённый вопрос бота

Добавлено через 1 минуту
Как понимать, на какой вопрос пользователь отвечает.

Добавлено через 4 минуты
Как скармливать боту определённые команды понятно (пользователь отправил команду - ищу на сервере такую команду и выполняю), но если речь идёт о переписке то как быть?

Добавлено через 4 минуты
Смысл моего бота - Служба поддержки, задав уточняющие вопросы бот идентифицирует тему по которой обратился пользователь и далее присваивает номер заявке и передаёт её на исполнение в нужный отдел

Добавлено через 32 секунды
Всю голову сломал, инет перекопал...
0
Почтальон
26.06.2017, 11:30
  #12

Не по теме:

Интересно, как будет работать бот, когда телеграмм заблокируют ? через прокси ?

0
Эксперт .NET
12505 / 8692 / 1310
Регистрация: 21.01.2016
Сообщений: 32,661
26.06.2017, 12:13 13
Цитата Сообщение от Alex_trader Посмотреть сообщение
Имеется ввиду, как вести боту переписку с пользователем, как однозначно определить что пользователь ответил на определённый вопрос бота
Никак.

Добавлено через 1 минуту
Хотя нет. Можно задавать только по одному вопросу, а всё, что эта двуногая фиговина отвечает считать за ответ.

Добавлено через 1 минуту
Или плюнуть пользователю в лицо: к каждому вопросу, задаваемому ботом, указываеть его GUID. Отвечать пользователь должен в формате "Ответ на [GUID]=ответ". Так пойдёт? Можно будет однозначно определить на что ответил человек
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.06.2017, 12:22 14
Alex_trader, кнопки? ограничить выбор, зато можно слать id вырианта в калбеке. Я не помню как точно выглядит JSON ответа, но там же есть кто прислал...

Сделал себе пару запросов:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    "update_id": 646282243,
    "message": {
        "message_id": 569,
        "from": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "language_code": "ru"
        },
        "chat": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "type": "private"
        },
        "date": 1496580650,
        "text": "10"
    }
}
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
    "update_id": 646282244,
    "callback_query": {
        "id": "1176140420167207797",
        "from": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "language_code": "ru"
        },
        "message": {
            "message_id": 571,
            "from": {
                "id": 344652520,
                "first_name": "\u0414\u043d\u0438\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044fbot",
                "username": "DRHB17_BOT"
            },
            "chat": {
                "id": 273841531,
                "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
                "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
                "username": "EveKS",
                "type": "private"
            },
            "date": 1496580654,
            "text": "\u0416\u0435\u043b\u0430\u0435\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0441\u0441\u044b\u043b\u043a\u0443 \u0434\u043d\u0435\u0439 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u0439?"
        },
        "chat_instance": "-3277714528194463542",
        "data": "/Yes"
    }
}
Добавлено через 1 минуту
еще 2:
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
{
    "update_id": 646282245,
    "callback_query": {
        "id": "1176140419964572687",
        "from": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "language_code": "ru"
        },
        "message": {
            "message_id": 573,
            "from": {
                "id": 344652520,
                "first_name": "\u0414\u043d\u0438\u0420\u043e\u0436\u0434\u0435\u043d\u0438\u044fbot",
                "username": "DRHB17_BOT"
            },
            "chat": {
                "id": 273841531,
                "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
                "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
                "username": "EveKS",
                "type": "private"
            },
            "date": 1496580660,
            "text": "\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0434\u043d\u0443 \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0433\u0440\u0443\u043f\u043f, \u043d\u0430 \u0434\u043d\u0438 \u0440\u043e\u0436\u0434\u0435\u043d\u0438\u044f \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u0434\u043f\u0438\u0441\u0430\u0442\u044c\u0441\u044f."
        },
        "chat_instance": "-3277714528194463542",
        "data": "/Deputies"
    }
}
JSON
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
{
    "update_id": 646282246,
    "message": {
        "message_id": 575,
        "from": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "language_code": "ru"
        },
        "chat": {
            "id": 273841531,
            "first_name": "\u0415\u0432\u0433\u0435\u043d\u0438\u0439",
            "last_name": "\u041a\u043b\u0438\u043c\u043e\u0432",
            "username": "EveKS",
            "type": "private"
        },
        "date": 1496585446,
        "text": "4"
    }
}
Добавлено через 4 минуты
Просто брать с мессадж, т.к. известен чат id - дергать все сообщения пользователя до последнего сообщения бота.

Добавлено через 3 минуты
точнее message from(это User) id.
0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
26.06.2017, 12:34  [ТС] 15
EveKS, возможно можно прикрутить айдишник апдейта плюс айдишник пользователя
C#
1
var updateId = update.Id;
Но тогда не ясно как проверять эти значения, завести статические переменные, например lastUpdateId, lastUserId?

Добавлено через 2 минуты
Или все поступившие запросы складывать в public static Dictionary<UserId, UpdateId>?
0
601 / 485 / 185
Регистрация: 19.04.2016
Сообщений: 1,885
26.06.2017, 13:24 16
Alex_trader, там же у телеграм есть своя модель, она не подайдет? да и связь один ко многим тут нужна, если коллекция, как вариант ILookup, но лучше всё же через классы.

Не по теме:

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

0
3 / 3 / 5
Регистрация: 11.11.2015
Сообщений: 413
26.06.2017, 14:44  [ТС] 17
Нашел такую штуку на stackoverflow
0
0 / 0 / 0
Регистрация: 23.01.2018
Сообщений: 1
23.01.2018, 19:30 18
Alex_trader, можно url на stackoverflow с решением этой проблемы?
0
23.01.2018, 19:30
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2018, 19:30
Помогаю со студенческими работами здесь

Как отправлять альбом фотографий через Telegram.Bot
Столкнулся с такой же проблемой...

Как сделать Telegram bot-a на Webhook .NET Core
Здравствуйте. Помогите нубу, уже замучался гуглить. Написал бота на .Net Core Писал в Visual Studio...

Сборник задач Демидовича 856 - как получен такой ответ?
Задание: найти производную y=\sqrt{(1-x)^m(1+x)^n} Мне удалось получить такой ответ (к слову...

Как посмотреть текст сообщения бота (Telegram bot, Python)?
Использую библиотеку Telebot. Ситуация: пользователь написал боту сообщения. Мне нужно узнать...

Как реализовать ввод пользователя в Telegram Bot`e в разветвлении Switch?
Здравствуйте! Пишу телеграм бота. Столкнулся со следующей проблемой: Команды пользователя...

ASP .NET Core Telegram Bot, как запустить бота локально?
Всем привет, пробую создать Телеграм бота на ASP .NET Core, создал Web Api приложение, у меня есть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru