@CharonIKHH

Телеграм Бот на Питоне не реагирует на команды в канале ТГ?

проблема заключается в следующем, бот видит и реагирует на команды в личных сообщениях (любых пользователей, даже с учетом, что он запущен на локалке), однако после добавления в канал - внутри него он ничего не пишет, не реагирует на собачку и на команды. Как это решить? (необходимо, чтобы он автоматически определял то, в каком канале он находится, потому что выделять один айди канала - не соответствует ТЗ).

Вот его код.

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())
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы