Ошибка конвертации opentele (tdata-session)

Скрипт конвертации работает отлично, но на нескольких конкретных аккаунтах он выдает ошибку. При авторизации аккаунта сразу в Telethon и конвертации telethon(session)->tdata всё работает хорошо, но даже эту полученную tdata нельзя вернуть в session с этой же ошибкой.

ВОПРОС СЛЕДУЮЩИЙ: Что именно в аккаунте приводит к такой ошибке?

Прошу ответить тех кто знает как это работает, т.к. многие сталкиваются и не могут понять в чем проблема.

Ошибка:

tdesk = TDesktop(tdataFolder)
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 141, in __init__ 
    self.LoadTData()
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 216, in LoadTData
    raise e
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 203, in LoadTData
    self.__loadFromTData()
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData
    Expects(len(self.accounts) > 0, "No account has been loaded")
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\exception.py", line 326, in Expects
    raise exception
  File "C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\tdesktop.py", line 453, in __loadFromTData
    Expects(len(self.accounts) > 0, "No account has been loaded")
opentele.exception.OpenTeleException: Unexpected Exception: No account has been loaded [ Called by BaseObject.TDesktop.__loadFromTData() ]

Ответы (2 шт):

Автор решения: CrazyElf

Лезем в исходник этого tdesktop.py, только у вас который локально лежит в каталоге

C:\Users\Alex\AppData\Roaming\Python\Python38\site-packages\opentele\td\

Нас интересует цикл перед вот этой строкой из ошибки:

Expects(len(self.accounts) > 0, "No account has been loaded")

Смотрим код:

        Expects(count > 0, "accountsCount is zero, the data might has been corrupted")

        for i in range(count):
            index = info.stream.readInt32()
            if (index >= 0) and (index < TDesktop.kMaxAccounts):
                try:
                    account = td.Account(
                        self,
                        basePath=self.basePath,
                        api=self.api,
                        keyFile=self.keyFile,
                        index=index,
                    )
                    account.prepareToStart(self.__localKey)

                    if account.isLoaded():
                        self.accounts.append(account)

                except OpenTeleException as e:
                    pass

        Expects(len(self.accounts) > 0, "No account has been loaded")

Ага, перед вылетающей проверкой и циклом есть ещё одна проверка, которая успешно проходится. count не нулевой, значит что-то в цикле обрабатывается. При этом исключение "проглатывается" и прочие проблемные места никак не обрабатываются. Ну я бы накидал там отладочной печати или логирования везде подряд. Например, отладочная печать через добавленные вызовы print (в конце этого фрагмента кода):

        for i in range(count):
            index = info.stream.readInt32()
            if (index >= 0) and (index < TDesktop.kMaxAccounts):
                try:
                    account = td.Account(
                        self,
                        basePath=self.basePath,
                        api=self.api,
                        keyFile=self.keyFile,
                        index=index,
                    )
                    account.prepareToStart(self.__localKey)

                    if account.isLoaded():
                        self.accounts.append(account)
                    else:
                        print('Аккаунт почему-то не isLoaded')

                except OpenTeleException as e:
                    print('ОШИБКА!!!', e)
            else:
                print(f'Некорректный index: {index}')

Ну и дальше бы смотрел, что напечатается или выведется в лог. И дальше бы с этим уже разбирался - что, почему и как. Сейчас информации мягко говоря недостаточно.

→ Ссылка
Автор решения: rooler

Мне помог фикс.
В библиотеке opentele/td/account.py поменять:

raise TDataReadMapDataFailed(
    f"Unknown key type in encrypted map: {keyType}"
)

на:

logging.warning(f"Unknown key type in encrypted map: {keyType}")
→ Ссылка