From 500792975e3a3e42192d544da7ac67c452d78b17 Mon Sep 17 00:00:00 2001 From: Lonami Exo Date: Fri, 30 Mar 2018 12:18:18 +0200 Subject: [PATCH] Handle AUTH_KEY_DUPLICATED on connection --- telethon/errors/__init__.py | 3 +++ telethon/errors/rpc_base_errors.py | 13 +++++++++++++ telethon/telegram_bare_client.py | 11 ++++++++++- telethon_generator/error_generator.py | 1 + 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/telethon/errors/__init__.py b/telethon/errors/__init__.py index 9126aca3..d9875849 100644 --- a/telethon/errors/__init__.py +++ b/telethon/errors/__init__.py @@ -78,6 +78,9 @@ def rpc_message_to_error(code, message, report_method=None): if code == 404: return NotFoundError(message) + if code == 406: + return AuthKeyError(message) + if code == 500: return ServerError(message) diff --git a/telethon/errors/rpc_base_errors.py b/telethon/errors/rpc_base_errors.py index 467b256c..d2db5439 100644 --- a/telethon/errors/rpc_base_errors.py +++ b/telethon/errors/rpc_base_errors.py @@ -56,6 +56,19 @@ class NotFoundError(RPCError): self.message = message +class AuthKeyError(RPCError): + """ + Errors related to invalid authorization key, like + AUTH_KEY_DUPLICATED which can cause the connection to fail. + """ + code = 406 + message = 'AUTH_KEY' + + def __init__(self, message): + super().__init__(message) + self.message = message + + class FloodError(RPCError): """ The maximum allowed number of attempts to invoke the given method diff --git a/telethon/telegram_bare_client.py b/telethon/telegram_bare_client.py index 8281f869..a8a43774 100644 --- a/telethon/telegram_bare_client.py +++ b/telethon/telegram_bare_client.py @@ -11,7 +11,7 @@ from .crypto import rsa from .errors import ( RPCError, BrokenAuthKeyError, ServerError, FloodWaitError, FloodTestPhoneWaitError, TypeNotFoundError, UnauthorizedError, - PhoneMigrateError, NetworkMigrateError, UserMigrateError + PhoneMigrateError, NetworkMigrateError, UserMigrateError, AuthKeyError ) from .network import authenticator, MtProtoSender, Connection, ConnectionMode from .sessions import Session, SQLiteSession @@ -227,6 +227,15 @@ class TelegramBareClient: self.disconnect() return self.connect(_sync_updates=_sync_updates) + except AuthKeyError as e: + # As of late March 2018 there were two AUTH_KEY_DUPLICATED + # reports. Retrying with a clean auth_key should fix this. + __log__.warning('Auth key error %s. Clearing it and retrying.', e) + self.disconnect() + self.session.auth_key = None + self.session.save() + return self.connect(_sync_updates=_sync_updates) + except (RPCError, ConnectionError) as e: # Probably errors from the previous session, ignore them __log__.error('Connection failed due to %s', e) diff --git a/telethon_generator/error_generator.py b/telethon_generator/error_generator.py index 73fb5c5a..4aad78ec 100644 --- a/telethon_generator/error_generator.py +++ b/telethon_generator/error_generator.py @@ -11,6 +11,7 @@ known_base_classes = { 401: 'UnauthorizedError', 403: 'ForbiddenError', 404: 'NotFoundError', + 406: 'AuthKeyError', 420: 'FloodError', 500: 'ServerError', }