В этом видеоуроке мы погрузимся в мир создания ботов на Aiogram и научимся использовать встроенные фильтры, а также создавать свои кастомные фильтры. Вы узнаете, как обучить бота, чтобы он отвечал на сообщения пользователей в зависимости от принятого контента, что поможет сделать его ответы более персонализированными и полезными. Не пропустите возможность улучшить свои навыки создания ботов и узнать все тонкости работы с фильтрами в Aiogram!
Жмите на Play и начинайте прямо сейчас.
Исходный код к уроку
filters/iscontact.py
from aiogram.filters import BaseFilter
from aiogram.types import Message
class IsTrueContact(BaseFilter):
async def __call__(self, message: Message):
if message.contact.user_id == message.from_user.id:
return {'phone': message.contact.phone_number}
else:
return Falsehandlers/basic.py
from aiogram import Bot
from aiogram.types import Message
import json
async def get_start(message: Message, bot: Bot):
await bot.send_message(message.from_user.id, f'<b>Привет {message.from_user.first_name}. Рад тебя видеть!</b>')
await message.answer(f'<s>Привет {message.from_user.first_name}. Рад тебя видеть!</s>')
await message.reply(f'<tg-spoiler>Привет {message.from_user.first_name}. Рад тебя видеть!</tg-spoiler>')
async def get_photo(message: Message, bot: Bot):
await message.answer(f'Отлично. Ты отправил картинку, я сохраню ее себе.')
file = await bot.get_file(message.photo[-1].file_id)
await bot.download_file(file.file_path, 'photo.jpg')
async def get_hello(message: Message, bot: Bot):
await message.answer(f'И тебе привет!')
json_str = json.dumps(message.dict(), default=str)
print(json_str)handlers/contact.py
from aiogram.types import Message
from aiogram import Bot
async def get_true_contact(message: Message, bot: Bot, phone: str):
await message.answer(f'Ты отправил <b>свой</b> контакт {phone}.')
async def get_fake_contact(message: Message, bot: Bot):
await message.answer(f'Ты отправил <b>не свой</b> контакт.')main.py
from aiogram import Bot, Dispatcher
from aiogram.types import Message, ContentType
from core.handlers.basic import get_start, get_photo, get_hello
from core.filters.iscontact import IsTrueContact
from core.handlers.contact import get_fake_contact, get_true_contact
import asyncio
import logging
from core.settings import settings
from aiogram.filters import ContentTypesFilter, Command, CommandStart
from aiogram import F
async def start_bot(bot: Bot):
await bot.send_message(settings.bots.admin_id, text='Бот запущен!')
async def stop_bot(bot: Bot):
await bot.send_message(settings.bots.admin_id, text='Бот остановлен!')
async def start():
logging.basicConfig(level=logging.INFO,
format="%(asctime)s - [%(levelname)s] - %(name)s - "
"(%(filename)s).%(funcName)s(%(lineno)d) - %(message)s"
)
bot = Bot(token=settings.bots.bot_token, parse_mode='HTML')
dp = Dispatcher()
dp.startup.register(start_bot)
dp.shutdown.register(stop_bot)
# dp.message.register(get_photo, ContentTypesFilter(content_types=[ContentType.PHOTO]))
dp.message.register(get_hello, F.text == 'Привет')
dp.message.register(get_true_contact, ContentTypesFilter(content_types=[ContentType.CONTACT]), IsTrueContact())
dp.message.register(get_fake_contact, ContentTypesFilter(content_types=[ContentType.CONTACT]))
dp.message.register(get_photo, F.photo)
dp.message.register(get_start, Command(commands=['start', 'run']))
# dp.message.register(get_start, CommandStart)
try:
await dp.start_polling(bot)
finally:
await bot.session.close()
if __name__ == "__main__":
asyncio.run(start())











