@swrvdm

Не могу завезти проверку юзера на подписку. Как решить?

Не могу никак сделать так чтобы при нажатии кнопки, "я подписался" проверялась подписка, он автоматически всех считает что подписаны. А если убрать бота из админов канала на который идёт подписка, то он всех считает неподписанными.

import telebot
from telebot.apihelper import ApiTelegramException
from telebot import types
import time

bot = telebot.TeleBot("Token")

CHAT_ID = '@channel_name'

def is_subscribed(chat_id, user_id):
    try:
        bot.get_chat_member(chat_id, user_id)
        return True
    except ApiTelegramException as e:
        if e.result_json['description'] == 'Bad Request: user not found':
            return False


@bot.message_handler(commands=['start'])
def start_message_handler(message):
    try:
        keyboard = types.InlineKeyboardMarkup(row_width=1)
        url_button = types.InlineKeyboardButton(text="ПОДПИСАТЬСЯ", url="Sylka")
        check_button = types.InlineKeyboardButton(text="Я ПОДПИСАЛСЯ", callback_data="check_subscribe")
        keyboard.add(url_button, check_button)
        bot.send_message(message.chat.id, "Для того чтобы посмотреть фильм, подпишься на канал!", reply_markup=keyboard)
    except:
        pass


@bot.callback_query_handler(func=lambda call: True)
def callback_query(call):
    try:
        if not is_subscribed(CHAT_ID, call.from_user.id):
            keyboard = types.InlineKeyboardMarkup(row_width=1)
            url_button = types.InlineKeyboardButton(text="ПОДПИСАТЬСЯ", url="Sylkaa")
            check_button = types.InlineKeyboardButton(text="Я ПОДПИСАЛСЯ", callback_data="check_subscribe")
            keyboard.add(url_button, check_button)
            bot.send_message(call.from_user.id, 'Не подписан, попробуй снова', reply_markup=keyboard)
        else:
            keyboard = types.InlineKeyboardMarkup()
            url_button_add = types.InlineKeyboardButton(text="СМОТРЕТЬ ФИЛЬМ", url="sylka")
            keyboard.add(url_button_add)
            bot.send_message(call.from_user.id, '', reply_markup=keyboard)
    except:
        pass



if __name__ == '__main__':
    try:
        bot.polling()
    except Exception as e:
        print(e)
        time.sleep(10)
  • Вопрос задан
  • 118 просмотров
Пригласить эксперта
Ответы на вопрос 1
SoreMix
@SoreMix Куратор тега Python
yellow
Даже если пользователь сейчас не в канале, метод get_chat_member не выкинет исключение. Это справедливо для покинувших канал (были кикнуты или вышли сами). Так что нужно еще проверить статус на этот случай. По сути, нужных нам только два - left и kicked. Все статусы и типы описаны тут - https://core.telegram.org/bots/api#chatmember

def is_subscribed(chat_id, user_id):
    try:
        user = bot.get_chat_member(chat_id, user_id)
        if user.status in ('left', 'kicked'):
            return False
        return True
    except ApiTelegramException as e:
        if e.result_json['description'] == 'Bad Request: user not found':
            return False
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы