Ошибка конвертации 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 шт):
Лезем в исходник этого 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}')
Ну и дальше бы смотрел, что напечатается или выведется в лог. И дальше бы с этим уже разбирался - что, почему и как. Сейчас информации мягко говоря недостаточно.
Мне помог фикс.
В библиотеке opentele/td/account.py
поменять:
raise TDataReadMapDataFailed(
f"Unknown key type in encrypted map: {keyType}"
)
на:
logging.warning(f"Unknown key type in encrypted map: {keyType}")