Как получить ID пользователя телеграм бота, вне функции Aiogram

Рейтинг: 1Ответов: 2Опубликовано: 02.02.2023

Я знаю как получить ID юзера обычным образом:

async def start(message: types.Message):
   await bot.send_message(message.from_user.id, f'Вот твой айди {message.from_user.id}')

Но вопрос, можно ли узнать id вне функции async def start(message: types.Message)?

Ответы

▲ 0

узнать можно с помощью message.from_user.id в любом хендлере, который принимает message А если хендлер принимает callback_query, то он получается с помощью callback_query.from_user.id Если нужно получить вне хендлера, придется при старте сохранять id, и вытаскивать его при надобности,

▲ 0

Если вы хотите получить ID пользователя в другом контексте (например, в другой функции, где нет объекта message), вам нужно передать этот id в нужное место:

Способ, которым пользуюсь я - FSM, можно сохранить id в хранилище состояний.

async def start(message: types.Message, state: FSMContext):
    user_id = message.from_user.id
    await state.update_data(user_id=user_id)
    await bot.send_message(user_id, f'Ваш ID: {user_id}')

async def get_user_id_from_state(state: FSMContext):
    data = await state.get_data()
    return data.get("user_id")

Можно сохранить id в глобальной переменной для использования в других функциях.

user_id = None

async def start(message: types.Message):
    global user_id
    user_id = message.from_user.id
    await bot.send_message(user_id, f'Ваш ID: {user_id}')

def get_user_id():
    return user_id

Здесь функция get_user_id может быть вызвана для получения сохраненного id.

Вы можете сохранять id между запусками, его можно записать в базу данных или файл, а затем извлекать по мере необходимости.

async def start(message: types.Message):
    user_id = message.from_user.id
    with open("user_ids.json", "w") as f:
        json.dump({"user_id": user_id}, f)
    await bot.send_message(user_id, f'Ваш ID: {user_id}')

def get_user_id_from_file():
    with open("user_ids.json", "r") as f:
        data = json.load(f)
        return data.get("user_id")

Думаю, есть еще куча способов как это сделать