Как настроить фильтр в библиотеке Pyrogram?

Как можно изменить код так, чтобы функция on_message с фильтром chat(*название переменной*) продолжала работать после изменения значения переменной в другой функции с фильтром command()?
  • 23 августа 2024 г. 20:03
Ответы на вопрос 2
Для настройки фильтра в Pyrogram в функции on_message можно использовать параметр filters, который позволяет указать фильтры сообщений. Например, чтобы установить фильтр для конкретного чата, можно использовать фильтр ChatFilter:

```python
from pyrogram import Client
from pyrogram.filters import ChatFilter

app = Client("my_account")

# Функция, которая будет обрабатывать все сообщения в указанном чате
@app.on_message(filters=ChatFilter('название_чата'))
def handle_message(client, message):
    # Обработка сообщения

# Функция, которая будет обрабатывать команду и изменять значение переменной
@app.on_message(filters.command(['команда']))
def handle_command(client, message):
    global название_переменной
    # Изменение значения переменной

app.run()
```

Чтобы функция on_message с фильтром chat продолжала работать после изменения значения переменной в функции с фильтром command, необходимо объявить переменную глобально перед изменением её значения. Таким образом, изменённое значение будет доступно и для других функций.
Фильтр chat() в Pyrogram работает с идентификаторами чатов, которые должны быть известны во время запуска бота. Динамическое изменение этого фильтра во время выполнения не сработает так, как вы ожидаете. 

Вместо этого, вы можете создать свой собственный фильтр, который будет проверять значение переменной при каждом сообщении. Основная причина, по которой ваш код не работает как ожидается, заключается в том, что фильтр filters.chat() устанавливается при запуске бота и не обновляется динамически. Вот пример, как это можно сделать:

from pyrogram import Client, filters
from pyrogram.types import InputMediaPhoto, InputMediaVideo

class EchoBot:
    def __init__(self, bot):
        self.bot = bot
        self.echo_chat_id = None
        self.echo_enabled = False

    def setup(self):
        # Регистрируем обработчики сообщений
        self.bot.on_message(self.custom_chat_filter)(self.on_msg_echo)
        self.bot.on_message(filters.me & filters.command("echo"))(self.echo_on_or_off)

    def custom_chat_filter(self, _, __, message):
        # Пользовательский фильтр для проверки chat_id
        return self.echo_enabled and message.chat.id == self.echo_chat_id

    async def on_msg_echo(self, client, message):
        print(f"Эхо-сообщение в чате {self.echo_chat_id}")
        if message.photo:
            await message.reply_media_group([InputMediaPhoto(message.photo.file_id, caption=message.caption)])
        elif message.video:
            await message.reply_media_group([InputMediaVideo(message.video.file_id, caption=message.caption)])
        elif message.document:
            await message.reply_document(message.document.file_id)
        elif message.sticker:
            await message.reply_sticker(message.sticker.file_id)
        elif message.animation:
            await message.reply_animation(message.animation.file_id)
        else:
            await message.reply(message.text or "")

    async def echo_on_or_off(self, client, message):
        command = message.text.split()
        if len(command) != 2:
            await message.reply("Использование: /echo [on|off]")
            return

        action = command[1].lower()
        if action == 'on':
            if self.echo_enabled:
                await message.reply("Система эхо уже включена")
            else:
                self.echo_enabled = True
                self.echo_chat_id = message.chat.id
                await message.reply("Система эхо успешно включена")
        elif action == 'off':
            if not self.echo_enabled:
                await message.reply("Система эхо уже выключена")
            else:
                self.echo_enabled = False
                self.echo_chat_id = None
                await message.reply("Система эхо успешно выключена")
        else:
            await message.reply("Неверная команда. Используйте 'on' или 'off'")

# Инициализация и запуск бота
bot = Client("my_bot")
echo_bot = EchoBot(bot)
echo_bot.setup()
bot.run()

В этом примере:

Этот подход позволит вам динамически менять целевой чат во время работы бота, и фильтр будет работать корректно.
Похожие вопросы