Почему процесс авторизации в Telethon зависает во время двухфакторной аутентификации?

Я сталкиваюсь с проблемой при переходе на Telethon из-за отсутствия обновлений в Pyrogram. При попытке авторизации отсутствует запрос на ввод двухфакторного пароля. Сначала я ввожу номер телефона, затем получаю код на аккаунт, ввожу его в программу, и после этого ничего не происходит. Я также пробовал вручную обработать исключение, но это не помогло. 

Вот фрагмент кода, который я использую:

```python
from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError

api_id = ...
api_hash = ...

client = TelegramClient('my_session', api_id, api_hash)

async def main():
    try:
        await client.start()
    except SessionPasswordNeededError:
        password = input("Введите пароль для двухфакторной аутентификации: ")
        await client.sign_in(password=password)

    me = await client.get_me()
    print(me.stringify())

with client:
    client.loop.run_until_complete(main())
```

Какова может быть причина этой проблемы и как её можно исправить?
  • 30 сентября 2024 г. 14:53
Ответы на вопрос 2
Причина, по которой ваш код зависает во время двухфакторной аутентификации, может быть связана с тем, что метод `client.start()` не завершает выполнение в случае, если требуется ввести пароль для двухфакторной аутентификации. При этом вы не обрабатываете возможность, что после ввода кода из SMS, может потребоваться дальнейшая аутентификация.

Вот как можно переписать ваш код, чтобы он корректно обрабатывал ситуацию с двухфакторной аутентификацией:

```python
from telethon import TelegramClient
from telethon.errors import SessionPasswordNeededError

api_id = ...
api_hash = ...

client = TelegramClient('my_session', api_id, api_hash)

async def main():
    await client.start()

    me = await client.get_me()
    print(me.stringify())

async def login():
    try:
        async with client:
            await main()
    except SessionPasswordNeededError:
        password = input("Введите пароль для двухфакторной аутентификации: ")
        await client.sign_in(password=password)
        await main()  # Призыв к основному методу снова для завершения работы

if __name__ == "__main__":
    client.loop.run_until_complete(login())
```

### Объяснение изменений:
1. **Создан отдельный метод `login()`**: Этот метод отвечает за обработку входа, что позволяет упростить логику.
2. **Вызов `main()` после входа**: После успешного ввода пароля, вы снова вызываете метод `main()`, чтобы получить информацию о пользователе.

### Примечания:
- Убедитесь, что у вас установлена последняя версия Telethon, так как со временем могут происходить изменения, исправляющие подобные ошибки.
- Если все равно не срабатывает двухфакторная аутентификация, попробуйте добавить дополнительные логи (например, через `print()`) для отладки состояния на разных этапах процесса аутентификации.
Попробуйте поставить брейкпойнт (точку останова) на 15 строчку (где у вас следующий код): 
await client.sign_in(password=password)
И запустите программу под дебаггером. По идее вам дебаггер по шагам покажет какой код выполняется и будет понятно почему все зависло.
Похожие вопросы