Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Как проверить выполнение условия у пользователя бота, который ранее уже пользовался им?

Александр Полежайкин Ученик (95), на голосовании 3 недели назад
Бот проверяет условия пользователя (в данном случае - проверку подписки на чат). Если пользователь в чате, то запускается функционал бота, если нет, то бот просит подписаться на чат.

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

Как проверять старых пользователей на подписку на чат тоже?


 import crypto_parser 

from keyboards import sub_verification_menu
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor



API_TOKEN = 'ч'



bot = Bot(token=API_TOKEN, parse_mode='HTML')
dp = Dispatcher(bot)


def sub_verification(chat_member):
if chat_member["status"] != "left":
return True
else:
return False


@dp.message_handler(commands=["start"])
async def send_welcome(message: types.Message):
if message.chat.type == 'private':
if sub_verification(await bot.get_chat_member(chat_id="ч", user_id=message.from_user.id)):
await message.reply("? Hi! I’m here and ready to work! Send me any token address\n")
else:
await message.answer("Bot only works for users who have a private subscription", reply_markup=sub_verification_menu)


@dp.message_handler()
async def echo_message(msg: types.Message):
if msg.chat.type == 'private':
if sub_verification(await bot.get_chat_member(chat_id="ч", user_id=msg.from_user.id)):
Основной функционал бота

return data
else:
await msg.answer("Bot only works for users who have a private subscription", reply_markup=sub_verification_menu)


@dp.callback_query_handler(text="sub_check")
async def sub_check(message: types.Message):
await bot.delete_message(message.from_user.id, message.message.message_id)
if sub_verification(await bot.get_chat_member(chat_id="ч", user_id=message.from_user.id)):
await bot.send_message(message.from_user.id, "? Hi! I’m here and ready to work! Send me any token address\n")
else:
await bot.send_message(message.from_user.id, "Bot only works for users who have a private subscription", reply_markup=sub_verification_menu)


if __name__ == '__main__':
executor.start_polling(dp, skip_updates=True)
Голосование за лучший ответ
Дмитрий Ткаченко Ученик (115) 1 месяц назад
У тебя в запуске бота executor.start_polling, стоит True в параметре skip_updates, честно не уверен но возможно проблема в этом тк. с английского это переводится как пропускать обновления. но точно сказать не могу потому что данной библиотекой не пользовался
Александр ПолежайкинУченик (95) 1 месяц назад
Хм, спасибо, изучу этот момент
Сергей Просветленный (42706) 1 месяц назад
Ну так посмотри, что приходит для этих пользователей в chat_member (функция sub_verification). Какой там у них статус.
Рустам Абдрашитов Мыслитель (9532) 1 месяц назад
 import logging 
from aiogram import Bot, Dispatcher, types
from aiogram.utils import executor
from keyboards import sub_verification_menu

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)

API_TOKEN = 'ваш_токен'

bot = Bot(token=API_TOKEN, parse_mode='HTML')
dp = Dispatcher(bot)

async def check_subscription(user_id):
try:
chat_member = await bot.get_chat_member(chat_id="ч", user_id=user_id)
return chat_member.status not in ["left"]
except Exception as e:
logger.error(f"Ошибка при проверке подписки для пользователя {user_id}: {e}")
return False

async def send_welcome_message(user_id):
await bot.send_message(user_id, "? Hi! I’m here and ready to work! Send me any token address\n")

async def send_subscription_error(user_id):
await bot.send_message(user_id, "Bot only works for users who have a private subscription", reply_markup=sub_verification_menu)

@dp.message_handler(commands=["start"])
async def send_welcome(message: types.Message):
if message.chat.type == 'private':
if await check_subscription(message.from_user.id):
await send_welcome_message(message.from_user.id)
else:
await send_subscription_error(message.from_user.id)

@dp.message_handler()
async def echo_message(msg: types.Message):
if msg.chat.type == 'private':
if await check_subscription(msg.from_user.id):
await msg.answer("Основной функционал бота")
else:
await send_subscription_error(msg.from_user.id)

@dp.callback_query_handler(text="sub_check")
async def sub_check(callback_query: types.CallbackQuery):
await bot.delete_message(callback_query.from_user.id, callback_query.message.message_id)

if await check_subscription(callback_query.from_user.id):
await send_welcome_message(callback_query.from_user.id)
else:
await send_subscription_error(callback_query.from_user.id)

if __name__ == '__main__':
logger.info("Бот запущен.")
executor.start_polling(dp, skip_updates=True)
Похожие вопросы