Ответы пользователя по тегу AIOgram
  • Дублировать инлайн кнопки в обычыне?

    SoreMix
    @SoreMix
    yellow
    К сообщению можно прикрепить только одну кнопку. Отправляете два сообщения, в одном replykeyboard, в другом inlinekeyboard. Обработчик соответственно доделать чтобы он обрабатывал обе кнопки
    Ответ написан
    Комментировать
  • Как получить ID юзеров телеграм бота через aiogram?

    SoreMix
    @SoreMix
    yellow
    Такой опции у ботов нет. Только по новой собирать
    Ответ написан
  • Не пересылает сообщения что делать?

    SoreMix
    @SoreMix
    yellow
    1. Вы сравниваете строку и список message.text == back
    2. Функция review будет вызвана только если текст сообщения равен Оставить отзыв✨, поэтому проверка на текст К меню никогда не будет True

    Ну и не хватает приложенного класса с описанием стейтов. И как не работает, управление вообще не переходит в другую функцию?

    Если хотите обрабатывать кнопку назад, которая есть в нескольких функциях, можно воспользоваться куском из доки по aiogram:

    # You can use state '*' if you need to handle all states
    @dp.message_handler(Text(equals='К меню', ignore_case=True), state='*')
    async def cancel_handler(message: types.Message, state: FSMContext):
        """
        Allow user to cancel any action
        """
        current_state = await state.get_state()
        if current_state is None:
            return
    
        # Cancel state and inform user about it
        await state.finish()
        # And remove keyboard (just in case)
        await message.reply('Cancelled.', reply_markup=types.ReplyKeyboardRemove())


    По итогу он будет отлавливать любой стейт, в котором есть текст к меню. Ну и там уже делаете финиш или что потребуется.
    Ответ написан
    Комментировать
  • Не сохраняет обновленные данные, после машины состояний, как быть?

    SoreMix
    @SoreMix
    yellow
    teacher_id нужно запоминать на моменте edit_teacher_handler, так же сохранив его в FSM.

    На моменте
    Получаем идентификатор преподавателя из message.text
    в message.text ведь лежит номер класса. К тому же наверное в БД ID является числом, а не строкой. Пробовали смотреть какие данные приходят в update_teacher?
    Ответ написан
    Комментировать
  • Как удалить сообщение в тг чате, если в нём присутствует определеное слово?

    SoreMix
    @SoreMix
    yellow
    Вообще всё должно работать, при условии, что этот обработчик зарегистрирован раньше всех других.
    Но работать он не будет если допустим активен какой-то FSM, тогда управление уйдет в него.

    Наверное, лучше было бы создать Middleware, и там уже обрабатывать. Для версии 2.х очень условно будет что-то вроде:
    class BadWordFilterMiddleware(BaseMiddleware):
    
        async def on_process_message(self, message: types.Message, data: dict):
    
            badwords = ['привет', 'пока']
    
            message_text = message.text if message.text else message.caption
    
            if message_text:
                message_text_words = message_text.lower().split()
                for badword in badwords:
                    if badword in message_text_words:
                        await bot.delete_message(message.chat.id, message.message_id)
                        raise CancelHandler()
                        return
    
    dp.middleware.setup(BadWordFilterMiddleware())
    Ответ написан
    Комментировать
  • Как отправить группу фото через библиотеку aiogram?

    SoreMix
    @SoreMix
    yellow
    Когда приходит медиагруппа, она приходит как несколько ивентов. Если сообщение является частью медиагруппы, то в объекте есть поле media_group_id. Как не сложно догадаться, оно отвечает за ID медиагруппы, к которой относится аттач в текущем message.

    Если поставить брейкпоинты и посмотреть что приходит, можно увидеть следующее. В данном примере я отправил боту два фото в медиагруппе:
    (Pdb) message
    <Message {"message_id": 3722, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADcwADLwQ", "file_unique_id": "AQADWMcxG4s6SUt4", "file_size": 526, "width": 90, "height": 31}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADbQADLwQ", "file_unique_id": "AQADWMcxG4s6SUty", "file_size": 3234, "width": 320, "height": 111}, {"file_id": "AgACAgIAAxkBAAIOimRo3YOZvV5o4JU9E82P5XcM20RuAAJYxzEbizpJS11D-cNh5_WcAQADAgADeAADLwQ", "file_unique_id": "AQADWMcxG4s6SUt9", "file_size": 6482, "width": 720, "height": 250}]}>
    (Pdb) continue
    -> photos = message.photo
    (Pdb) message
    <Message {"message_id": 3723, "from": {"id": , "is_bot": false, "first_name": "", "last_name": "", "username": "", "language_code": "en"}, "chat": {"id": , "first_name": "", "last_name": "", "username": "", "type": "private"}, "date": 1684612051, "media_group_id": "13476752415654514", "photo": [{"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3MAAy8E", "file_unique_id": "AQADXscxG4s6SUt4", "file_size": 955, "width": 90, "height": 90}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA20AAy8E", "file_unique_id": "AQADXscxG4s6SUty", "file_size": 6024, "width": 320, "height": 320}, {"file_id": "AgACAgIAAxkBAAIOi2Ro3YOx2AABRU8XtUeWrywlprEjbAACXscxG4s6SUvFtnLWpbRhVAEAAwIAA3gAAy8E", "file_unique_id": "AQADXscxG4s6SUt9", "file_size": 9207, "width": 512, "height": 512}]}>
    (Pdb)


    Видно, что ID файлов разное, поэтому поздравляю всех кто
    проверяли на других библиотеках, говорят, это ошибка API
    . Всё работает штатно и так есть уже несколько лет, если мне не изменяет память.
    (тем не менее мне самому не нравится подход Telegram к такому типу сообщений. У Дурова всегда неплохие API были, зачем тут так сделано мне не ясно, возможно, для этого есть умное объяснение)

    А что делать то?
    1. В обработчик приходит сообщение, содержащее медиагруппу
    2. Заносите ID файла и ID медиагруппы куда нибудь в БД / FSM / etc
    3. Как говорится tricky part: одним из способов детекта, когда же кончится чудесная волна сообщений с одинаковой медиагруппой, является проверка по времени. Т.к. это по сути одно и то же сообщение, то апдейты прилетают одинаково по времени. Соответственно, после того как у вас пришло сообщение, у которого ID медиагруппы уникально, то есть такую еще не обрабатывали до этого, ставите "таймер" допустим на 1-2 секунды. На протяжении этого времени скрипт успеет отловить все файлы от этого сообщения.
    4. Пока ловятся ваши апдейты, так же, в FSM / БД / etc. заносите ID файлов
    5. По окончании таймера, достаете все ваши file ID, делаете из них своё сообщение, отправляете юзеру, а саму группу удаляете из FSM / БД

    Есть готовые решения для обработки, не отвечаю за них, но вот:
    https://github.com/WhiteMemory99/aiogram_album_han...

    Как пример можете просто взять этот Middleware, либо просто переписать свой аналог. Могу и сюда приложить какое нибудь решение как освобожусь, но вряд ли оно будет отличаться чем-то от этого
    Ответ написан
  • Как реализовать один хэндлер на несколько сообщений в телеграмм-боте?

    SoreMix
    @SoreMix
    yellow
    @dp.message_handler(lambda message: message.text and message.text.lower() in ['да', 'нет'])
    Ответ написан
    Комментировать
  • Ошибка AttributeError NoneType aiogram FSMContext?

    SoreMix
    @SoreMix
    yellow
    from aiogram.dispatcher.webhook import get_new_configured_app
    
    
    ...
    
    if __name__ == '__main__':
        app = get_new_configured_app(dispatcher=dp, path=WEBHOOK_URL_PATH)
        app.on_shutdown.append(on_shutdown)
        app.on_startup.append(on_startup)
        Bot.set_current(bot)
        web.run_app(app, host=WEBHOOK_IP, port=int(WEBHOOK_PORT), loop=loop)
    Ответ написан
    Комментировать
  • Как создать диалоговое всплывающее окно в aiogram?

    SoreMix
    @SoreMix
    yellow
    Таких функций нет
    Ответ написан
    Комментировать
  • Возможно получить все чаты бота?

    SoreMix
    @SoreMix
    yellow
    Телеграм боты в принципе не имеют такой возможности
    Ответ написан
    4 комментария
  • Как залить телеграм бота (написанного на Python) на хостинг?

    SoreMix
    @SoreMix
    yellow
    Неплохо было бы уточнять что за хостинг, их тысячи. Ну и код вставлять, и ошибку текстом.
    Допустим, похоже на pythonanywhere. Для него надо использовать прокси, если аккаунт бесплатный:

    https://qna.habr.com/q/902939
    Ответ написан
    Комментировать
  • Как исправить ошибку в python - Task exception was never retrieved?

    SoreMix
    @SoreMix
    yellow
    В строке
    await msg.reply('Привет! Выбери царство.', reply_markup=kingdom)
    функцию kingdom нужно вызвать, чтобы она вернула клавиатуру. Без этого вы передаете саму функцию

    await msg.reply('Привет! Выбери царство.', reply_markup=kingdom())
    Ответ написан
    1 комментарий
  • Создал самого простого бота на аиограм 3, не понимаю в чём ошибка, что здесь не так?

    SoreMix
    @SoreMix
    yellow
    Лучше указать полный путь до файла, либо путь относительно скрипта, скорее всего проблема в том что запускаете не из папки со скриптом
    Ответ написан
  • Почему бот отправляет сообщение мне, а не пользователю?

    SoreMix
    @SoreMix
    yellow
    Потому что вы жмете кнопку в своем чате с ботом, поэтому и отправляете себе.

    Можно добавить к callback_data параметром с ID чата.

    approval_keyboard.add(InlineKeyboardButton("Одобрить", callback_data=f"approve_message.chat.id"),
                              InlineKeyboardButton("Отклонить", callback_data=f"reject_message.chat.id"))


    Переписать хэндлер как

    @dp.callback_query_handler(lambda c: c.data.startswith('approve_') or c.data.startswith('reject_') )


    Ну и в самой функции через сплит достать ID человека
    Ответ написан
    Комментировать
  • Почему выходит ошибка Unresolved attribute reference 'register_next_step_handler' for class 'Dispatcher'?

    SoreMix
    @SoreMix
    yellow
    register_next_step_handler из либы telebot, а у вас aiogram

    Для подобного в aiogram есть FSM
    Ответ написан
    Комментировать
  • Можно ли использовать сразу две библиотеки для одного бота в телеграм?

    SoreMix
    @SoreMix
    yellow
    Тут надо сначала понять для чего это нужно. В теории, какие-то вещи можно совместить конечно, но для этого нет необходимости. Они полные и самодостаточные. Для чего это? Задача, которую хотите решить, 99% решается одной либой
    Ответ написан
    Комментировать
  • Как выставить кнопки по 2 в ряд?

    SoreMix
    @SoreMix
    yellow
    Работает только если скопом их все добавить

    btns = []
    for res in Database_e.get_model_name(id):
        btns.append(InlineKeyboardButton(text=res[0], callback_data=f'model_{res[0]}'))
    ikb.add(*btns)
    Ответ написан
    Комментировать
  • Как исправить ошибку aiogram.utils.exceptions.BadRequest: Unsupported parse_mode?

    SoreMix
    @SoreMix
    yellow
    Для message.answer первый параметр текст, второй - parse mode. Не нужно туда передавать id пользователя

    https://docs.aiogram.dev/en/latest/telegram/types/...
    Ответ написан
    Комментировать
  • Не работает SendChatAction как сделать так чтобы он работал?

    SoreMix
    @SoreMix
    yellow
    result = await bot.send_chat_action(message.chat.id, types.ChatActions.TYPING)
    print(result)


    Что выводит? Ну и в целом, после вызова этого метода сразу ведь отправляется сообщение, оно прерывает статус. Попробуйте закоментировать send_message и посмотрите на результат
    Ответ написан
    Комментировать
  • Возникновение ошибки при попытке поставить Telegram бота с использованием selenium на сервер. В чём заключается ошибка?

    SoreMix
    @SoreMix
    yellow
    Параметра executor_path нет, есть только executable_path.
    Почему работает на локалке? 99% на сервере и на локалке запускаются разные файлы. 1% на ручную правку параметра в сурсах
    Ответ написан
    1 комментарий