я пишу сервер(навык для алисы) являющийся этаким api для телеграмма, вызываю следующие функции:
async def login_code(alice_user_id, phone_code):
"""Return OK_CODE if logged in, USER_NOT_EXISTS if user is not registered. return BAD_LOGIN_OR_PASSWORD
if password is needed. return BAD_LOGIN_OR_PASSWORD if args are wrong"""
phone_number = active_sessions[alice_user_id]['phone_number']
sent_code_info = active_sessions[alice_user_id]['sent_code_info']
password = active_sessions[alice_user_id]['password']
try:
conf = await active_sessions[alice_user_id]['client'].sign_in(phone_number, sent_code_info.phone_code_hash,
phone_code)
except SessionPasswordNeeded:
if password:
try:
await active_sessions[alice_user_id]['client'].check_password(password)
except BadRequest:
return BAD_LOGIN_OR_PASSWORD
else:
return BAD_LOGIN_OR_PASSWORD
conf = True
if type(conf) == bool and conf:
return OK_CODE
else:
return USER_NOT_EXISTS
async def login(alice_user_id: str, phone_number: str = False, password: str = False):
"""return BAD_LOGIN_OR_PASSWORD if phone number is invalid, return OK_CODE if .session file already exists, else return TWO_FACTOR_NEEDED"""
if os.path.isfile(f'sessions_tg/{alice_user_id}.session'):
active_sessions[alice_user_id] = dict()
active_sessions[alice_user_id]['client'] = Client(alice_user_id, API_ID, API_HASH, workdir='sessions_tg')
await active_sessions[alice_user_id]['client'].start()
return OK_CODE, True
if password:
active_sessions[alice_user_id] = {'client': Client(alice_user_id, API_ID, API_HASH, password=password, workdir='sessions_tg')}
else:
active_sessions[alice_user_id] = {'client': Client(alice_user_id, API_ID, API_HASH, workdir='sessions_tg')}
await active_sessions[alice_user_id]['client'].connect()
try:
sent_code_info = await active_sessions[alice_user_id]['client'].send_code(phone_number)
except BadRequest:
return BAD_LOGIN_OR_PASSWORD, False
active_sessions[alice_user_id]['phone_number'] = phone_number
active_sessions[alice_user_id]['sent_code_info'] = sent_code_info
active_sessions[alice_user_id]['password'] = password
return TWO_FACTOR_ERROR, True
использую их в следующем коде
code, success = await api.login(user_id, number, password)
if code == TWO_FACTOR_ERROR:
# через запрос получаю код в переменную command, этот кусок вырезал
code = await api.login_code(user_id, command)
на моменте, когда вызывается .sign_in() asyncio возвращает ошибку RuntimeError: Event loop is closed
при этом, если удалить возврат ошибки из кода asyncio, то простые примеры вполне работают, например
async def main():
if await login('ttt', '88005553535') != (OK_CODE, True):
code = input()
await login_code('ttt', code)
asyncio.run(main())
однако изменение кода asyncio, конечно, проблемы не решает
полный код есть на Ссылка удалена модератором.