Ответы пользователя по тегу AIOgram
  • Можно ли заставить бота на aiogram отвечать исключительно на каждое пятое сообщение с ключевыми словами?

    @twistfire92
    Python backend developer
    Посмотрите в сторону FSM. В функцию хендлера добавляется параметр state, куда вы запишете номер попытки для конкретного пользователя. Как только счётчик попыток дойдёт до пяти, отвечайте.
    Ответ написан
    Комментировать
  • Не реагируют на нажатия кнопки в телеграм боте?

    @twistfire92
    Python backend developer
    1.
    @dp.message_handler(commands=["support"])
    поменяйте на
    @dp.callback_query_handler(text="support")
    2. Читайте документацию
    3. удалите из вопроса токен и обновите его
    Ответ написан
    4 комментария
  • Как отправить кубик с нужным мне значением?

    @twistfire92
    Python backend developer
    Нельзя отправить эмодзи кубика с предопределенным значением. Если где-то такое было, то скорее всего использовались анимированные стикеры.
    Отправка кубика происходит через метод sendDice, в котором нет параметра для установки значения.
    В ответ прилетает объект Message, в котором есть свойство dice типа Dice.

    В документации четко прописано про random value
    Ответ написан
    Комментировать
  • Как выйти из вложенного хендлера в aiogram3 python?

    @twistfire92
    Python backend developer
    вы не разобрались с библиотекой. Вот эта вся т.н. вложенность в коде никакой вложенностью в логике не является. Вы должны все хендлеры регистрировать на одном уровне, а не внутри других.

    А для реализации вашей логики необходимо использовать машину состояний (FSM)
    Ответ написан
    Комментировать
  • Aiogram 3 как Установить state для определенного пользователя?

    @twistfire92
    Python backend developer
    Можете заглянуть в исходники aiogram, найти там класс FSMContext, экземпляр которого пробрасывается в вашу функцию, и поизучать это все.
    Один из аргументов функции __init__ этого класса имеет тип StorageKey, который в свою очередь содержит информацию о чате, пользователе, боте и пр.
    Я думаю вам стоит копать в эту сторону, создать руками отдельный инстанс FSMContext (назовем его custom_state), куда передадите отдельный инстанс StorageKey с нужными вам параметрами. Вторым параметром у FSMContext буедет выступать ваш Storage. Либо MemoryStorage, либо RedisStorage (либо у вас свой кастомный какой-то). Туда пробрасывайте тот Storage, который используете.

    И вот уже у этого отдельного инстанса custom_state вызывайте метод set_state()

    P.S. Сам такое не проворачивал, ответ написал опираясь на исходники aiogram. Копайте туда, пробуйте, экспериментируйте.
    Ответ написан
    Комментировать
  • Как создать хэндлер Aiogram для обработки ошибки на Python?

    @twistfire92
    Python backend developer
    Вам тут нужна машина состояний (гуглите aiogram FSM), информации в интернете достаточно много. С ее помощью сможете регистрировать текущее состояние каждого пользователя. Например сейчас пользователь в состоянии ввода цены на товар, поэтому в следующем сообщении которое он введет ожидается число. Если приходится выводить ошибку - выводите и не меняйте состояние пользователя
    Ответ написан
    1 комментарий
  • Как сделать inline кнопку чтобы при нажатии можно было позвонить человеку?

    @twistfire92
    Python backend developer
    Нет такого функционала у API телеги. Разве что сделать какую-то веб прослойку, на которую будет ссылаться кнопка и уже там при открытии вызывать tel:xxxxxxxxxx

    Но это что-то костыльное все равно
    Ответ написан
    Комментировать
  • Не работает инлайн-кнопка после нажатия, как исправить?

    @twistfire92
    Python backend developer
    потому что ваше нажатие на кнопку перехватывает хендлер
    @dp.message()
    async def echo(message: Message):

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

    @twistfire92
    Python backend developer
    Программа делает ровно то, что вы ей указали. Берет пользователя, и начинает ему показывать обратный отсчет. Потом берет второго пользователя и делает то же самое. И т.д., пока пользователи не закончатся.

    Если вы хотите чтобы все было одновременно, вам следует одновременно все это запускать. Сначала получше изучите асинхронность, потом напишите асинхронную функцию которая принимает на вход id пользователя, запрашивает его количество секунд и пр. По сути функция должна делать все то, что описано у вас в теле цикла.

    И потом можно попробовать запустить это все, например, через asyncio.gather().

    Сразу предупрежу, что если будет много таких пользователей, есть риск схватить временную блокировку от серверов телеги из-за большого количества запросов. Лучше изучите информацию о том, какие есть ограничения по частоте запросов к серверам телеги.
    Ответ написан
  • Как сохранить машиносостоянии игры :кубик в телеграмме с последующей отправкой кубика в канал?

    @twistfire92
    Python backend developer
    Вместо этого
    lambda message: message.text == ''
    Попробуйте указать так:
    lambda message: message.dice
    Ответ написан
    Комментировать
  • Как перенести aiogram-бота с "long polling" на вебхук?

    @twistfire92
    Python backend developer
    Все с нуля писать скорее всего не придется (Хотя хз как именно у вас все написано). В репозитории aiogram есть пример как можно поднять бота на webhook с использованием aiohttp.

    Я использовал FastAPI как ASGI приложение, которое ловило запрос от сервера телеги и вызывало метод dp.feed_update()
    Ответ написан
    Комментировать
  • Как сделать форматирование текста пересланого поста в бота тг?

    @twistfire92
    Python backend developer
    В объекте message текст сообщения и правила форматирования разделены по разным полям - text и entities

    aiogram, к счастью, позволяет получить текст сообщения с уже примененным форматированием в форматах markdown или html

    Поэтому вам стоит работать не с message.text, а с message.html_text, или message.md_text

    Не забудьте потом указать нужный ParseMode при отправке измененного сообщения
    Ответ написан
    Комментировать
  • Как создать реферальную систему Python aiogram 3?

    @twistfire92
    Python backend developer
    В обработчике команды start в объекте message смотрите что пришло в поле text. Там будет что-то типа
    "/start MTIzNDU2Nzg5"
    Отбрасываете "/start ", декодируете оставшееся из Base64, получите id пользователя кому отправлять сообщение.

    Можно при вызове create_start_link значение параметра encode установить False, тогда id реферала кодироваться не будет и никакого декодирования делать не надо будет. Но я бы так не делал.
    Ответ написан
  • Как запретить пользователю писать сообщения в группе на время?

    @twistfire92
    Python backend developer
    Есть вероятность, что сервер телеги ожидает от вас время UTC+0, а вы, возможно передаете время своего часового пояса, (UTC+3 или где вы находитесь), поэтому пользователь блокируется не на 30 секунд, а на 3 часа 30 секунд (опять же, если у вас часовой пояс +3)

    Также в документации Bot API указано, что если время бана меньше 30 секунд или больше 366 дней, то пользователь блокируется навсегда.

    Я бы начал проверку с часовых поясов.

    UPD
    А вы точно правильно используете метод
    restrict_chat_member?
    await bot.restrict_chat_member(chat_id=message.chat.id,
                    user_id=message.reply_to_message.from_user.id,
                    until_date=ban_time,
                    permissions=ChatPermissions(can_send_messages=False)
                    )


    Все разрешения нужно передавать через отдельный объект ChatPermissions в параметре permissions
    Ответ написан
    3 комментария
  • Как записать в FSM state свое значение или как словить callback и записать его в state?

    @twistfire92
    Python backend developer
    Уберите global переменную choosed_category

    @router.callback_query(F.data == 'shirt_shorts')
    async def ss(callback: CallbackQuery, state: FSMContext):
        await state.set_data({"choosed_category": shirt_shorts}) # прокидываем в state нужные данные
        # либо await state.update_data(choosed_category=shirt_shorts)
        await callback.answer()
        await callback.message.answer('Ты выбрал(а) категорию Футболка / Шорты \n' + txt.calculation)
        await state.set_state(CalculateCost.choosing_cost)
    
    ....
    
    @router.message(CalculateCost.choosing_cost)
    async def calculate(message: Message, state: FSMContext):
        state_data = await state.get_data()
        choosed_category = state_data["choosed_category]
        ....

    По-хорошему все 4 функции с обработкой калбеков можно сократить в одну, но это уже не тема вопроса
    Ответ написан
    3 комментария
  • Телеграм бот. Библиотека aiogram. Как построить многоуровневую ReplyKeyboardMarkup клавиатуру?

    @twistfire92
    Python backend developer
    Да, такую задачу (а именно чтобы нельзя было с любого участка в телеграм боте ввести название определенной кнопки) можно реализовать используя state из возможностей FSM в aiogram. Под каждый раздел меню устанавливать соответствующее состояние (state) для пользователя. И если пользователь введет название кнопки не относящееся к текущему состоянию, не реагировать. Но это чревато тем, что если где-то будет какая-то ошибка в логике установки состояний, пользователь окажется в ситуации, когда нажимает на кнопку, а бот не реагирует. Возможно поможет начать все сначала через /start, но это совсем не user friendly.

    Но лично мое мнение - удобнее делать многоуровневую Inline клавиатуру. И выглядит она красивее.
    Ответ написан
    Комментировать