Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 01.11.2022
Сообщений: 28

Телеграм бот python-telegram-bot. Не переходит на след функцию

03.03.2023, 16:11. Показов 1449. Ответов 1

Студворк — интернет-сервис помощи студентам
Добрый день.
Делаю бота для конторы по прокату машин с помощью python-telegram-bot.

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

Если написать print(query) в choose_time, то он просто обновляется и конкатенирует все выбранное время вот так:
{'callback_data': 'BMW X6_8_8_1'}

Должно переходить в следующую функцию после одного нажатия на время.

Продолбался целый день.



Весь код не буду писать, смысла нет, вот эти функции:

Python
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
def choose_manual(update, context):
    """Обработчик выбора автомобиля c механической КПП."""
    query = update.callback_query
    query.answer()
    query.edit_message_text(
        "Выберите желаемую модель автомобиля c механической КПП:",
        reply_markup=InlineKeyboardMarkup([
            [InlineKeyboardButton(
                "RENAULT LOGAN", callback_data="RENAULT LOGAN")],
            [InlineKeyboardButton(
                "HYUNDAI SOLARIS", callback_data="HYUNDAI SOLARIS")],
        ])
    )
    return CHOOSE_TIME
 
 
def choose_time(update, context):
    query = update.callback_query
    query.answer()
    time_options = [[InlineKeyboardButton(f"{hour} час.", callback_data=f"{query.data}_{hour}")] for hour in range(1, 11)]
    reply_markup = InlineKeyboardMarkup(time_options)
    context.user_data['time'] = query.data.split('_')[-1]  # Сохраняем выбранное время в user_data
    context.user_data['car_model'] = query.data.split('_')[0]  # Получаем модель автомобиля
 
    query.edit_message_text(
        text='Выберите время аренды автомобиля',
        reply_markup=reply_markup
    )
 
    return CONFIRMATION
 
 
def confirmation(update, context):
    """Обработчик подтверждения заказа."""
    # print('confimat', query)
    query = update.callback_query
    query.answer()
    car = context.user_data.get("car")
    time = int(context.user_data.get("time", 1)) # Получаем время из контекста пользователя
    cost = time * 100  # Расчет стоимости аренды
    query.edit_message_text(
        f"Вы выбрали автомобиль {car}. "
        f"Время аренды: {time} часов. "
        f"Стоимость аренды: {cost} рублей. "
        "Нажмите /start, чтобы начать заново."
    )
хендлеры так:
Python
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
33
34
conv_handler = ConversationHandler(
        entry_points=[CommandHandler("start", start),
                      CallbackQueryHandler(order_call, pattern='^' + str(ORDER_CALL) + '$')],
        states={
            CONDITIONS: [CallbackQueryHandler(get_conditions, pattern=f"^{CONDITIONS}$")],
            CHOOSE_CAR: [CallbackQueryHandler(choose_car)],
            CHOOSE_AUTOMATIC: [CallbackQueryHandler(choose_automatic)],
            CHOOSE_MANUAL: [CallbackQueryHandler(choose_manual)],
            CHOOSE_TIME: [CallbackQueryHandler(choose_time)],
            CONFIRMATION: [CallbackQueryHandler(confirmation)],
            ORDER_CALL: [MessageHandler(Filters.text & ~Filters.command, order_call_phone)],
            BACK_TO_MENU: [CallbackQueryHandler(back_to_menu)],
        },
        fallbacks=[CommandHandler("cancel", cancel)],
    )
 
    dispatcher = updater.dispatcher
    dispatcher.add_handler(
        CallbackQueryHandler(get_conditions, pattern=f"^{CONDITIONS}$"))
    dispatcher.add_handler(
        CallbackQueryHandler(choose_car, pattern=f"^{CHOOSE_CAR}$"))
    dispatcher.add_handler(
        CallbackQueryHandler(choose_automatic, pattern=f"^{CHOOSE_AUTOMATIC}$"))
    dispatcher.add_handler(
        CallbackQueryHandler(choose_manual, pattern=f"^{CHOOSE_MANUAL}$"))
    dispatcher.add_handler(
        CallbackQueryHandler(choose_time))
    dispatcher.add_handler(
        CallbackQueryHandler(confirmation, pattern='^confirm$'))
    dispatcher.add_handler(
        CallbackQueryHandler(back_to_menu, pattern='^back$'))
    dispatcher.add_handler(
        CommandHandler("cancel", cancel))
    dispatcher.add_handler(conv_handler)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.03.2023, 16:11
Ответы с готовыми решениями:

Telegram Bot(python-telegram-bot) - InlineButtons и фотографии
Добрый день, делал бота при помощи библиотеки python-telegram-bot и столкнулся с проблемой. Общение с ботом через Inline кнопки и edit...

Вывести текст в поле ввода телеграм используя telegram bot api
Хочу чтобы текст ввелся в поле ввода бота

Telegram Bot: Бот не реагирует на сообщения
Приветствую. Создаю бота через библиотеку - Telegram.Bot. Бот не реагирует на сообщения. Все что он должен на пока сделать,...

1
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
06.03.2023, 12:24
Лучший ответ Сообщение было отмечено eltimc как решение

Решение

eltimc, ты втираешь нам какую то дичь...

А если серьезно, код не читабельный, но по секрету скажу, что callback это процедуры, то бишь они ничего не возвращают, они просто обрабатывают какое то событие.

Для таких ботов, используют конченые автоматы, я не сталкивался с ConversationHandler и может он реализует сие функционал (судя по передаваемым данным), но в любом случае, смысл тогда подключать еще раз функции в самом диспетчере.

А по проблеме: у тебя везде есть фильтрация CallbackQueryHandler, кроме "choose_time" в 27 строке, и когда ты проходишь этот этап, то бишь выбираешь время, даже если ты будешь передавать миллион каких то CallbackQuery, то он всегда будет попадать в choose_time, т.к. он обрабатывает все оставшиеся события, которые не подошли по условиям выше.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.03.2023, 12:24
Помогаю со студенческими работами здесь

node telegram bot api Как получить id опроса, который отправил бот
Еще один вопрос возник во время попыток разработки телеграм бота. Как можно получить id опроса отправленного ботом? Пытался так (т.к. в...

Как написать бота для Telegram, который будет отсылать предупреждение
Здравствуйте, у меня вопрос: как написать бота для Telegram, который будет отсылать предупреждение "Отправляйте голосовые...

Python telegram bot
В конце, после выбора Так или Ні, не отправляется сообщение ggg или hhh. Наперед благодарю import telebot import config from...

Диалог с пользователем
Есть такой код, с первого сайта по созданию бота в телеграме import telebot; bot =...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru