Задать вопрос
Пользователь пока ничего не рассказал о себе

Наибольший вклад в теги

Все теги (8)

Лучшие ответы пользователя

Все ответы (30)
  • Почему callback_query_handler не видит call.data?

    @codingoleg
    Не понятно, на какой библиотеке вы это делаете. Вот вам пример на aiogram 2.25. Думаю, в остальных будет примерно так же, кроме добавленных слов async/await. Сделал по вашему шаблону, но лучше хэндлер с callback разделить на несколько, если их планируется много. Рекомендую ознакомиться, чем отличается types.Message от types.CallbackQuery, а также message_handler от callback_query_handler, чтобы в будущем не было проблем.
    from aiogram import Bot, Dispatcher, executor, types
    
    bot = Bot('token')
    dp = Dispatcher(bot)
    
    @dp.message_handler(commands=['start'])
    async def get_phone(message: types.Message):
        keyboard = types.InlineKeyboardMarkup()
        key_1 = types.InlineKeyboardButton(text='button 1', callback_data='b1')
        keyboard.add(key_1)
        key_2 = types.InlineKeyboardButton(text='button 2', callback_data='b2')
        keyboard.add(key_2)
        await bot.send_message(message.from_user.id, text='Выберите, нажав одну из кнопок:', reply_markup=keyboard)
    
    @dp.callback_query_handler(lambda call: True)
    async def get_storage(callback: types.CallbackQuery):
        if callback.data == 'b1':
            await callback.message.answer('Вы нажали на button 1')
        if callback.data == 'b2':
            await callback.message.answer('Вы нажали на button 2')
    
        # Заглушка, чтобы кнопка не мигала после нажатия
        await callback.answer()
    
    executor.start_polling(dp)
    Ответ написан
    1 комментарий
  • Как вызвать Callback без inline клавиатуры?

    @codingoleg
    Если вопрос только в поп-ап уведомлении, то в апи телеграма написано, что метод только для Inline клавиатур. Поэтому aiogram вам ничем не поможет. Если нужна проверка входящих данных, то можно использовать один из или все три варианта: 1. Машина состояний. 2. Функция проверки в аргументах декоратора. 3. Middleware для более сложных случаев. Вот вам 1 и 2 вариант:
    from aiogram import Bot, Dispatcher, executor, types
    from aiogram.types import ReplyKeyboardMarkup
    from aiogram.contrib.fsm_storage.memory import MemoryStorage
    
    bot = Bot('')
    storage = MemoryStorage()
    dp = Dispatcher(bot, storage=MemoryStorage())
    
    state_time = 'setTime'
    kb = ReplyKeyboardMarkup(row_width=10, one_time_keyboard=True)
    btns = (types.KeyboardButton(str(btn)) for btn in range(1, 31))
    kb.add(*btns)
    
    @dp.message_handler(commands=['start'])
    async def dp_choose_user(message: types.Message):
        await message.answer('Введите день:', reply_markup=kb)
        await dp.current_state().set_state(state_time)  # Вход в состояние ввода даты
    
    @dp.message_handler(lambda message: message.text.isdigit() and 1 <= int(message.text) <= 30, state=state_time)
    async def dp_choose_action(message: types.Message):
        await message.answer(text=f'Вы выбрали {message.text}')
        await dp.current_state().reset_state()  # Выход из состояния ввода даты
    
    @dp.message_handler(state=state_time)
    async def dp_choose_action(message: types.Message):
        await message.answer(text='Ошибка ввода даты. Введите еще раз.', reply_markup=kb)
    
    executor.start_polling(dp)
    Ответ написан
    Комментировать
  • Как обернуть в цикл консольную программу на Python?

    @codingoleg
    Оборачивать весь код в бесконечный цикл не надо. Нужно обернуть лишь ту часть/функцию, которую вы хотите повторить. Пример кода с отображением номера стороны и треугольника и без повторов (заменить в вашем коде, начиная с try):
    # Функция для подставления номера стороны и номера треугольника для отображения
    def enter_length(side_num: str, triangle_num: str):
        return f'Enter the length of {side_num} side of triangle {triangle_num} (cm): '
    
    
    error_msg = 'Error! Please enter an integer or fractional number for the program to work correctly.'
    repeat_msg = "Enter 'Y' for one more triangle or any key to exit: "
    # Номер треугольника
    triangle_num = 1
    while True:
        try:
            sides = []
            # Номер стороны из 3
            for side_num in range(1, 4):
                sides.append(
                    float(input(enter_length(str(side_num), str(triangle_num)))))
            area_of_triangle(*sides)
        except ValueError:
            print(error_msg)
        else:
            response = input(repeat_msg)
            if response == 'Y':
                triangle_num += 1
            else:
                break
    Ответ написан
    Комментировать
  • Как реализовать чтение входящих писем outlook.com с помощью python?

    @codingoleg
    Я бы использовал какую-нибудь библиотеку SMTP вместе с API почтового сервиса.
    Ответ написан
    Комментировать
  • Как сделать нормальные глобальные переменные?

    @codingoleg
    Если вас не пугает потеря этих данных, например, из-за перезагрузки бота и прочего, то можно сделать глобальную переменную - словарь. Ключом будет id пользователя или чата, а значением - то, что вы хотите сохранить для него.
    users = {
        12398767: {'name': 'Vasya'},
        98765467: {'name': 'Lena'}
    }
    
    def edit(user_id: int):
        global users
        users[user_id]['name'] = 'Petya'
    
    def read(user_id: int):
        print(users[user_id]['name'])
    
    edit(12398767)
    read(12398767)  # Petya
    print(users)  # {12398767: {'name': 'Petya'}, 98765467: {'name': 'Lena'}}
    Ответ написан
    1 комментарий