(Python / PyTelegramBotApi) Как сделать функцию на инлайн кнопке, при нажатии которой бот бы проверял подписан пользователь на канал или нет?
import telebot
import config
from telebot import types
from telebot.apihelper import ApiTelegramException
bot = telebot.TeleBot(config.TOKEN)
@bot.message_handler(commands=['start'])
def welcome(message):
# User_id
user_id = message.from_user.id
print(user_id)
# InlineKeyboard
markup = types.InlineKeyboardMarkup()
item1 = types.InlineKeyboardButton(text="👉Подписаться👈", url="https://t.me/freeapp_p")
item2 = types.InlineKeyboardButton(text="Я подписался!🔥", callback_data="good")
markup.add(item1, item2)
bot.send_message(message.chat.id, "Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>.\nДля начала подпишись на канал, чтобы получить желаемый Apk: https://t.me/freeapp_p\nНажми на кнопку '👉Подписаться👈' чтобы продолжить".format(message.from_user, bot.get_me()),
parse_mode='html', reply_markup=markup)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
if call.data == 'good':
bot.send_message(call.message.chat.id, 'Вот ссылка на канал с Apk\nhttps://t.me/Free_App_apkk')
# show alert
bot.answer_callback_query(callback_query_id=call.id, show_alert=False,
text="Спасибо за подписку!")
except Exception as e:
print(repr(e))
# RUN
bot.polling(none_stop=True)
Немного изучил документацию к библиотеке PyTelegramBotApi. И не могу понять, как мне сделать так, чтобы при нажатии на инлайн кнопку, бот проверял, подписан ли пользователь или нет. И в случае подписки (успеха) бот высылал сообщение с ссылкой на закрытый канал, а в случае, если пользователь не подписан (неудаче) просил подписаться. Прошу помочь! Код я приложил.
1 ответ
Решение
Можно так:
import telebot
from telebot import types
TOKEN = ""
# Канал, на который проверяем подписан ли пользователь.
PUBLIC_CHANNEL = "@freeapp_p"
PUBLIC_CHANNEL_URL = "https://t.me/freeapp_p"
PRIVATE_CHANNEL_URL = "https://t.me/Free_App_apkk"
bot = telebot.TeleBot(TOKEN)
@bot.message_handler(commands=['start'])
def welcome(message):
markup = types.InlineKeyboardMarkup()
item1 = types.InlineKeyboardButton(
text="👉Подписаться👈",
callback_data="subscribe_to_channel"
)
item2 = types.InlineKeyboardButton(
text="Я подписался!🔥",
callback_data="good"
)
markup.add(item1, item2)
bot.send_message(
message.chat.id,
"Добро пожаловать, {0.first_name}!\nЯ - <b>{1.first_name}</b>.\n"
"Для начала подпишись на канал, чтобы получить желаемый Apk: {2}\n"
"Нажми на кнопку '👉Подписаться👈' чтобы продолжить".format(
message.from_user,
bot.get_me(),
PUBLIC_CHANNEL_URL
),
parse_mode='html',
reply_markup=markup
)
@bot.callback_query_handler(func=lambda call: True)
def callback_inline(call):
try:
if call.message:
if call.data == 'subscribe_to_channel':
user_status = bot.get_chat_member(
chat_id=PUBLIC_CHANNEL,
user_id=call.message.from_user.id
).status
# Если пользователь обладает одним из статусов,
# тогда он подписан на канал.
statuses = ('creator', 'administrator', 'member')
for status in statuses:
if status == user_status:
# Пользователь подписан.
chat_id = call.message.chat.id
is_subscribed = True
break
else:
# Пользователь не подписан.
chat_id = call.message.chat.id
is_subscribed = False
if is_subscribed:
# Если пользователь подписан, тогда отсылаем ему ссылку на приватный канал.
bot.send_message(
chat_id,
'Вот ссылка на приватный канал'
' с Apk {0}\n'.format(PRIVATE_CHANNEL_URL)
)
elif call.data == 'good':
bot.send_message(
call.message.chat.id,
'Вот ссылка на канал'
' с {0}\n'.format(PRIVATE_CHANNEL_URL)
)
# show alert
bot.answer_callback_query(
callback_query_id=call.id,
show_alert=False,
text="Спасибо за подписку!"
)
except Exception as e:
print(repr(e))
bot.polling(none_stop=True)