GithubHelp home page GithubHelp logo

mastergroosha / aiogram-3-guide Goto Github PK

View Code? Open in Web Editor NEW
845.0 18.0 132.0 7.76 MB

Пишем Telegram-ботов с aiogram 3.x

Home Page: https://mastergroosha.github.io/aiogram-3-guide/

License: MIT License

HTML 5.76% Python 91.50% Fluent 2.74%
aiogram telegram-bot-api

aiogram-3-guide's Introduction

Пишем Telegram-ботов c aiogram 3.x

Перед вами книга по разработке Telegram-ботов на языке Python с использованием фреймворка aiogram 3.x.

Ознакомиться с книгой можно здесь: https://mastergroosha.github.io/aiogram-3-guide/
Исходные тексты ко всем главам расположены в папке code.

Предыдущие версии:

Книга собрана с помощью mkdocs-material.

aiogram-3-guide's People

Contributors

alberteinsteintg avatar alertred avatar artloop avatar astradinati avatar heyslava avatar mastergroosha avatar nie1ix avatar olegt0rr avatar ordosp avatar sia86 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

aiogram-3-guide's Issues

Некоторые элементы кода несовместимы с версией aiogram 3.0.0b5

Приведу примеры из вашего кода и мои исправления для актуальной версии 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().
Это пока несколько примеров, которые я нашел

Localization for this tutorial

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.

Возможно ошибка в примере

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> и будет ошибка

Проверить корректность добавления инлайн клавиатуры ".add" для версий >7

фрагмент кода
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

Ошибка в исходном коде для Quickstart

В файле bot.py используется await message.answer() на команду /test1 когда в гайде указано await message.reply()

Заметил при переводе главы ещё вчера, но руки до создания Issue дошли только сейчас.

Пишем Telegram-ботов с aiogram 3.x, глава - Знакомство с aiogram.

Добрый день !
Код из файла 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()

Передача именнованых аргументов через Dispatcher()

См. Передача доп. параметров

Передавать именованные аргументы можно не только в start_polling(...), но также и через экземпляр диспетчера. Так может быть даже лучше, поскольку это более универсальный вариант для разных способов запуска бота (например через вебхуки)

MVC

Привет еще раз, я новенький в вашем ремесле ))
Самый главный вопрос как у меня так и у подавляющего большинства это MVC
Как бы ты разбил обычную скажем команду /start на паттерн MVC?
Что в model ? controller? view?

Нерабочий фильтр в примере.

Глава "Фильтры и мидлвари", пункт "Примеры мидлварей".

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". Иначе обработчик не срабатывает при нажатии на кнопку.

Callback handler в food.py

А как зарегистрировать 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"))

...не работает.

Код не работает

Не работает код учебника в части про конечные автоматы

ошибки:

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'

и т д

Скачать фото используя Router

Что в оф. документации что в вашей книге, к сожалению не сказано как можно скачать фото, используя различные маршруты. Фото можно скачать только через объект Bot, но если его импортировать в файл с отдельным маршрутом, тогда получается что идет циклический импорт, так как этот файл уже импортирован dp.include_routers().
а объекты Message и PhotoSize не имеют метода download или get_file. Во второй версии aiogram это было проще.

Ошибка в тексте

кек
image
Выше должен просить заголовок, а он 2 раза просит описание.

Обратится к методам бота из хендлера

Извените за нубство, некак не пойму, как обратится к методам 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: Отличный туторриаль 👍

Колбэки не работают

Здравствуйте,
При попытке повторить материал "книги" столкнулся с тем, что кнопки с callback_data после нажатия ничего не делают :(
Проверка своего кода не привела к результату, поэтому скачал Ваш. Но проблема не пропала, все работает корректно, кроме callback_data. В логе никаких ошибок нет :(
Подскажите пожалуйста, это я что то делаю не так или причина в чем то другом?

TypeError: ChatTypeFilter() takes no arguments.

Глава "Фильтры и мидлвари", версия 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

Добавить в главу про кнопки текст про инлайн-режим

Надо как-то уточнить, что при нажатии кнопки на сообщении, которое было отправлено из инлайн-режима, ситуация сложнее: нет объекта сообщени, т.е. непонятно, как редактировать текст, не зная оригинал.

https://mastergroosha.github.io/aiogram-3-guide/buttons/

Обновить информацию по magic filter

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")

Pydantic class Config is deprecated

aiogram использует pydantic>=2.1.1,<3; в документации pydantic сказано, что class Config устарел:
Before v2.0, the Config class was used. This is still supported, but deprecated. [docs]

class Config:
# Имя файла, откуда будут прочитаны данные
# (относительно текущей рабочей директории)
env_file = '.env'
# Кодировка читаемого файла
env_file_encoding = 'utf-8'

Надо использовать: [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

Проблема с роутерами

@MasterGroosha Мастер Груша, прости за очередное беспокойство! Я просто не понимаю, что не так в моем коде. Бот полностью игнорирует все сообщения.
https://github.com/Dev-Cored/life-author-telegram-bot Вот ссылка на реп. Пытался повторить структуру файлов как в главе с роутерами, но просто нет реакции на сообщения. Просто пишет про игнорирование команды...

Originally posted by @Dev-Cored in #91 (comment)

Не работающий код

В текущих версиях aiogram код из примеров не работает. В версии 3.0.0b3 и выше добавлены фильтры для декораторов.
Было:

@dp.message(commands=["start"])

Стало:

@dp.message(Command(commands=["start"]))

Вопрос по aiogram

Привет, Груша! Прости за глупый вопрос, но я не нашел в твоей книге про то, как сделать, чтобы после сообщения бот ждал от пользователя ответ набранный с клавиатуры как сообщение. И чтобы затем можно было это сообщение обработать. Пошарился по этому вопросу в интернете, все ответы на эту тему кардинально отличаются друг от друга и ничего не работает. Было бы очень приятно, если бы ты немного дополнил свою наикрутейшую, без преувеличений, книгу! Спасибо заранее))

Ссылка ведет на некорректный адрес

Ссылка "Для aiogram 3.x эта глава расположена здесь" со страницы https://mastergroosha.github.io/aiogram-2-guide/inline_mode/ гайда инлайн режима по aiogram 2 ведет на некорректную страницу.

Ошибка в том что в 3 версии inline-mode пишется через нижнее тире, а во 2 inline_mode через нижнее подчеркивание.

2024-03-02.20-29-53.mp4

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.