텔레그램 채팅을 위한 봇 중재자. 필터

필터는 무엇입니까? 💭



핸들러를 등록할 때 응답해야 하는 명령, 수락할 메시지 유형 등을 지정합니다. 예를 들면 다음과 같습니다.

@dp.message_handler(is_admin=True, commands=['kick'], commands_prefix='!/',
                    chat_type=[ChatType.GROUP, ChatType.SUPERGROUP])
async def kick_user(message: Message):


보시다시피 여기서 핸들러는 다음과 같은 경우에만 실행됩니다.
  • 이것은 킥 명령이 됩니다.
  • 명령이 "!"로 시작합니다. 또는 "/";
  • 명령이 그룹 또는 상위 그룹에 작성되었습니다.

  • 모두 필터라고 합니다. 라이브러리의 깊숙한 곳에서 처리기 등록이 이루어지며 각 처리기에 대한 필터가 등록됩니다.

    def register(self, handler, filters=None, index=None):
            """
            Register callback
    
            Filters can be awaitable or not.
    
            :param handler: coroutine
            :param filters: list of filters
            :param index: you can reorder handlers
            """
            from .filters import get_filters_spec
    
            spec = _get_spec(handler)
    
            if filters and not isinstance(filters, (list, tuple, set)):
                filters = [filters]
            filters = get_filters_spec(self.dispatcher, filters)
    
            record = Handler.HandlerObj(handler=handler, spec=spec, filters=filters)
            if index is None:
                self.handlers.append(record)
            else:
                self.handlers.insert(index, record)
    


    핸들 데코레이터가 허용하는 것을 보면 다음을 볼 수 있습니다.



    오늘은 맞춤 필터를 만드는 방법을 배웁니다.

    나만의 필터 만들기✍️



    먼저 필터 폴더에 admin.py와 같은 파일을 만들어야 합니다.

    📦tgbot
    ┣ 📂필터
    ┃ ┣ 📜admin.py
    ┃ ┗ 📜init.py

    내부에 다음 코드를 추가합니다.

    from aiogram import types
    from aiogram.dispatcher.filters import BoundFilter
    
    
    class IsAdminFilter(BoundFilter):
        key = 'is_admin'
    
        def __init__(self, is_admin):
            self.is_admin = is_admin
    
        async def check(self, message: types.Message) -> bool:
            member = await message.bot.get_chat_member(message.chat.id, message.from_user.id)
            return member.is_chat_admin()
    


    보시다시피 필터는 자체 필터를 만들 수 있는 BoundFilter 클래스를 상속하는 간단한 Python 클래스입니다. 처리기에서 필터를 설명하는 방법을 보여주는 필드key = 'is_admin'가 있습니다. 구조 외에도 기본 메서드async def check()가 있습니다. 그 안에 논리를 설명할 수 있지만 이 메서드는 부울 값(True 또는 False)을 반환해야 합니다.

    자체 필터 연결하기 ⛓️



    단순히 클래스를 만드는 것만으로는 충분하지 않습니다. 다음으로 bot.py 파일로 이동하여 필터를 가져와 디스패처에 바인딩해야 합니다.

    ...
    from tgbot.config import load_config
    from tgbot.services.setting_commands import set_default_commands
    from tgbot.filters.admin import IsAdminFilter
    
    ...
    
    def register_all_filters(dispatcher: Dispatcher) -> None:
        logger.info('Registering filters')
        dispatcher.filters_factory.bind(IsAdminFilter)
    


    이제 첫 번째 그림에서 보여준 것처럼 핸들러에 필터를 추가할 수 있습니다. 이 문서에서는 채팅 관리를 위한 핸들러를 아직 작성하지 않습니다.

    추가부분 😺



    지금은 /start/help 두 명령에 대한 처리기를 프로그래밍해 보겠습니다.
  • tgbot/handlers/start.py :

  • from aiogram.types import Message
    from aiogram.dispatcher.filters.builtin import CommandStart
    
    from loader import dp
    
    
    @dp.message_handler(CommandStart())
    async def start_command(message: Message) -> Message:
        return await message.answer('Add a bot to the chat, give the administrator permissions and use it')
    


  • tgbot/handlers/help.py :

  • from aiogram.types import Message
    from aiogram.dispatcher.filters.builtin import CommandHelp
    
    from loader import dp
    
    
    @dp.message_handler(CommandHelp())
    async def help_command(message: Message) -> Message:
        """
        This handler will be called when a user sends `/help` command
        """
        return await message.answer("""
    User's command:
        /help - get commands
        /admins - get chat admins
        /dice - roll a dice
    Administrator's command:
        !kick - kick a user
        !ban - ban a user
        !mute - mute a user
        !unmute, !unban - opposite commands
    """)
    


    여기서 데코레이터는 이미 아이오그램에 내장된 필터를 사용했습니다. 이러한 필터의 전체 목록을 찾을 수 있습니다here.

    참고문헌 🔗


  • Second part file structure

  • 읽어 주셔서 감사합니다! ❤️ ❤️ ❤️

    좋은 웹페이지 즐겨찾기