Задать вопрос
Ответы пользователя по тегу AIOgram
  • Как создать реферальную систему 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 клавиатуру. И выглядит она красивее.
    Ответ написан
    Комментировать