Ответы пользователя по тегу AIOgram
  • Resize_markup aiogram?

    @Causon
    Не так то, что вы не читаете документацию.
    По-умолчанию, реплай клавиатура имеет тот же самый размер, что и клавиатура используемая телефоном, из-за этого, если кнопок мало, то они будут увеличены по вертикали. Что бы их уменьшить используется параметр resize_keyboard=True:

    Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). Defaults to false, in which case the custom keyboard is always of the same height as the app's standard keyboard.
    Ответ написан
  • Как отправлять сообщение в handlers.py без bot?

    @Causon
    В смысле как? Импортировать Bot

    from aiogram import Bot
    
    @router.message(CommandStart())
    async def command_start_handler(message: Message, bot: Bot) -> None:
        await bot.send_message(chat_id=chat, text=text)
    Ответ написан
    Комментировать
  • Что не так с кодом?

    @Causon
    Потому что хендлер
    @form_router.message(Form.name)
    async def process_name(message: Message, state: FSMContext):

    срабатывает дважды.

    При старте бота устанавливается стэйт Form.name, бот запрашивает имя - отправляем имя, срабатывает хендлер:

    @form_router.message(Form.name)
    async def process_name(message: Message, state: FSMContext):
        await state.update_data(name=message.text)
        await message.answer('Выберите кнопку ниже', reply_markup=ReplyKeyboardMarkup(keyboard=[[KeyboardButton(text='Купить'),KeyboardButton(text='Продать'),]],resize_keyboard=True,))
            
        if message.text == 'Продать':
            await state.set_state(Form.kolvo)
            await message.answer('Введи количество')

    Но, из-за того, что имя будет "Продать" блок if, где происходит смена стэйта не срабатывает, и стэйт остается Form.name, соответственно и при отправке следующего сообщения боту сработает тот е самый хендлер, который ожидает имя, пока не придет слово Продать. И только в этом случае стэйт переключится и будет срабатывать следующий хэндлер
    Ответ написан
    Комментировать
  • Фильтр aiogram 3 (проверка на админа группы)?

    @Causon
    Пример фильтра как класс на проверку прав доступа.
    В данном случае, id внесены просто в словарь.

    from aiogram.filters import BaseFilter
    
    admin_ids = [123, 456]
    
    class IsAdmin(BaseFilter):
        def __init__(self, admin_ids) -> None:
            self.admin_ids = admin_ids
        
        async def __call__(self, message: Message) -> bool:
            return message.from_user.id in self.admin_ids


    Пример хендлера с использованием фильтра:

    @router.message(IsAdmin(admin_ids), F.text == "admin")
    async def admin_handler(message: Message) -> None:
        kb_admin = [
            [types.KeyboardButton(text="Статистика")],
            [types.KeyboardButton(text="Выход")],
            [types.KeyboardButton(text="Настройки")],
        ]
        keyboard_admin = types.ReplyKeyboardMarkup(
            keyboard=kb_admin,
            resize_keyboard=True
        )
        await message.answer("Меню администратора", reply_markup=keyboard_admin)
    Ответ написан
  • Как сделать так что бы айди админа не заходил в функцию обрабатывающую любой текст?

    @Causon
    Сделайте фильтр и пропишите его в хендлере:

    from aiogram.dispatcher.filters import Filter
    
    admins = [12345, 67890]
    
    
    class IsAdmin(Filter):
        async def check_adm(self, message: types.Message):
            return message.from_user.id in admins
    
    
    @dp.message_handler(IsAdmin())
    async def admin_handler(message: types.Message):
        await message.reply("Это админ")
    Ответ написан
  • Как удалить все сообщения в боте aiogramm python?

    @Causon
    Нет, бот не может очистить историю чата.
    В Aiogram есть метод deleteMessage, в котором обязательным параметром является указание message_id, которое необходимо удалить. В вашем случае, можно записывать все id сообщений в БД, а затем, периодически циклом чистить историю чата.
    Но нужно помнить, что могут быть удалены сообщения, которые не старше 48 часов
    Ответ написан
    Комментировать
  • Ошибка Parameter 'inline_keyboard' unfilled при создании телеграм бота через aiogram, как решить?

    @Causon
    У вас должно быть вместо InlineKeyboardMarkup прописано InlineKeyboardBuilder
    @dp.message(Command("hello"))
    async def hello(message: types.Message):
        builder = InlineKeyboardBuilder()
        builder.add(types.InlineKeyboardButton(text='rrtgtgt'))
        await message.reply('Hello', reply_markup=builder)


    Дополню: InlineKeyboardMarkup подчеркнута, потому что у нее есть обязательный аргумент.
    Из документации:
    class aiogram.types.inline_keyboard_markup.InlineKeyboardMarkup(*, inline_keyboard: List[List[InlineKeyboardButton]], **extra_data: Any)

    inline_keyboard: List[List[InlineKeyboardButton]]
    Array of button rows, each represented by an Array of aiogram.types.inline_keyboard_button.InlineKeyboardButton objects
    Ответ написан
    Комментировать