Фильтр 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()
В этом примере:
Этот подход позволит вам динамически менять целевой чат во время работы бота, и фильтр будет работать корректно.