mastergroosha / aiogram-3-guide Goto Github PK
View Code? Open in Web Editor NEWПишем Telegram-ботов с aiogram 3.x
Home Page: https://mastergroosha.github.io/aiogram-3-guide/
License: MIT License
Пишем Telegram-ботов с aiogram 3.x
Home Page: https://mastergroosha.github.io/aiogram-3-guide/
License: MIT License
Приведу примеры из вашего кода и мои исправления для актуальной версии 3.0.0b5:
Ваш код:
# Хэндлер на команду
@dp.message(commands=["start"])
async def cmd_start(message: types.Message):
Исправление:
@dp.message(Command(commands=["start"]))
Дальше везде параметр commands=["start"]
используем из класса Command.
Дальше на этой странице приводится такой код:
@dp.message(content_types="text")
async def echo_with_time(message: types.Message):
Как я понял в данном случае не обязательно передавать параметры content_types=
в функцию message
:
Вместо этого просто используйте @dp.message()
.
Это пока несколько примеров, которые я нашел
В файле bot.py используется await message.answer() на команду /test1 когда в гайде указано await message.reply()
Заметил при переводе главы ещё вчера, но руки до создания Issue дошли только сейчас.
В текущих версиях aiogram код из примеров не работает. В версии 3.0.0b3 и выше добавлены фильтры для декораторов.
Было:
@dp.message(commands=["start"])
Стало:
@dp.message(Command(commands=["start"]))
Привет, Груша! Прости за глупый вопрос, но я не нашел в твоей книге про то, как сделать, чтобы после сообщения бот ждал от пользователя ответ набранный с клавиатуры как сообщение. И чтобы затем можно было это сообщение обработать. Пошарился по этому вопросу в интернете, все ответы на эту тему кардинально отличаются друг от друга и ничего не работает. Было бы очень приятно, если бы ты немного дополнил свою наикрутейшую, без преувеличений, книгу! Спасибо заранее))
Здравствуйте,
При попытке повторить материал "книги" столкнулся с тем, что кнопки с callback_data после нажатия ничего не делают :(
Проверка своего кода не привела к результату, поэтому скачал Ваш. Но проблема не пропала, все работает корректно, кроме callback_data. В логе никаких ошибок нет :(
Подскажите пожалуйста, это я что то делаю не так или причина в чем то другом?
aiogram-3-guide/book_src/quickstart.md
Line 71 in 440cdad
Сейчас используется версия 3.0.0rc1 вместо 3.0.0b7. Но в то же время уже вышла версия 3.0.0rc2. 🤓
В разделе "Особые апдейты" https://mastergroosha.github.io/aiogram-3-guide/special-updates/ , в блоке "Добавление в группу"
в функции "bot_added_as_member" отсутствует аргумент bot, который потом вызывается в ней же.
Извените за нубство, некак не пойму, как обратится к методам aiogram.Bot из функций хендлеров
Например в handlers/common.py
async def cmd_start(message: types.Message):
await message.answer(
"Выберите, что хотите заказать: напитки (/drinks) или блюда (/food).",
reply_markup=types.ReplyKeyboardRemove()
)
def register_handlers_common(dp: Dispatcher):
dp.register_message_handler(cmd_start, commands="start")
Как здесь вызвать метод bot.get_chat_member ?
или какой есть путь, чтобы выполнять данный метод при срабатывании хендлера?
PS: Отличный туторриаль 👍
aiogram использует pydantic>=2.1.1,<3; в документации pydantic сказано, что class Config устарел:
Before v2.0, the Config class was used. This is still supported, but deprecated.
[docs]
aiogram-3-guide/book_src/quickstart.md
Lines 273 to 278 in 9919c10
Надо использовать: [docs]
from pydantic_settings import BaseSettings, SettingsConfigDict
from pydantic import SecretStr
class Settings(BaseSettings):
model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8')
bot_token: SecretStr
Глава "Особые апдейты", пункт "Добавление в группу".
handlers/bot_in_group.py
...
from aiogram.dispatcher.filters.chat_member_updated import ...
...
заменить на
...
from aiogram.filters.chat_member_updated import ...
...
Глава "Фильтры и мидлвари", версия aiogram — 3.0.0b7.
Ошибка:
Traceback (most recent call last):
File "bot.py", line 6, in
from handlers import group_games
File "...\handlers\group_games.py", line 10, in
ChatTypeFilter(chat_type=["group", "supergroup"])
TypeError: ChatTypeFilter() takes no arguments
Сработал данный вариант:
class ChatTypeFilter(Filter):
def __init__(self, chat_type: Union[str, list]) -> None:
self.chat_type = chat_type
async def __call__(self, message: Message) -> bool:
if isinstance(self.chat_type, str):
return message.chat.type == self.chat_type
else:
return message.chat.type in self.chat_type
Передавать именованные аргументы можно не только в start_polling(...), но также и через экземпляр диспетчера. Так может быть даже лучше, поскольку это более универсальный вариант для разных способов запуска бота (например через вебхуки)
aiogram-3-guide/book_src/buttons.md
Line 40 in fc3a7c5
При переводе заметил что тут происходит ссылка на https://t.me/aiogram_ru
, но на текущий момент данной группы уже не существует и следует использовать https://t.me/aiogram_pcr/1/{ID Сообщения}
Привет еще раз, я новенький в вашем ремесле ))
Самый главный вопрос как у меня так и у подавляющего большинства это MVC
Как бы ты разбил обычную скажем команду /start на паттерн MVC?
Что в model ? controller? view?
Не работает код учебника в части про конечные автоматы
ошибки:
ImportError: cannot import name 'Router' from 'aiogram' (/home/runner/Bot-Kursach/venv/lib/python3.8/site-packages/aiogram/init.py)
ImportError: cannot import name 'F' from 'aiogram' (/home/runner/Bot-Kursach/venv/lib/python3.8/site-packages/aiogram/init.py)
ModuleNotFoundError: No module named 'aiogram.dispatcher.filters.command'
и т д
aiogram = "3.0.0b6"
Код:
# новый импорт!
from datetime import datetime
@dp.message(content_types="text")
async def echo_with_time(message: types.Message):
# Получаем текущее время в часовом поясе ПК
time_now = datetime.now().strftime('%H:%M')
# Создаём подчёркнутый текст
added_text = html.underline(f"Создано в {time_now}")
# Отправляем новое сообщение с добавленным текстом
await message.answer(f"{message.text}\n\n{added_text}", parse_mode="HTML")
Возможно тут имелось:
await message.answer(f"{html.quote(message.text)}\n\n{added_text}", parse_mode="HTML")
Тк юзер может написать <cat>
и будет ошибка
@MasterGroosha Мастер Груша, прости за очередное беспокойство! Я просто не понимаю, что не так в моем коде. Бот полностью игнорирует все сообщения.
https://github.com/Dev-Cored/life-author-telegram-bot Вот ссылка на реп. Пытался повторить структуру файлов как в главе с роутерами, но просто нет реакции на сообщения. Просто пишет про игнорирование команды...
Originally posted by @Dev-Cored in #91 (comment)
https://github.com/MasterGroosha/aiogram-3-guide/blob/master/book_src/fsm.md line:313
@router.message(Command(commands=["cancel"]))
@router.message(Text(text="отмена", text_ignore_case=True))
заменить на
@router.message(Command(commands=["cancel"]))
@router.message(Text(text="отмена", ignore_case=True))
https://mastergroosha.github.io/aiogram-3-guide/fsm/#define-states
keyboards/simple_row.py
Не работает следующий импорт:
from aiogram.utils.keyboard import ReplyKeyboardMarkup, KeyboardButton
Работает:
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton
В главе про конечные автоматы в примерах везде aiogram.dispatcher.fsm вместо aiogram.fsm
Aiogram very popular bot framework on python and it use in many country for create bot. Bot developers often use this tutorial and it is useful for them. But this guide is only in Russian. I suggest you localize this guide. This tutorial is published in mkdocs material and it supports many languages.
Добрый день !
Код из файла config_reader.py может выдавать ошибку -
pydantic_core._pydantic_core.ValidationError: 1 validation error for Settings
bot_token
Field required [type=missing, input_value={}, input_type=dict]
чтобы все работало нужно дописать в файл config_reader.py следующие строки
from dotenv import load_dotenv
load_dotenv()
фрагмент кода
def get_keyboard_fab():
buttons = [
types.InlineKeyboardButton(text="-1", callback_data=callback_numbers.new(action="decr")),
types.InlineKeyboardButton(text="+1", callback_data=callback_numbers.new(action="incr")),
types.InlineKeyboardButton(text="Подтвердить", callback_data=callback_numbers.new(action="finish"))
]
keyboard = types.InlineKeyboardMarkup(row_width=2)
*keyboard.add(buttons)
return keyboard
ссылка на статью https://mastergroosha.github.io/aiogram-2-guide/buttons/#callback-factory
Глава "Фильтры и мидлвари", пункт "Примеры мидлварей".
handlers/checkin.py
@router.callback_query(F.text == "confirm")
async def checkin_confirm(callback: CallbackQuery):
await callback.answer(
"Спасибо, подтверждено!",
show_alert=True
)
Заменить F.text == "confirm"
на F.data == "confirm"
. Иначе обработчик не срабатывает при нажатии на кнопку.
В aiogram 3.2 добавлена поддержка Сцен: https://docs.aiogram.dev/en/latest/dispatcher/finite_state_machine/scene.html#scenes
А как зарегистрировать dp.callback_query_handler() в food.py ?
Пытался сделать так:
async def any_func(call: types.CallbackQuery, message: types.Message):
await message.answer("callback for " + call.data)
def register_handlers_food(dp: Dispatcher):
dp.register_message_handler(food_start, commands="food", state="*")
dp.register_message_handler(food_chosen, state=OrderFood.waiting_for_food_name)
dp.register_message_handler(food_size_chosen, state=OrderFood.waiting_for_food_size)
#Вот тут добавил хендлер
dp.callback_query_handler(lambda c: c.data.startswith("something"))
...не работает.
Ссылка "Для aiogram 3.x эта глава расположена здесь" со страницы https://mastergroosha.github.io/aiogram-2-guide/inline_mode/ гайда инлайн режима по aiogram 2 ведет на некорректную страницу.
Ошибка в том что в 3 версии inline-mode пишется через нижнее тире, а во 2 inline_mode через нижнее подчеркивание.
aka t.me/bot?start=, возможно про tg://user
Помимо указания объектов типа State, можно использовать StateFilter или default_state
(https://github.com/aiogram/aiogram/blob/dev-3.x/aiogram/fsm/state.py#L149-L150)
Что в оф. документации что в вашей книге, к сожалению не сказано как можно скачать фото, используя различные маршруты. Фото можно скачать только через объект Bot, но если его импортировать в файл с отдельным маршрутом, тогда получается что идет циклический импорт, так как этот файл уже импортирован dp.include_routers().
а объекты Message и PhotoSize не имеют метода download или get_file. Во второй версии aiogram это было проще.
Можно рассказать про content_types.ANY, про встроенный эскейпинг HTML и Markdown
https://mastergroosha.github.io/telegram-tutorial-2/lesson_02/
Надо как-то уточнить, что при нажатии кнопки на сообщении, которое было отправлено из инлайн-режима, ситуация сложнее: нет объекта сообщени, т.е. непонятно, как редактировать текст, не зная оригинал.
from aiogram.enums import MessageEntityType
Этот фильтр сработает, если хотя бы один entity будет e-mail:
@router.message(F.entities[...].type == MessageEntityType.EMAIL)
async def any_emails(message: Message):
await message.answer("At least one email!")
Этот фильтр сработает, если ВСЕ entity будут e-mail:
@router.message(F.entities[:].type == MessageEntityType.EMAIL)
async def all_emails(message: Message):
await message.answer("All entities are emails")
Плюс рассмотреть вариант с F.entities.extract(F.type == MessageEntityType.EMAIL).as_("emails")
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.