Как проверить подписан ли пользователь на определенный Telegram канал (Python / aiogram)
Пишу Telegram бота при помощи библиотеки aiogram, хочу чтобы бот проверял подписан ли человек на Telegram канал, в противном случае предлагал подписаться. Не знаю как это реализовать, помогите пожалуйста!
Ответы (3 шт):
Вроде разобрался! Для решения проблемы использовал метод "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, '')
#Условие для тех, кто не подписан
Попробуйте так:
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')
user_status = await message.bot.get_chat_member(
chat_id="-4648273731", user_id=message.chat.id)
print(dict(user_status)['status'])
можно просто вот так получить статус пользователя без игр с исключениями и разбиением строк