так, этот модуль предоставляет следующий функционал: Если юзер не подписан и пишет /start то бот присылает ему Вы не подписаны на канал(ы): [инлайн кнопка ссылка на канал] [инлайн кнопка Проверить подписку] Если юзер не подписан и нажимает на проверить подписку бот выдает ему каллбак окошко с текстом "Вы не подписаны", если же он подписан и нажимает на это происходит какое то действие, что уже сделаете вы) Плюсы кода: • довольно маленький и компактный • легкий для использования и для интеграции в ваш код Туториал на использование: • В переменные CHANNEL_ID и CHANNEL_LINK вставляем айди канала и ссылку канала • запускаем • готово! код from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.utils import executor from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message, CallbackQuery, ParseMode API_TOKEN = "" bot = Bot(token=API_TOKEN) storage = MemoryStorage() dp = Dispatcher(bot) CHANNEL_ID = CHANNEL_LINK = "" @dp.message_handler(commands=['start']) async def start_command(message: Message): user_id = message.from_user.id try: member = await bot.get_chat_member(CHANNEL_ID, user_id) if member.status in ["member", "administrator", "creator"]: # сюда вставь то что надо прислать когда юзер подписался await message.reply("Huy?") else: keyboard = InlineKeyboardMarkup(row_width=1) keyboard.add( InlineKeyboardButton(" Подписаться", url=CHANNEL_LINK), InlineKeyboardButton(" Проверить подписку", callback_data="check_subscription"), ) await message.answer( f"Сперва подпишитесь на канал(ы) !:", parse_mode=ParseMode.MARKDOWN, reply_markup=keyboard ) except Exception as e: await message.answer("❌ Произошла ошибка при проверке подписки. Попробуйте позже.") print(e) @dp.callback_query_handler(text="check_subscription") async def check_subscription(call: CallbackQuery): user_id = call.from_user.id try: member = await bot.get_chat_member(CHANNEL_ID, user_id) if member.status in ["member", "administrator", "creator"]: # сюда тоже вставь то что надо присылать после того как юзер присылался await call.message.reply("Huy?") else: await call.answer(" Вы не подписались на канал !", show_alert=True) except Exception as e: await call.answer("❌ Произошла ошибка при проверке подписки.", show_alert=True) print(e) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True) Python from aiogram import Bot, Dispatcher, types from aiogram.contrib.fsm_storage.memory import MemoryStorage from aiogram.utils import executor from aiogram.types import InlineKeyboardMarkup, InlineKeyboardButton, Message, CallbackQuery, ParseMode API_TOKEN = "" bot = Bot(token=API_TOKEN) storage = MemoryStorage() dp = Dispatcher(bot) CHANNEL_ID = CHANNEL_LINK = "" @dp.message_handler(commands=['start']) async def start_command(message: Message): user_id = message.from_user.id try: member = await bot.get_chat_member(CHANNEL_ID, user_id) if member.status in ["member", "administrator", "creator"]: # сюда вставь то что надо прислать когда юзер подписался await message.reply("Huy?") else: keyboard = InlineKeyboardMarkup(row_width=1) keyboard.add( InlineKeyboardButton(" Подписаться", url=CHANNEL_LINK), InlineKeyboardButton(" Проверить подписку", callback_data="check_subscription"), ) await message.answer( f"Сперва подпишитесь на канал(ы) !:", parse_mode=ParseMode.MARKDOWN, reply_markup=keyboard ) except Exception as e: await message.answer("❌ Произошла ошибка при проверке подписки. Попробуйте позже.") print(e) @dp.callback_query_handler(text="check_subscription") async def check_subscription(call: CallbackQuery): user_id = call.from_user.id try: member = await bot.get_chat_member(CHANNEL_ID, user_id) if member.status in ["member", "administrator", "creator"]: # сюда тоже вставь то что надо присылать после того как юзер присылался await call.message.reply("Huy?") else: await call.answer(" Вы не подписались на канал !", show_alert=True) except Exception as e: await call.answer("❌ Произошла ошибка при проверке подписки.", show_alert=True) print(e) if __name__ == '__main__': executor.start_polling(dp, skip_updates=True) плюсы кода: • Работает и на приватные и на публичные каналы за счет айди канала
для простой проверки подписки годный, но он же не обрабатывает ошибки api нормально, нет нормальной логики если юзер подписался. в целом, если у тебя простая задача чекать подписку на один канал, то этот код норм, но для более сложных сценариев надо будет его дорабатывать
детектив, Про обработку исключений не подумал, признаю(( но вот если.юзер подписался я специально оставил голую логику чтобы чел который решмл использовать этот скрипт добавил сообщение с кнопками, добавление в бд и т.д