@VagaColeso39

Почему в pyrogram метод sign_in() вызывает ошибку в asyncio?

я пишу сервер(навык для алисы) являющийся этаким 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, конечно, проблемы не решает
полный код есть на Ссылка удалена модератором.
  • Вопрос задан
  • 94 просмотра
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы