Загрузка...

Mandal of mandatory subscription (aiogram 2.25)

Thread in Python created by SpyEv Jan 27, 2025. 173 views

  1. SpyEv
    SpyEv Topic starter Jan 27, 2025 turururu 46 Oct 17, 2022
    так, этот модуль предоставляет следующий функционал:
    Если юзер не подписан и пишет /start то бот присылает ему
    Вы не подписаны на канал(ы):
    [инлайн кнопка ссылка на канал]
    [инлайн кнопка Проверить подписку]
    Если юзер не подписан и нажимает на проверить подписку бот выдает ему каллбак окошко с текстом "Вы не подписаны", если же он подписан и нажимает на это происходит какое то действие, что уже сделаете вы)

    Плюсы кода:
    • довольно маленький и компактный
    • легкий для использования и для интеграции в ваш код

    Туториал на использование:
    • В переменные CHANNEL_ID и CHANNEL_LINK вставляем айди канала и ссылку канала
    • запускаем
    • готово!
    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)
    плюсы кода:
    • Работает и на приватные и на публичные каналы за счет айди канала
     
  2. детектив
    детектив Jan 27, 2025 elvis has left the building 277 Nov 19, 2019
    для простой проверки подписки годный, но он же не обрабатывает ошибки api нормально, нет нормальной логики если юзер подписался. в целом, если у тебя простая задача чекать подписку на один канал, то этот код норм, но для более сложных сценариев надо будет его дорабатывать
     
    1. SpyEv Topic starter
      детектив, Про обработку исключений не подумал, признаю(( но вот если.юзер подписался я специально оставил голую логику чтобы чел который решмл использовать этот скрипт добавил сообщение с кнопками, добавление в бд и т.д
Top
Loading...