Как проверить подписан ли пользователь на определенный Telegram канал (Python / aiogram)

Пишу Telegram бота при помощи библиотеки aiogram, хочу чтобы бот проверял подписан ли человек на Telegram канал, в противном случае предлагал подписаться. Не знаю как это реализовать, помогите пожалуйста!


Ответы (3 шт):

Автор решения: German Shtykmauser

Вроде разобрался! Для решения проблемы использовал метод "GetChatMember", который возвращает строку с данными о пользователе (причем не важно, подписан ли человек на интересующий канал или нет, в конце строки будет статус пользователя, который нам и нужен!). В общем получили мы эту строку, что делать дальше? Я разбил ее на элементы при помощи библиотеки 're' (user_channel_status - та самая строка)

    user_channel_status = re.findall(r"\w*", str(user_channel_status))

Далее на нужно вытащить уже из разбитой строки статус, здесь нужно помнить, что не у всех пользователей есть фамилия, так что нужно сделать условие для всех возможных случаев!

    try:
        #Это для тех у кого есть фамилия
        #из-за этого элемент со статусом находится дальше
        if user_channel_status[70] != 'left':
            await bot.send_message(message.from_user.id, '')
            #Пользователь уже подписан
        else:
            await bot.send_message(message.chat.id, '')
            #Требуем подписки
    except:
        #Для тех кто без фамилии
        if user_channel_status[60] != 'left':
            await bot.send_message(message.from_user.id, '')
            #подписан
        else:
            await bot.send_message(message.from_user.id, '')
            #Требуем подписки

Собственно ниже будет весь код:

    user_channel_status = await bot.get_chat_member(chat_id=id_канала, user_id=message.chat.id)
    user_channel_status = re.findall(r"\w*", str(user_channel_status))
    try:
        if user_channel_status[70] != 'left':
            #Условие для "подписанных"
        else:
            await bot.send_message(message.chat.id, '')
            #Условие для тех, кто не подписан
    except:
        if user_channel_status[60] != 'left':
            await bot.send_message(message.from_user.id, '')
            #Условие для "подписанных"
        else:
            await bot.send_message(message.from_user.id, '')
            #Условие для тех, кто не подписан
→ Ссылка
Автор решения: scvgde

Попробуйте так:

user_channel_status = await bot.get_chat_member(chat_id='@chatid', user_id=user_id)
if user_channel_status["status"] != 'left':
   pass
else:
   await bot.send_message(message.from_user.id, 'text if not in group')
→ Ссылка
Автор решения: elr1c180
user_status = await message.bot.get_chat_member(
    chat_id="-4648273731", user_id=message.chat.id)
print(dict(user_status)['status'])

можно просто вот так получить статус пользователя без игр с исключениями и разбиением строк

→ Ссылка