Как получить ID пользователя телеграм бота, вне функции Aiogram
Я знаю как получить 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)?
Ответы (2 шт):
узнать можно с помощью message.from_user.id в любом хендлере, который принимает message А если хендлер принимает callback_query, то он получается с помощью callback_query.from_user.id Если нужно получить вне хендлера, придется при старте сохранять id, и вытаскивать его при надобности,
Если вы хотите получить 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")
Думаю, есть еще куча способов как это сделать