Как правильно регистрировать ID пользователя через телеграмм?

Пишу веб-приложение на PHP, в котором можно выполнять определенные действия. Возникла потребность в регистрации пользователей, а так же рассылке через бота (через него же восстановление пароля, а так же будуе дополняться другими функциями)
На сайте происходит регистрация пользователя корректно, после надо перейти по ссылке и зарегистрироваться через ТГ в боте, написанном на pyTelegramBotAPI.
Когда пользователь нажимает на кнопку "к боту", то на сервере создается папка, у которой название - логин пользователя, внутри json файл у которого название - тоже логин.
В боте настроено при первом обращении к нему - команда /start по середине экрана.
После нажатия на нее бот берет id и записывает в бд, где логин = логин из json файла.
Но возникает проблема, когда несколько человек делает это одновременно, то первый, кто нажал, того id и запишется во всех записях людей, регистрировавшихся на данный момент (работа через циклы, так как надо найти папку, выбрать, открыть, перебрать файлы и найти нужные и т.д.)
как это можно решить?

@bot.message_handler(commands=['start']) 
def start(message):
    user_id = message.from_user.id
    
    subdirectories = glob.glob(directory)
    
    if len(subdirectories) == 0:
        error_log("Function: start(): folder is not exists")
    else:
        for target_directory in subdirectories:
            folder_path = os.path.join(target_directory)
            secure_code_files = [file for file in os.listdir(folder_path) if file.startswith("secure_code")]
            login_files = [file for file in os.listdir(folder_path) if not file.startswith("secure_code")]
            
            for login_file in login_files:
                file_path = os.path.join(folder_path, login_file)
                with open(file_path, "r") as file:
                    conn = None
                    try:
                        data = json.load(file)
                        login = data.get("login")
                        conn = create_connection('?','?','?','?')
                        cursor = conn.cursor()
                        query = "UPDATE `название таблицы` SET `здесь ID тг` = %s WHERE `логин` = %s;"
                        values = (user_id, login)
                        cursor.execute(query, values)
                        conn.commit()
                        cursor.close()
                        os.remove(file_path)
                        os.rmdir(folder_path)
                        bot.send_message(user_id, "Succes!")
                    except Exception as e:
                            bot.send_message(user_id, f"Error registering your login")
                            error_log(f"Function: start(): {str(e)}")
                    finally:
                        if conn:
                            conn.close()


Если у вас есть и другие предложения по улучшению данного кода - прошу, я всегда рад узнать новое и совершенствоваться.
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
По твоей схеме - никак. Или бот должен заранее знать ID пользователя, или пользователь должен доказать, что логин - его.

Я бы на сайте генерил пользователю уникальный одноразовый код и сохранял бы его в БД.
А в боте по /start выводил бы сообщение, мол, введите свой код. При вводе кода ищи его в БД, если нашел - помечаешь пользователя как зареганного и записываешь его ID.
Нужно будет навесить пару прибабахов типа возможности запросить новый код, защиту от попыток перебора кодов, и т.п., но суть от этого не меняется.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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