Авторизация TelegramBot

Я создаю TelegramBot, используя айограмму и SQLAlchemy для взаимодействия с базой данных. Я хочу начать с авторизации. Номера телефонов всех пользователей хранятся в базе данных SQLite. Когда пользователь запускает бота, он должен попросить пользователя ввести номер телефона. После того, как пользователь это сделал, бот проверяет, существует ли этот номер в базе данных. Если да, пользователь может продолжить. В противном случае бот должен запретить доступ. Не могли бы вы объяснить, как это реализовать в коде?

1 ответ

Вы можете добавить столбец и создать /login phone установить это и /logoutустановить это. И тогда другие команды должны будут проверить, если logged является True или же False

Вы также можете сделать это как на веб-страницах и сохранить время, когда пользователь вошел в систему, и заблокировать доступ, когда осталось 5 минут. если осталось менее 5 минут, команда может обновить его до текущего времени.

      from aiogram import Bot, Dispatcher, executor, types
import os
import datetime

database = {
    1079414868: {'phone': '1234', 'logged': datetime.datetime(1970, 1, 1)}
}

# --- functions ---

five_minutes = datetime.timedelta(minutes=1)

def do_login(message):
    user = message.from_user.id
    print('[do_login] user:', user)
    
    if user not in database:
        return False
        
    user_data = database[user]

    current_time = datetime.datetime.now()

    #phone = message.get_args()
    args = message.get_args().split(' ')
    phone = args[0]
    
    print('[do_login] phone:', phone)

    # check new phone
    if phone and user_data['phone'] == phone:
        user_data['logged'] = current_time
        return True
    
    return False

def do_logout(message):
    user = message.from_user.id
    
    if user not in database:
        return True
        
    user_data = database[user]
    user_data['logged'] = datetime.datetime(1970, 1, 1)

    return True
    
def check_login(message, check_phone=False):

    user = message.from_user.id
    
    if user not in database:
        return False
        
    user_data = database[user]

    current_time = datetime.datetime.now()

    # check current session    
    if current_time - user_data['logged'] < five_minutes:
        user_data['logged'] = current_time
        return True
        
    return False
    
# --- init ---

TOKEN = os.getenv('TELEGRAM_TOKEN')

bot = Bot(token=TOKEN)
dp = Dispatcher(bot)

# --- commands ---
    
@dp.message_handler(commands=['login'])
async def login(message: types.Message):
    if do_login(message):
        await message.answer("Login: OK")
    else:
        await message.answer("Login: Problem")

@dp.message_handler(commands=['logout'])
async def logout(message: types.Message):
    if do_logout(message):
        await message.answer("Logout: OK")
    else:
        await message.answer("Logout: Problem")

@dp.message_handler(commands=['test'])
async def test(message: types.Message):

    if not check_login(message):
        await message.answer('You have to use "/login phone"')
        return
    
    await message.answer("I'm a bot, please talk to me!")

# --- start ---

if __name__ == '__main__':
    print('Running ...')
    executor.start_polling(dp, skip_updates=True)

BTW: Может быть, вы даже могли бы создать декоратор @check_loginчтобы упростить назначение команд. Или вы должны использовать какое-то событие для автоматической проверки входа в систему для каждой команды (кроме /login).

Другие вопросы по тегам