Как сделать проверку на подписку телеграмм канала? (aiogram)

Рейтинг: 1Ответов: 1Опубликовано: 13.07.2023

Нужно сделать чтобы бот работал только когда подписан на телеграмм канал

from aiogram import Bot, Dispatcher, executor, types
import Confing as nav 
TOKEN = 'TOKEN'
Channel_id = 'ID'
NOTSUB = "Чтобы использовать бота, сначала подпишетесь на канал"
bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

def check_sub_channel(chat_mem):
    print(chat_mem['status'])
    if chat_mem['status'] !='left':
        return True
    else:
        return False
    
@dp.message_handler(commands=['start'])
async def start(message: types.Message):
    if check_sub_channel(await bot.get_chat_member(chat_id=Channel_id, user_id=message.from_user.id)):
        await bot.send_message(message.from_user.id, "Привет")
    else:
        await bot.send_message(message.from_user.id, NOTSUB, reply_markup=nav.checksubmenu)


@dp.message_handler(commands=['help'])
async def info(message: types.Message):
    if check_sub_channel(await bot.get_chat_member(chat_id=Channel_id, user_id=message.from_user.id)):
        markup = types.InlineKeyboardMarkup()
        markup.add(types.InlineKeyboardButton('site', url='https://www.youtube.com'))
        await message.reply('helll', reply_markup=markup)
    else:
        await bot.send_message(message.from_user.id, NOTSUB, reply_markup=nav.checksubmenu)

@dp.callback_query_handler(text='subchennel')
async def subchennel(message: types.Message):
    await bot.delete_message(message.from_user.id, message.message_id)
    if check_sub_channel(await bot.get_chat_member(chat_id=Channel_id, user_id=message.from_user.id)):
        await bot.send_message(message.from_user.id, "Привет")
    else:
        await bot.send_message(message.from_user.id, NOTSUB, reply_markup=nav.checksubmenu)

if __name__ == '__main__':

    executor.start_polling(dp)`
from aiogram.types import ReplyKeyboardMarkup, KeyboardButton, InlineKeyboardMarkup, InlineKeyboardButton
bthurl = InlineKeyboardButton(text="Канал", url= 'https')
bthsub = InlineKeyboardButton(text="Я подписался", callblack_data="subchennel")

checksubmenu = InlineKeyboardMarkup(row_width=1)
checksubmenu.insert(bthurl)
checksubmenu.insert(bthsub)

Ответы

▲ 0

Нужно использовать метод "GetChatMember", передать id канала и user_id,что бы получить статус пользователя. Далее по логике дописываем и получаем такой метод:

user_channel_status = await bot.get_chat_member(chat_id='ID канала', user_id=user_id)
if user_channel_status["status"] != 'left':
   pass
else:
   await bot.send_message(message.from_user.id, 'Вы еще не подписались!')