я уже не первый плейлист смотрю на этом канале, очень подробно и полезно, полноценные уроки. Уважаемый автор канала, ты делаешь очень полезное дело, от всего сердца благодарю и надеюсь, что будет еще много полезных уроков
Спасибо! Качество кода и подача материала на высоте! Огромная просьба завернуть проект в докер перед началом использования базы. Надеюсь что моя просьба не увеличит интервал подачи материала. С нетерпением ждем продолжение )
Благодарю 👍.Давайте докер отложим на потом, чтоб не вмешивать не связанный с aiogram инструмент, в итак насыщенное следующее видео (middleware, sqlalchemy и тд).
Привет! Очень полезный курс у Вас получился, спасибо! Я час убил на то чтобы понять как работает функция go_back, хотел уже задать вопрос, но вдруг все понял. Конструкция цикла вскипетила мне мозг.:D
Однозначно отлично рассказываешь. Подписка, лайки под всеми видео. Я только в этом уроке не мог понять почему у меня админ фильтр не работает. Дело в том, что я не скачиваю уроки твои, а сам набираю. Так лучше запоминается. Неделю пытался понять. Поковырялся в коде. Я не обратил внимания, а ты не упомянул, что нужно в апп, добавить диспетчер dp.include_router(admin_router). Хотя в моменте, где ты говоришь о добавлениии май админ лист к боту, там на экране видо, что рорутер админ, добавлен. Если бы я скопировал урок, то ошибки бы не было. А так сам пропустил, и сам нашел))). Т.к. я новичек (не яд), то долго не мог понять, пересмотрел этот ролик раз 30. Но зато сам разобрался и увидел, что сам роуртер не объявлен. ООООООООчень кайфонул когда решил проблему. Значит обучение идет). Спасибо.
12:47 Пацаны, у кого не работает, добавьте в файл app следующие две строки: from handlers.admin_private import admin_router dp.include_router(admin_router)
Думал, что клавиатуры трудны для понимания, но разобравшись с ними - теперь трудность в понимании возникает с FSMкой =) Надеюсь, что тоже при втором просмотре будет намного легче для понимания
Великолепные уроки, спасибо большое! Почему, кстати, именно aiogram, а не pyrogram или telethon? Последние больше для пользовательских сессий подходят, или на них вообще не написать так легко бота?
Здравствуйте, я либо не понял, либо прослушал этот момент. Примерно когда начинается 18:00, у вас идет допустим async def add_description......а снизу идет: await message.answer("Введите стоимость товара") это идет у вас опечатка или так нужно делать? Заранее благодарю за ваше старание!
Приветствую тебя! Посоветуй пожалуйста, что начать изучать для создания сайта, информационного портала с добавлением интерактивной картой? Нужно для реализации проекта, туристических маршрутов по вершинам Южного Урала/Кавказа. Сам работаю разработчиком 1С, но сайты никогда не разрабатывал Подробности по проекту могу больше описать, если это требуется
7:04 В метод __call__ помимо message и bot что еще можно передать? Если я правильно понимаю, то срабатывание этого метода происходит вообще где-то в глубине пакета aiogram (то есть не в коде, который мы написали, а в коде, который написали разработчики), несмотря на то, что мы даже явно не указали никаких экземпляров наших кастомных фильтров. Соответственно там происходит вызов экземпляра класса и уже там при вызове передаются экземпляры класса types.Message и Bot. Так вот не понятно, помимо этих классов, в метод __call__ что еще можно передать? В самих пакетах aiogram не смог найти где этот вызов находится. И в документации тоже, вроде бы, не сказано, что можно передавать.
Можно взять любые данные которые передаются через словарь data из middleware (промежуточные слои). О middleware будет в следующих видео (которые уже есть)
Спасибо за подробный рассказ и обьяснения! А вопрос такой, у меня sinology дома, могу как то запустить бота, написаный по Вашим роликам? Направте на путь поиска информации, а если есть ответ-поделитесь
Здравствуй, подскажи пожалуйста какой курс стоит покупать по питону, что бы не кинули, есть ли у тебя проверенные варианты? к кому можно будет пойти для платного обучения.
@@PythonHubStudio Добрый день подскажите пожалуйста у меня ошибка "Import "common.restricted_words" could not be resolvedPylancereportMissingImports)"если я удаляю хэндлер с restricted_word то все работает
Добрый день! Большое спасибо за ваш труд, давно уже смотрю ваши видео)) Единственное, не разобрался как вы так быстро наведя на слово импортируете фильтры например и т.д. ? Точнее на видео это понятно как выглядит, но у меня такое не подсвечивается, чтобы он автоматически импортировал, а приходится руками всё время вбивать((
Плюс все это обновление можно сделать динамическим, где при старте бота будет автоматически создаваться нужный список, и при добавлении/удалении админов этот список будет обновляться через получение апдейтов типа chat_member. А иначе совсем уж какой-то кривой велосипед получается, когда это все вручную нужно делать при каждом перезапуске бота и при каждом изменении списка админов.
@@PythonHubStudioделал копи паст с гит хаба. Пайчарм перезапускал. Посмотрите пожалуйста почему название товара дает вводить, в как вводишь описание, то он повторяет сообщение "введите описание"
Здравствуйте! А что лучше использовать, MySQL или PSql В рамках такого бота по "продаже" товаров Я только начинаю свой путь в it, так что извините, если задал неразумный вопрос
Разницы не будет в работе. Но по psql больше распространение и примеров в сети если возникнут вопросы/проблемы и более знакома другим разработчикам если проект будет совместный с кем-то впоследствии.
Спасибо за видео! А можно про вариант добавления админов в отдельный список подробнее? Условно есть супер админ, который дает другим админам доступ к боту, как он это будет делать? Прописывать id пользователя и сохранять в базу? Как ему узнать этот id, если он понятия не имеет как это сделать? Вообще как в бота добавить пользователя, не абы кого, а конкретного пользователя?
Как отличить админов поможет запрос к api get administrators (мы его делали в хендлере на команду /admin)(сделайте принт ответа чтоб посмотреть). Создатель бота вообще числится как owner/creator. По id пользователя можно удобно раздавать права. Это если более подробно чем в видео итак было показано
@@PythonHubStudio у меня сложность в том, что я не понимаю как добавить пользователя в бот. Допустим я написал бота и запустил его. Сейчас я один пользователь в нем, теперь я хочу добавить людей, которые этим ботом смогут пользоваться. Вариант прописать id нужных пользователей в настройках бота не подходит, их нужно добавлять через бот. Все ответы которые я смог найти свлядятся к тому, что пользователь регистрируется в боте самостоятельно, естественно тогда я его и username и id могу выцепить. А тут мне надо пользователя зарегистрировать в боте, только после этого он получит к нему доступ.
В конце 6го урока автор отдельным хэндлером ловит ошибку ввода пользователя, а не проще обернуть в try except и в except написать что что то пошло не так и выкинуть в начало его, так он не только неправильный ввод будет ловить, но и другие ошибки без помех работы бота. Я лично каждый хэндлер оборачиваю в try/except, иногда бывает долгий ответ от сервера и бот лег, а так отписал что то не так и работает дальше)
Не проще. Отдельный хендлер нужен для отлова отправки вместо текста - стикера или фото или ..., try except имеет смысл писать только внутри хендлера, и то, если через if elif не смогли предусмотреть варианты (как запасной вариант).
Здравствуйте, помогите пожалуйста. скопировал ваш год и бот не запускается и выдает ошибку from common.restricted_words import restricted_words ModuleNotFoundError: No module named 'common.restricted_words' перепробовал все, в интернете нет ответа
И не должно, смайл это текст, который может быть в описании/названии. Можно, если нужно, сделать проверку строки на содержание емоджи через регулярные выражения или просто через проверку. Посмотрите как выглядит реальная строка emoji (сырая).
Здравствуйте. Большое спасибо за обзор и понятное объяснение FSM. Подскажите пожалуйста, как решается проблема, если пользователю надо загрузить не одно, а несколько фото? Если они объединяются в media group, то есть mediagrouphandler. А вот если пользователь вдруг решил их не группой отправить, а по отдельности. Вы сталкивались с такой задачкой? Рылся в гугле и на форумах. Честно.
Нет, я так не делал, но простое решение вроде есть, на первый взгляд. Просто не сразу меняйте Стейт на следующий, а сделайте общий хендлер, который ловит и это шаг и следующий (например на фото и текст), который ловит фото и что-то другое, что идёт следующим. И у вас получиться ловить любое количество фоток, а потом, когда он отправит , например текст, перейти к другим делам.
@@PythonHubStudio Спасибо за ответ. Я уже рассматривал такой вариант поведения, но после фото он сразу должен выдавать сообщение с вопросом про контактные данные (пользователь не должен ничего вводить). Можно сделать reply кнопку "Подтвердить ввод", но в моем контексте это не совсем верно. Радует то, что по умолчанию несколько фото группируются и пользователю надо снять галочку эту, чтобы получить не совсем адекватное поведение. Тоже думал, что все просто, а по факту голову уже сломал и ничего толкового, кроме как в сообщении написать пользователю, чтобы при отправке группы фоток эту галку оставлял, не пришло. )))
Последнее, на самом деле, очень верно, любое неадекватное поведение юзера предусмотреть невозможно, сразу предупредили текстом, и если что сделали кнопку назад и все.
Значит проверьте свой хендлер для группы /admin. Не может быть, что у меня работает (код на гитхабе есть), а у вас просто так нет. Если делали копипаст, то может редактор не воспринял некоторые строки(такое бывает) - добавьте где нибудь рандомный print, чтоб текст заново прочитался, или перезагрузите редактор(закрыть/открыть). Как-то так...
Как же кайфово, когда какие-то неточности и баги ловишь и потом такой целый ищешь причину. В общем из-за того, что диспеччер админки был размещен ниже диспечера приватки - у меня не реагировало в привате на /admin. Реально целый день потратил, на то, что бы это определить. dp = Dispatcher() dp.include_router(admin_router) dp.include_router(user_private_router) dp.include_router(user_group_router)
Можно, это не сложно сделать(обновить существующий уже плейлист на канале по discord боту, там ничего существенного не изменилось, по сравнению с телеграм), но такой запрос поступил только один раз - от Вас!
Как отдельный проект. Суть та же. И бд под него можно отдельную также сделать . На одной бд для всех вариантов могут быть проблемы в совместимости бд по таблицам
Как сделать, если допустим имеется несколько магазинов и у каждого свой ассортимент (пиццы, пироги, пироженные, торты и т. д) как добавить список магазинов в виде инлайн клавиатуры и уже проваливаясь в магазин работать с ассортиментом, далее с названиями? Или другой пример, список объектов, на объектах есть оборудование (разного назначения, количества и с разными характеристиками). В боте инлайн клавиатура со списком объектов, проваливаемся в объект, получаем инлайн клавиатуру список оборудования по типу, проваливаемся далее, получаем названия, характеристики, количество, фото...
Вы сильно круто берете, как для начинающего разрабатывать ботов. Тут могу ответить так: делить базы данных по id (и это не значит в прямом смысле id в телеграмме) клиента (заказчика).
Атрибут bot.my_admins_list случайно не в оперативной памяти хранит список? Если это так, значит после перезапуска бота нужно будет каждый раз в ручную тянуть командой в группе заново список, верно?
Добрый вечер, благодарен за ваши видео они очень крутые. У меня возникла проблема на этапе написания команды /admin в группу, не вылезает клавиатура как у вас в видео. Был бы рад если бы подсказали как решить.
Здравствуйте, сталкивался кто с такой проблемой(from common.restricted_world import restricted_world ) ошибка (Доступ к "restricted_world" не осуществляется Pylance) и много где такое бывает, как можно это исправить?Автору огромное спасибо!Лучший!
@@PythonHubStudio проект открыт нормально,все проверил,вы сказали, что скопируйте код... скопировал и в хендлерах вылазит что то подобное. Например "from sqlalchemy.ext.asyncio import AsyncSession" (Unable to import'sqlalchemy.ext.asyncio'PylintE0401:import-error Не удается разрешить импорт "sqlalchemy.ext.asyncio" Pylance(reportMissingImports) Весь интеренет перерыл, ничего не нашел на данную проблему
Здравствуйте, у меня с самого начала уже вопросы, у меня Pycharm, в папке filter файл chat_types, у меня где my_admin_list не работает (ошибку показывает), хотя весь код скопировал с гита, но все равно показывает ошибку + для каждой папки создал __init__.py и прописал туда все импорты, но все равно не помогло, можете сказать в чем моя ошибка? 😢
Наверно у вас в редакторе проект открыт на папку выше чем положено (должна быть открыта папка, где файл app.py). Или можно в окне папок и файлов проекта(експлорере), тыкнуть ПКМ, по ней, и выбрать "пометить как папка проекта")
Добрый день! Как быть если в личных сообщениях с ботом обычным пользователям (не администраторам) тоже необходимо использовать команду "/admin". Если я пропишу обработчик для этой команды в @user_private_router, то этот роутер будет перехватывать сообщения и от администраторов и отрабатывать как общий хендлер. Очевидный вариант: в диспчер включать роутер администратора первым, а потом уже роутер обычных пользователей, но вариант не очень красивый, как можно сделать лучше? Заранее спасибо!
Уважаемый автор! Благодарю Вас за качественный материал, не останавливайтесь) И есть у меня к Вам вопрос: При запуске бота, в терминал выдает предупреждение. Как переписать код в данном боте? Также работаю в PyCharm MacOS, остановился на создании BD. Все необходимые библиотеки инсталлировались после 20.03.2024. Заранее благодарю за ответы DeprecationWarning: Passing `parse_mode`, `disable_web_page_preview` or `protect_content` to Bot initializer is deprecated. This arguments will be removed in 3.5.0 version Use `default=DefaultBotProperties(...)` instead. bot = Bot(token=os.getenv('TOKEN'), parse_mode=ParseMode.HTML)
если прям сильно напрягает это предупреждение, то можно заменить на bot = Bot(token=os.getenv('TOKEN'), default=DefaultBotProperties(parse_mode=ParseMode.HTML)) у меня на версии 3.4.1 с такой строкой всё работает.
Привет! Обращаюсь к вам так как зашёл в тупик. В кратце я создал два экземпляра бота, и проблема в том что команды пересекаются между ними (роутерами) Какой сделать фильтр? У меня идея была сделать фильтр на имя роутера, но к сожалению дало ошибку(
@@PythonHubStudio та уже решил) Вопрос был в том, как сделать кастомный фильтр, и додумался сделать фильтр на сам экземляр бота и всё сработало как надо Я просто не знал, что у message есть свойство bot Вот такой фильтр у меня получился class ChatBotFilter(Filter): def __init__(self, bot: Bot) -> None: self.bot = bot async def __call__(self, message: types.Message) -> bool: return message.bot == self.bot
Спасибо за классный туториал! Но почему бы кнопки не сделать с помощью словаря, а вместо else if , использовать math case. Я не учу ни кого , я просто предложил😅
Интересно ваше мнение. В коде обработчиков FSM есть ли мотивация писать в порядке await message.answer ("Введите название") #говорим что хотим от человека await state.set_state(AddProduct.name) #переходим к ожиданию ввода Вместо - сначала установки состояния, а затем отправки сообщения типа "Введите название"? await state.set_state(AddProduct.name) #переходим к ожиданию ввода await message.answer ("Введите название") #говорим что хотим от человека
Всем привет. В файле reply.py такая строка: sizes: tuple[int] = (2,), При ней у меня лезет ошибка: TypeError: 'type' object is not subscriptable Исправил на: sizes: tuple = (2,), все заработало. Вопросы: У всех, кто в восторге, какая строка работает? Если первая - почему у меня нет? Если сами исправили - почему не отписали? А курс реально крутой.
Здравствуйте. Очень сильно помогли ваши видео. Уже много ветвлений в коде и стал вопрос, как их фильтровать. Попробовал по аналогии собрать свой фильтр, который смотрел бы в базу, но он не работает... class IsAdmin(Filter): async def __call__(self, session: AsyncSession, message: types.Message) -> bool: admins = [] for a in await orm_get_admins(session): admins.append(a.admin) return message.from_user.id in admins TypeError: IsAdmin.__call__() got multiple values for argument 'session' Язык знаю плохо, точнее почти не знаю. Позскажите плз, что я делаю не так? И как лучше сделать?
Так запросы к базе, по отдельности, у меня все работают, а вот в фильтре, ошибку выдаёт. Про мидлваре смотрел, но не совсем понятно что там и для чего.
Очень нравиться ваш контент!! Возник вопрос: Как я могу скачать файл (в моем случае это .doc), который был отправлен моему боту пользователем? В документации нашел только await bot.download(document) Но как только я импортирую в файл user_private.py этого bot с файла app.py, то возникают ошибки я пытался переставлять импорты в файлах,в итоге я переставил from app import bot прямо перед строчкой await bot.download(document),но в этот раз другая ошибка RuntimeError: Router is already attached to Я понимаю,что ошибка заключается в том,что что-то вызывается несколько раз(а должно 1 раз) Если сможете помочь буду очень благодарен!!! *структура папок такая же как у вас на видео
Видимо пропустили, я говорил, что если нужен экземпляр бота в хендлере, то всего лишь нужно добавить соответствующий параметр в ваш хендлер, он туда прокинется aiogram-ом сам: (message: types.Message, bot: Bot) И юзайте вашего бота в хендлере как захочется. А для аннотации типа параметра bot: Bot, нужно просто добавить импорт экземпляра класса Bot, чтоб видеть его методы в автокомплите: from aiogram import Bot
очень крутая реализация перехода на предыдущее состояние стейта трек тайм 34:50 . с начала не въехал а потом как въехал)))))))))))))))))) previous обновляется после каждой итерации , хитроумный алгоритм огромное вам спасибо.
await message.answer(f"Шаг назад {AddProduct.texts[previous.state]}") AttributeError: 'NoneType' object has no attribute 'state'. И я его понимаю. Как мы можем что то сюда передать если у нас previous на данный момент типа None.
Объясните пожалуйста момент 26:48, как преобразовать словарик в отдельный элемент, мне там число надо вводить, а я хочу получить не как {'number': '3'}, а как 3, что в этом случае делать У меня получилось так, это работает, но так не удобно писать: @user_private_router.message(Games.data_input, F.text) async def add_data_output(message: types.Message, state: FSMContext): await state.update_data(data_input=message.text) random_number = random.randint(1, 2) data = await state.get_data() # await message.answer(str(data)) if data == {'data_input': f'{random_number}'}: await message.answer('Вы угадали') else: await message.answer("Вы не угадали :(") await message.answer(f"Было загадано число {random_number}") await state.clear()
День добрый! Помогите разобраться с проблемой. В модуле chat_types в классе IsAdmin, bot не видит my_admins_list, я прописал его в модуле app, попытался импортировать саму переменную bot из app, но код не запускается, а в самом классе Is Admin, bot.my_admins_list он его не видит. Импорты не помогают
@@PythonHubStudio проверил и даже с вашего гита качнул код, не получается. В модуле chat_types в классе IsAdmin, он my_admins_list просто не видит, подкрашивается серым. Если импорт делать, то там то же ошибка ( ImportError: cannot import name 'user_private_router' from partially initialized module )
Приветствую, админа, у меня проблема с админ панелью, когда запускаю бота /admin не работает, бот вообще не заходит в handler с командой /админ и пропускает через обычный handler с фильтром F.text, подскажите как решить эту проблему. Единственная ошибка которую выдаёт ide, в файле chat_types не работает обращение к списку админов bot.my_amins_list , что делать?
@@PythonHubStudioпришел к тому что он не заходил в handler admin из-за того что был F.text() поменял местами вызов в app.py, но чтобы бот сам определил админа так и не допер, в итоге вбил напрямую свой id
И еще не совсем понятно как на видео отработал код #Хендлер для отлова некорректного ввода для состояния если среда ругается, что функция уже определена: #Ловим данные для состояние price и потом меняем состояние на image @admin_router.message(AddProduct.price, F.text) async def add_price #Хендлер для отлова некорректных ввода для состояния price @admin_router.message(AddProduct.price) async def add_price(message: types.Message, state: FSMContext): \\ Получим ошибку function already defined
Отработал нормально, как видно на видео. Это предупреждение линтера вашего редактора. Имя декорируемой функции не имеет значения. Переименуйте если мешает
Какие могут быть нюансы если вместо: #Становимся в состояние ожидания ввода name @admin_router.message(StateFilter(None), F.text == "Добавить товар") сделать: #Становимся в состояние ожидания ввода name @admin_router.message( F.text == "Добавить товар") await state.clear() async def add_product(message: types.Message, state: FSMContext): await message.answer( "Введите название товара", reply_markup=types.ReplyKeyboardRemove() ) await state.set_state(AddProduct.name)
Здравствуйте! Как думаете можно ли написать таким образом? @admin_router.message(AddTrainer.full_name, F.text) async def add_trainers_name(message: Message, state: FSMContext): if not contains_alpha(message.text): await message.answer('В Ф.И.О содержаться недопустимые символы Введите заново') return await state.update_data(name=message.text) await message.answer('Введите номер телефона тренера', reply_markup=CANCEL_KB) await state.set_state(AddTrainer.phone_number) чтобы не писать дополнительный хендлер
По чесноку, то тяжеловато понять без контекста полной структуры самого бота и как лучше. Но могу дать общее резюме по поводу структуры хендлеров: Если хорошо работает и так удобно реализовать это - то все хорошо. В последствии переделать - это нормально, если оказалось, что этот вариант не валиден. Но выглядит вроде ничего
@@PythonHubStudio спасибо за ответ, бот работает нормально. У вас прям очень и очень хорошие видеоуроки! Советую всем своим знакомым которые начинают учить Python
Прекрасный разбор. Один из лучших русскоязычных авторов на платформе UA-cam! Кто смотрит - будете довольны.
Не выходные а фантастика! 😃✌🏻 Спасибо автор!
Точно, сегодня же воскресенье 😀 Хорошего вечера!!!
Как же я ждал этот видос 🎉
я уже не первый плейлист смотрю на этом канале, очень подробно и полезно, полноценные уроки. Уважаемый автор канала, ты делаешь очень полезное дело, от всего сердца благодарю и надеюсь, что будет еще много полезных уроков
Благодарю, очень приятно!
Огромное спасибо за урок! С нетерпением жду следующего!
Во, еще видос! Автор красава! Есть чем заняться в выходной день!))) Здоровья тебе! Лайк!
Вы делаете очень качественный контент! Спасибо вам большое за труд!
Спасибо! Качество кода и подача материала на высоте! Огромная просьба завернуть проект в докер перед началом использования базы. Надеюсь что моя просьба не увеличит интервал подачи материала. С нетерпением ждем продолжение )
Благодарю 👍.Давайте докер отложим на потом, чтоб не вмешивать не связанный с aiogram инструмент, в итак насыщенное следующее видео (middleware, sqlalchemy и тд).
@@PythonHubStudio ну вот, один неудачный комментарий и сломалась частота подачи материала. 4й день подходит к концу, а видео все еще нет (
Это не при чем)) с понедельника (скорее всего, максимум вторник) публикация продолжится
Лучший курс, который я видел в интернете. Огромное Спасибо🤛
Спасибо! Несколько раз пытался начать писать тг ботов но внятных уроков не попадалось. Ваши уроки 🔥
Многое для себя подметил, хотя уже писал ботов с FSM. Спасибо за ваши труды!
Ну это просто праздник какой-то! (с)
за обработку некорректных данных в определенном состоянии - отдельное спасибо!!! Это гениально и просто)
хочу сказать спасибо автору канала
Лучший контент. Спасибо.
Красавец! Спасибо!🤘
Спасибо большое ❤Вы лучший
Спасибо большое за этот замечательные курсы ! Понятно объясняете !!! 👍👍👍
Thank you very much. This is very good video
Привет! Очень полезный курс у Вас получился, спасибо!
Я час убил на то чтобы понять как работает функция go_back, хотел уже задать вопрос, но вдруг все понял. Конструкция цикла вскипетила мне мозг.:D
Однозначно отлично рассказываешь. Подписка, лайки под всеми видео.
Я только в этом уроке не мог понять почему у меня админ фильтр не работает. Дело в том, что я не скачиваю уроки твои, а сам набираю. Так лучше запоминается.
Неделю пытался понять. Поковырялся в коде. Я не обратил внимания, а ты не упомянул, что нужно в апп, добавить диспетчер dp.include_router(admin_router). Хотя в моменте, где ты говоришь о добавлениии май админ лист к боту, там на экране видо, что рорутер админ, добавлен. Если бы я скопировал урок, то ошибки бы не было. А так сам пропустил, и сам нашел))).
Т.к. я новичек (не яд), то долго не мог понять, пересмотрел этот ролик раз 30. Но зато сам разобрался и увидел, что сам роуртер не объявлен. ООООООООчень кайфонул когда решил проблему. Значит обучение идет). Спасибо.
Если у вас Бот выдает заголовки видаОплата, то вам нужно дописать в последней строке await message.answer(text.as_html(), parse_mode="HTML")
Спасибо за работу. автор ты лучший
Очень помогли, разобраться в основах aiogram, перехожу к след уроку😀
однозначно лайк! спасибо!
взял код из следующего видео и сработало
12:47
Пацаны, у кого не работает, добавьте в файл app следующие две строки:
from handlers.admin_private import admin_router
dp.include_router(admin_router)
Спасибо тебе добрый человек! Реально заработало
Думал, что клавиатуры трудны для понимания, но разобравшись с ними - теперь трудность в понимании возникает с FSMкой =) Надеюсь, что тоже при втором просмотре будет намного легче для понимания
Сделайте курс по FastAPI
Уважаемый автор, не дайте пропасть пятнице) давайте новый ролик)
Послезавтра(в понедельник), отдыхайте)
Извините, а реализация хранения FSM в БД 18:04 будет рассмотрена в дальнейших видео?
Великолепные уроки, спасибо большое! Почему, кстати, именно aiogram, а не pyrogram или telethon? Последние больше для пользовательских сессий подходят, или на них вообще не написать так легко бота?
Даже не знаю.., возможно потому что "на глаз" понравилась простота и логичность
Когда следующее видео? Жду с нетерпением!
Через пару дней, дела...
Лучший!!!!
Здравствуйте, я либо не понял, либо прослушал этот момент. Примерно когда начинается 18:00, у вас идет допустим
async def add_description......а снизу идет:
await message.answer("Введите стоимость товара") это идет у вас опечатка или так нужно делать? Заранее благодарю за ваше старание!
Приветствую тебя!
Посоветуй пожалуйста, что начать изучать для создания сайта, информационного портала с добавлением интерактивной картой? Нужно для реализации проекта, туристических маршрутов по вершинам Южного Урала/Кавказа. Сам работаю разработчиком 1С, но сайты никогда не разрабатывал
Подробности по проекту могу больше описать, если это требуется
Есть вопрос ,подскажите как так бысто импортировать , как на 22:32
Как можно сделать? Загрузка фото сразу несколько штук за раз
. и чтоб каждое фото сохранилось.
Просто супер!
28:00 У меня код вылетает. Ругается на admin_router.message(AddProduct.name, F.text). Не знаю из за чего. Бот просто не запускается теперь.
я по ошибке в классе addProduct сделал запятые после полей name и т.д.
Жду с нетерпением базу данных. ❤
7:04 В метод __call__ помимо message и bot что еще можно передать?
Если я правильно понимаю, то срабатывание этого метода происходит вообще где-то в глубине пакета aiogram (то есть не в коде, который мы написали, а в коде, который написали разработчики), несмотря на то, что мы даже явно не указали никаких экземпляров наших кастомных фильтров.
Соответственно там происходит вызов экземпляра класса и уже там при вызове передаются экземпляры класса types.Message и Bot. Так вот не понятно, помимо этих классов, в метод __call__ что еще можно передать? В самих пакетах aiogram не смог найти где этот вызов находится. И в документации тоже, вроде бы, не сказано, что можно передавать.
Можно взять любые данные которые передаются через словарь data из middleware (промежуточные слои). О middleware будет в следующих видео (которые уже есть)
Спасибо за подробный рассказ и обьяснения! А вопрос такой, у меня sinology дома, могу как то запустить бота, написаный по Вашим роликам? Направте на путь поиска информации, а если есть ответ-поделитесь
Здравствуй, подскажи пожалуйста какой курс стоит покупать по питону, что бы не кинули, есть ли у тебя проверенные варианты? к кому можно будет пойти для платного обучения.
дошел до 12:50 клавиатура админа не появляется
А если взять код с гитхаба работает? Если да, то у вас где-то ошибка/опечатка/чего-то не хватает.
@@PythonHubStudio оттуда все работает)))
Значит есть в чем поразбираться) Сделайте паузу, чтоб не было 'замыливания' взгляда.
@@PythonHubStudio Добрый день подскажите пожалуйста у меня ошибка "Import "common.restricted_words" could not be resolvedPylancereportMissingImports)"если я удаляю хэндлер с restricted_word то все работает
Закройте/откройте редактор заново, это просто pylance сбоит
Добрый день, не подскажите как сделать так чтобы при проверке почты, imaplib не отмечал письма как прочитанные?
Добрый день!
Большое спасибо за ваш труд, давно уже смотрю ваши видео))
Единственное, не разобрался как вы так быстро наведя на слово импортируете фильтры например и т.д. ? Точнее на видео это понятно как выглядит, но у меня такое не подсвечивается, чтобы он автоматически импортировал, а приходится руками всё время вбивать((
Это плагин для vscode - pylance, соответственно настроенный. На канале есть видео как так его настроить
Так понимаю, передача списка my_admin_list через бота, является не совсем верным способом передачи зависимостей. Лучше это делать через workflow_data.
Плюс все это обновление можно сделать динамическим, где при старте бота будет автоматически создаваться нужный список, и при добавлении/удалении админов этот список будет обновляться через получение апдейтов типа chat_member. А иначе совсем уж какой-то кривой велосипед получается, когда это все вручную нужно делать при каждом перезапуске бота и при каждом изменении списка админов.
А есть ли возможность работать как-то с календарем? имею в виду например выбрать доставку на какой-то день и время, как в примере?
Админская клава при добавлении товара постоянно отправляет ""Введите описание товара". Как исправить?
Проверить текст сообщений в хендлерах или фильтры, вообщем код. Если делали копипаст, то может глюк редактора
@@PythonHubStudioделал копи паст с гит хаба. Пайчарм перезапускал. Посмотрите пожалуйста почему название товара дает вводить, в как вводишь описание, то он повторяет сообщение "введите описание"
Здравствуйте! А что лучше использовать, MySQL или PSql
В рамках такого бота по "продаже" товаров
Я только начинаю свой путь в it, так что извините, если задал неразумный вопрос
Разницы не будет в работе. Но по psql больше распространение и примеров в сети если возникнут вопросы/проблемы и более знакома другим разработчикам если проект будет совместный с кем-то впоследствии.
@@PythonHubStudio, спасибо!😊
Спасибо за видео! А можно про вариант добавления админов в отдельный список подробнее? Условно есть супер админ, который дает другим админам доступ к боту, как он это будет делать? Прописывать id пользователя и сохранять в базу? Как ему узнать этот id, если он понятия не имеет как это сделать? Вообще как в бота добавить пользователя, не абы кого, а конкретного пользователя?
Как отличить админов поможет запрос к api get administrators (мы его делали в хендлере на команду /admin)(сделайте принт ответа чтоб посмотреть). Создатель бота вообще числится как owner/creator.
По id пользователя можно удобно раздавать права.
Это если более подробно чем в видео итак было показано
@@PythonHubStudio у меня сложность в том, что я не понимаю как добавить пользователя в бот. Допустим я написал бота и запустил его. Сейчас я один пользователь в нем, теперь я хочу добавить людей, которые этим ботом смогут пользоваться. Вариант прописать id нужных пользователей в настройках бота не подходит, их нужно добавлять через бот. Все ответы которые я смог найти свлядятся к тому, что пользователь регистрируется в боте самостоятельно, естественно тогда я его и username и id могу выцепить. А тут мне надо пользователя зарегистрировать в боте, только после этого он получит к нему доступ.
В конце 6го урока автор отдельным хэндлером ловит ошибку ввода пользователя, а не проще обернуть в try except и в except написать что что то пошло не так и выкинуть в начало его, так он не только неправильный ввод будет ловить, но и другие ошибки без помех работы бота. Я лично каждый хэндлер оборачиваю в try/except, иногда бывает долгий ответ от сервера и бот лег, а так отписал что то не так и работает дальше)
Не проще. Отдельный хендлер нужен для отлова отправки вместо текста - стикера или фото или ..., try except имеет смысл писать только внутри хендлера, и то, если через if elif не смогли предусмотреть варианты (как запасной вариант).
Здравствуйте, помогите пожалуйста. скопировал ваш год и бот не запускается и выдает ошибку
from common.restricted_words import restricted_words
ModuleNotFoundError: No module named 'common.restricted_words'
перепробовал все, в интернете нет ответа
Спасибо. Пожалуйста сделайте еще вк
Ваш способ защиты от неправильных данных в конце, не фильтрует защиту от отправки emoji вместо текста. Не подскажите как с ними быть?
И не должно, смайл это текст, который может быть в описании/названии. Можно, если нужно, сделать проверку строки на содержание емоджи через регулярные выражения или просто через проверку. Посмотрите как выглядит реальная строка emoji (сырая).
Здравствуйте. Большое спасибо за обзор и понятное объяснение FSM. Подскажите пожалуйста, как решается проблема, если пользователю надо загрузить не одно, а несколько фото? Если они объединяются в media group, то есть mediagrouphandler. А вот если пользователь вдруг решил их не группой отправить, а по отдельности. Вы сталкивались с такой задачкой? Рылся в гугле и на форумах. Честно.
Нет, я так не делал, но простое решение вроде есть, на первый взгляд. Просто не сразу меняйте Стейт на следующий, а сделайте общий хендлер, который ловит и это шаг и следующий (например на фото и текст), который ловит фото и что-то другое, что идёт следующим. И у вас получиться ловить любое количество фоток, а потом, когда он отправит , например текст, перейти к другим делам.
@@PythonHubStudio Спасибо за ответ. Я уже рассматривал такой вариант поведения, но после фото он сразу должен выдавать сообщение с вопросом про контактные данные (пользователь не должен ничего вводить). Можно сделать reply кнопку "Подтвердить ввод", но в моем контексте это не совсем верно. Радует то, что по умолчанию несколько фото группируются и пользователю надо снять галочку эту, чтобы получить не совсем адекватное поведение. Тоже думал, что все просто, а по факту голову уже сломал и ничего толкового, кроме как в сообщении написать пользователю, чтобы при отправке группы фоток эту галку оставлял, не пришло. )))
Последнее, на самом деле, очень верно, любое неадекватное поведение юзера предусмотреть невозможно, сразу предупредили текстом, и если что сделали кнопку назад и все.
@@PythonHubStudio Да, вы правы. Спасибо.
12:37
не знаю почему, но сообщение не удаляется, но при этом клавиатура в боте появляется исправно
Бот должен быть админом в группе
@@PythonHubStudio он и есть админ, да и доступ к удалению сообщений тоже у него есть
Значит проверьте свой хендлер для группы /admin. Не может быть, что у меня работает (код на гитхабе есть), а у вас просто так нет. Если делали копипаст, то может редактор не воспринял некоторые строки(такое бывает) - добавьте где нибудь рандомный print, чтоб текст заново прочитался, или перезагрузите редактор(закрыть/открыть). Как-то так...
Как же кайфово, когда какие-то неточности и баги ловишь и потом такой целый ищешь причину.
В общем из-за того, что диспеччер админки был размещен ниже диспечера приватки - у меня не реагировало в привате на /admin. Реально целый день потратил, на то, что бы это определить.
dp = Dispatcher()
dp.include_router(admin_router)
dp.include_router(user_private_router)
dp.include_router(user_group_router)
Добрый день Автор! Все хорошо у тебя? Чет пропал ...
можешь в следующем уроке объяснить как сделать жирный шрифт конкретно в кнопке пожалуйста? хтмл, маркдаун парс там не работает(
пните если ответит
А так вообще можно...?
@@PythonHubStudio да, возможно. в некоторых ботах замечаю такое
Огромное спасибо за урок.
Можете ли сделать урок как создать опрос в группе при помощи бота? Спасибо
Был же пример в теме про кнопки(там где request poll), или что-то другое?
Спасибо вам большое, а будет видео про дискорд бота?
Можно, это не сложно сделать(обновить существующий уже плейлист на канале по discord боту, там ничего существенного не изменилось, по сравнению с телеграм), но такой запрос поступил только один раз - от Вас!
Здравствуйте,как запустить отдельно один урок чтобы проверить что поучилось?
Как отдельный проект. Суть та же. И бд под него можно отдельную также сделать . На одной бд для всех вариантов могут быть проблемы в совместимости бд по таблицам
Как сделать, если допустим имеется несколько магазинов и у каждого свой ассортимент (пиццы, пироги, пироженные, торты и т. д) как добавить список магазинов в виде инлайн клавиатуры и уже проваливаясь в магазин работать с ассортиментом, далее с названиями?
Или другой пример, список объектов, на объектах есть оборудование (разного назначения, количества и с разными характеристиками). В боте инлайн клавиатура со списком объектов, проваливаемся в объект, получаем инлайн клавиатуру список оборудования по типу, проваливаемся далее, получаем названия, характеристики, количество, фото...
Вы сильно круто берете, как для начинающего разрабатывать ботов. Тут могу ответить так: делить базы данных по id (и это не значит в прямом смысле id в телеграмме) клиента (заказчика).
как добавить боту кастомные emoji из премиумам?
Спасибо за видео! Подскажите как сделать рассылку?
Если группы нет, то ведите базу данных пользователей бота и каждому отправляйте сообщение по id пользователя взятому из бд.
@PythonHubStudio когда уже новый видос неделя прошла((( каждый день жду уже не могу
Код 7го урока на гитхабе уже есть, после монтажа завтра публикация
Атрибут bot.my_admins_list случайно не в оперативной памяти хранит список? Если это так, значит после перезапуска бота нужно будет каждый раз в ручную тянуть командой в группе заново список, верно?
Правильно
@@PythonHubStudio Хочу выразить вам благодарность за отличный контент и что активно общаетесь с аудиторией) Жду ваши видео как любимый сериал)
Добрый вечер, благодарен за ваши видео они очень крутые. У меня возникла проблема на этапе написания команды /admin в группу, не вылезает клавиатура как у вас в видео. Был бы рад если бы подсказали как решить.
Просмотрите разницу между исходником на гитхабе или ошибку сюда напишите
@@PythonHubStudio сравнил свой код с исходником, вроде нет различий. Не вылезает никакой ошибки, просто бот не отправляет клавиатуру.
Может быть проблема в телеграме? Боту нужно давать админку в группе?
@@PythonHubStudio нашел ошибку, спасибо за помощь. У вас классный канал.
@@zhanybekov9616Здравствуйте. Точно такая же проблема. Подскажите пожалуйста как исправили её
Продолжение будет?)))
Скорее всего в понедельник, дела...
у меня работают команды назад только если их писать вместе с "/". Что делать??
Просмотрите фильтры в вашем обработчике
спасибо!
Здравствуйте, сталкивался кто с такой проблемой(from common.restricted_world import restricted_world ) ошибка (Доступ к "restricted_world" не осуществляется Pylance) и много где такое бывает, как можно это исправить?Автору огромное спасибо!Лучший!
Проект открыт в редакторе нормально или на папку выше в которой все проекты?
@@PythonHubStudio проект открыт нормально,все проверил,вы сказали, что скопируйте код... скопировал и в хендлерах вылазит что то подобное.
Например "from sqlalchemy.ext.asyncio import AsyncSession"
(Unable to import'sqlalchemy.ext.asyncio'PylintE0401:import-error
Не удается разрешить импорт "sqlalchemy.ext.asyncio" Pylance(reportMissingImports)
Весь интеренет перерыл, ничего не нашел на данную проблему
Здравствуйте, у меня с самого начала уже вопросы, у меня Pycharm, в папке filter файл chat_types, у меня где my_admin_list не работает (ошибку показывает), хотя весь код скопировал с гита, но все равно показывает ошибку + для каждой папки создал __init__.py и прописал туда все импорты, но все равно не помогло, можете сказать в чем моя ошибка? 😢
Наверно у вас в редакторе проект открыт на папку выше чем положено (должна быть открыта папка, где файл app.py). Или можно в окне папок и файлов проекта(експлорере), тыкнуть ПКМ, по ней, и выбрать "пометить как папка проекта")
скорее всего ты забыл включить роутер в главный файл апп пу, пропиши эту команду "dp.include_router(admin_router)"
@@kifurrer От души тебе!❤❤❤❤❤
когда следующий урок?
Добрый день!
Как быть если в личных сообщениях с ботом обычным пользователям (не администраторам) тоже необходимо использовать команду "/admin". Если я пропишу обработчик для этой команды в @user_private_router, то этот роутер будет перехватывать сообщения и от администраторов и отрабатывать как общий хендлер. Очевидный вариант: в диспчер включать роутер администратора первым, а потом уже роутер обычных пользователей, но вариант не очень красивый, как можно сделать лучше? Заранее спасибо!
1) ваш вариант хорош
2) изменить имя команды и не париться (или для админа или для пользователей)
Уважаемый автор! Благодарю Вас за качественный материал, не останавливайтесь)
И есть у меня к Вам вопрос: При запуске бота, в терминал выдает предупреждение. Как переписать код в данном боте? Также работаю в PyCharm MacOS, остановился на создании BD. Все необходимые библиотеки инсталлировались после 20.03.2024. Заранее благодарю за ответы
DeprecationWarning: Passing `parse_mode`, `disable_web_page_preview` or `protect_content` to Bot initializer is deprecated. This arguments will be removed in 3.5.0 version
Use `default=DefaultBotProperties(...)` instead.
bot = Bot(token=os.getenv('TOKEN'), parse_mode=ParseMode.HTML)
Это просто предупреждение о том что, в версии 3.5 aiogram-a будет перемещение способа указания parse mode.
если прям сильно напрягает это предупреждение, то можно заменить на
bot = Bot(token=os.getenv('TOKEN'), default=DefaultBotProperties(parse_mode=ParseMode.HTML))
у меня на версии 3.4.1 с такой строкой всё работает.
Уже все перепробовал не видит my_admins_list
Не знаю что делать уже скопировал репозитории полностью все равно не видит
Привет! Обращаюсь к вам так как зашёл в тупик.
В кратце я создал два экземпляра бота, и проблема в том что команды пересекаются между ними (роутерами)
Какой сделать фильтр? У меня идея была сделать фильтр на имя роутера, но к сожалению дало ошибку(
Одни роутеры вешайте на одного бота, а другие на другого, в этом то и суть - разделить
@@PythonHubStudio та уже решил) Вопрос был в том, как сделать кастомный фильтр, и додумался сделать фильтр на сам экземляр бота и всё сработало как надо
Я просто не знал, что у message есть свойство bot
Вот такой фильтр у меня получился
class ChatBotFilter(Filter):
def __init__(self, bot: Bot) -> None:
self.bot = bot
async def __call__(self, message: types.Message) -> bool:
return message.bot == self.bot
@@PythonHubStudio но у меня появилась другая проблема, как между роутерами передавать переменные? может знаете
Здравствуйте как связаться с вами?
мне нужно инлайн бот телеграм
Уже только что связались... Заказы не принимаю
Понятно 😐
Спасибо за классный туториал!
Но почему бы кнопки не сделать с помощью словаря, а вместо else if , использовать math case. Я не учу ни кого , я просто предложил😅
См. дальше
@@PythonHubStudio щас два дня на работе буду, поэтому хотелось бы спойлер
Match case не будет, чтоб сохранить совместимость с более ранними версиями python. Кнопки из словарей будут
@@PythonHubStudio имеет смысл такому быть
@@PythonHubStudio 👍👍👍
У меня не работает админка почему то(
Интересно ваше мнение. В коде обработчиков FSM есть ли мотивация писать в порядке
await message.answer ("Введите название") #говорим что хотим от человека
await state.set_state(AddProduct.name) #переходим к ожиданию ввода
Вместо - сначала установки состояния, а затем отправки сообщения типа "Введите название"?
await state.set_state(AddProduct.name) #переходим к ожиданию ввода
await message.answer ("Введите название") #говорим что хотим от человека
Без разницы
Всем привет. В файле reply.py такая строка:
sizes: tuple[int] = (2,),
При ней у меня лезет ошибка:
TypeError: 'type' object is not subscriptable
Исправил на:
sizes: tuple = (2,),
все заработало.
Вопросы:
У всех, кто в восторге, какая строка работает?
Если первая - почему у меня нет?
Если сами исправили - почему не отписали?
А курс реально крутой.
Потому что у тебя версия питона 3.8, либо ещё ниже
@@denimani8990 Спасибо. Точно - 3.8. "О сколько нам открытий чудных. Готовят..."
Здравствуйте, видео урок очень полезный, но хотел сказать что у вас запись подлагивает
Хехехе, у меня пока диалог из 38 пунктов) Вот такой вот бот
Подскажите, может, кто шарит?
Как в vs code изменить тему, но оставить дефолтную подсветку текста?
Был бы очень благодарен за помощь.
Ролик - огонь!
Здравствуйте. Очень сильно помогли ваши видео. Уже много ветвлений в коде и стал вопрос, как их фильтровать. Попробовал по аналогии собрать свой фильтр, который смотрел бы в базу, но он не работает...
class IsAdmin(Filter):
async def __call__(self, session: AsyncSession, message: types.Message) -> bool:
admins = []
for a in await orm_get_admins(session):
admins.append(a.admin)
return message.from_user.id in admins
TypeError: IsAdmin.__call__() got multiple values for argument 'session'
Язык знаю плохо, точнее почти не знаю. Позскажите плз, что я делаю не так? И как лучше сделать?
Именно об этом (о сессиях бд) рассказано в следующем видео. Там используются middleware (промежуточные) слои.
Так запросы к базе, по отдельности, у меня все работают, а вот в фильтре, ошибку выдаёт.
Про мидлваре смотрел, но не совсем понятно что там и для чего.
Очень нравиться ваш контент!!
Возник вопрос:
Как я могу скачать файл (в моем случае это .doc), который был отправлен моему боту пользователем?
В документации нашел только await bot.download(document)
Но как только я импортирую в файл user_private.py этого bot с файла app.py, то возникают ошибки
я пытался переставлять импорты в файлах,в итоге я переставил from app import bot прямо перед строчкой await bot.download(document),но в этот раз другая ошибка RuntimeError: Router is already attached to
Я понимаю,что ошибка заключается в том,что что-то вызывается несколько раз(а должно 1 раз)
Если сможете помочь буду очень благодарен!!!
*структура папок такая же как у вас на видео
Видимо пропустили, я говорил, что если нужен экземпляр бота в хендлере, то всего лишь нужно добавить соответствующий параметр в ваш хендлер, он туда прокинется aiogram-ом сам:
(message: types.Message, bot: Bot)
И юзайте вашего бота в хендлере как захочется. А для аннотации типа параметра bot: Bot, нужно просто добавить импорт экземпляра класса Bot, чтоб видеть его методы в автокомплите:
from aiogram import Bot
Благодарю за ответ!!!@@PythonHubStudio
+
очень крутая реализация перехода на предыдущее состояние стейта трек тайм 34:50 . с начала не въехал а потом как въехал)))))))))))))))))) previous обновляется после каждой итерации , хитроумный алгоритм
огромное вам спасибо.
Я всё ждал, оценит кто-то лайфхак или нет)))
await message.answer(f"Шаг назад
{AddProduct.texts[previous.state]}")
AttributeError: 'NoneType' object has no attribute 'state'. И я его понимаю. Как мы можем что то сюда передать если у нас previous на данный момент типа None.
Объясните пожалуйста момент 26:48, как преобразовать словарик в отдельный элемент, мне там число надо вводить, а я хочу получить не как {'number': '3'}, а как 3, что в этом случае делать
У меня получилось так, это работает, но так не удобно писать:
@user_private_router.message(Games.data_input, F.text)
async def add_data_output(message: types.Message, state: FSMContext):
await state.update_data(data_input=message.text)
random_number = random.randint(1, 2)
data = await state.get_data()
# await message.answer(str(data))
if data == {'data_input': f'{random_number}'}:
await message.answer('Вы угадали')
else:
await message.answer("Вы не угадали :(")
await message.answer(f"Было загадано число {random_number}")
await state.clear()
if data["data_input"] == r_n:
@@PythonHubStudio спасибо, работает!
День добрый! Помогите разобраться с проблемой. В модуле chat_types в классе IsAdmin, bot не видит my_admins_list, я прописал его в модуле app, попытался импортировать саму переменную bot из app, но код не запускается, а в самом классе Is Admin, bot.my_admins_list он его не видит. Импорты не помогают
Проверьте на опечатки в свойстве my_admins_list, и там и там
@@PythonHubStudio проверил и даже с вашего гита качнул код, не получается. В модуле chat_types в классе IsAdmin, он my_admins_list просто не видит, подкрашивается серым. Если импорт делать, то там то же ошибка ( ImportError: cannot import name 'user_private_router' from partially initialized module )
@@PythonHubStudio все, разобрался ) там, внизу коментов есть ответ )
@@genylivnev7822 не подскажешь где? Найти не могу
Приветствую, админа, у меня проблема с админ панелью, когда запускаю бота /admin не работает, бот вообще не заходит в handler с командой /админ и пропускает через обычный handler с фильтром F.text, подскажите как решить эту проблему. Единственная ошибка которую выдаёт ide, в файле chat_types не работает обращение к списку админов bot.my_amins_list , что делать?
1) Опечатка не my_amins_list, a my_admins_list
2) Сверьтесь с кодом на гитхабе. В любом случае опечатка где-то
@@PythonHubStudioпришел к тому что он не заходил в handler admin из-за того что был F.text() поменял местами вызов в app.py, но чтобы бот сам определил админа так и не допер, в итоге вбил напрямую свой id
await state.reset_state()
И еще не совсем понятно как на видео отработал код
#Хендлер для отлова некорректного ввода для состояния
если среда ругается, что функция уже определена:
#Ловим данные для состояние price и потом меняем состояние на image
@admin_router.message(AddProduct.price, F.text)
async def add_price
#Хендлер для отлова некорректных ввода для состояния price
@admin_router.message(AddProduct.price)
async def add_price(message: types.Message, state: FSMContext):
\\ Получим ошибку function already defined
Отработал нормально, как видно на видео. Это предупреждение линтера вашего редактора. Имя декорируемой функции не имеет значения.
Переименуйте если мешает
Какие могут быть нюансы если вместо:
#Становимся в состояние ожидания ввода name
@admin_router.message(StateFilter(None), F.text == "Добавить товар")
сделать:
#Становимся в состояние ожидания ввода name
@admin_router.message( F.text == "Добавить товар")
await state.clear()
async def add_product(message: types.Message, state: FSMContext):
await message.answer(
"Введите название товара", reply_markup=types.ReplyKeyboardRemove()
)
await state.set_state(AddProduct.name)
И так тоже можно, без проблем
Здравствуйте! Как думаете можно ли написать таким образом?
@admin_router.message(AddTrainer.full_name, F.text)
async def add_trainers_name(message: Message, state: FSMContext):
if not contains_alpha(message.text):
await message.answer('В Ф.И.О содержаться недопустимые символы
Введите заново')
return
await state.update_data(name=message.text)
await message.answer('Введите номер телефона тренера', reply_markup=CANCEL_KB)
await state.set_state(AddTrainer.phone_number)
чтобы не писать дополнительный хендлер
По чесноку, то тяжеловато понять без контекста полной структуры самого бота и как лучше. Но могу дать общее резюме по поводу структуры хендлеров: Если хорошо работает и так удобно реализовать это - то все хорошо. В последствии переделать - это нормально, если оказалось, что этот вариант не валиден. Но выглядит вроде ничего
@@PythonHubStudio спасибо за ответ, бот работает нормально. У вас прям очень и очень хорошие видеоуроки! Советую всем своим знакомым которые начинают учить Python