проблема заключается в следующем, бот видит и реагирует на команды в личных сообщениях (любых пользователей, даже с учетом, что он запущен на локалке), однако после добавления в канал - внутри него он ничего не пишет, не реагирует на собачку и на команды. Как это решить? (необходимо, чтобы он автоматически определял то, в каком канале он находится, потому что выделять один айди канала - не соответствует ТЗ).
Вот его код.
import asyncio
import config
from bybit_client import BybitClient
from aiogram import Bot, Dispatcher, types, F
from aiogram.filters import Command
from aiogram.fsm.storage.memory import MemoryStorage
TOKEN = config.TELEGRAM_BOT_TOKEN
bot = Bot(token=TOKEN)
dp = Dispatcher(storage=MemoryStorage())
# Словарь для отслеживания состояния пользователей и каналов
user_states = {}
monitoring_task = None
# Инициализация клиента Bybit
client = BybitClient(config.BYBIT_API_KEY, config.BYBIT_API_SECRET)
async def start_monitoring():
global monitoring_task
if monitoring_task is None or monitoring_task.done():
monitoring_task = asyncio.create_task(monitor_market())
async def stop_monitoring():
global monitoring_task
if monitoring_task and not monitoring_task.done():
monitoring_task.cancel()
try:
await monitoring_task
except asyncio.CancelledError:
pass
@dp.message(Command("start"))
async def start(message: types.Message):
chat_id = message.chat.id
chat = await bot.get_chat(chat_id)
chat_type = chat.type
if chat_type in ['group', 'supergroup', 'channel']:
user_states[chat_id] = True # Отмечаем, что бот активен для этого чата
await message.reply(f"Бот начал работу в {chat_type}!\nНазвание: {chat.title}\nID: {chat_id}")
await start_monitoring()
else:
user_id = message.from_user.id
user_states[user_id] = True # Отмечаем, что бот активен для этого пользователя
await message.reply("Бот начал работу!")
await start_monitoring()
@dp.message(Command("stop"))
async def stop(message: types.Message):
chat_id = message.chat.id
chat = await bot.get_chat(chat_id)
chat_type = chat.type
if chat_type in ['group', 'supergroup', 'channel']:
user_states[chat_id] = False # Отмечаем, что бот неактивен для этого чата
await message.reply(f"Бот остановлен в {chat_type}!\nНазвание: {chat.title}\nID: {chat_id}")
# Проверяем, есть ли активные чаты
if not any(user_states.values()):
await stop_monitoring()
else:
user_id = message.from_user.id
user_states[user_id] = False # Отмечаем, что бот неактивен для этого пользователя
await message.reply("Бот остановлен!")
# Проверяем, есть ли активные чаты
if not any(user_states.values()):
await stop_monitoring()
async def monitor_market():
while True:
for chat_id, is_active in user_states.items():
if is_active:
tickers = client.get_tickers()
for ticker in tickers:
symbol = ticker['symbol']
price_change = client.get_price_change(symbol)
if abs(price_change) > config.PRICE_CHANGE_THRESHOLD:
message = f"Crypto Alert!\n\nSymbol: {symbol}\nPrice Change: {price_change:.2f}%"
await bot.send_message(chat_id, message)
await asyncio.sleep(config.CHECK_INTERVAL)
@dp.message(F.text)
async def handle_message(message: types.Message):
chat_id = message.chat.id
if user_states.get(chat_id, False):
await message.reply("Бот активен и получил ваше сообщение!")
else:
await message.reply("Бот неактивен. Используйте /start для активации.")
async def set_commands(bot: Bot):
commands = [
types.BotCommand(command="/start", description="Запустить бота"),
types.BotCommand(command="/stop", description="Остановить бота"),
]
await bot.set_my_commands(commands)
async def main():
await set_commands(bot)
# Запускаем поллинг
await dp.start_polling(bot)
if __name__ == "__main__":
asyncio.run(main())