Фильтр chat() в Pyrogram работает с идентификаторами чатов, которые должны быть известны во время запуска бота. Динамическое изменение этого фильтра во время выполнения не сработает так, как вы ожидаете. <br/> <br/> Вместо этого, вы можете создать свой собственный фильтр, который будет проверять значение переменной при каждом сообщении. Основная причина, по которой ваш код не работает как ожидается, заключается в том, что фильтр filters.chat() устанавливается при запуске бота и не обновляется динамически. Вот пример, как это можно сделать: <br/> <br/> <pre><code class="python">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()</code></pre> <br/> В этом примере: <br/> <br/> Этот подход позволит вам динамически менять целевой чат во время работы бота, и фильтр будет работать корректно.