diff --git a/yandex_music/client.py b/yandex_music/client.py index b5ec481..b5d5f20 100644 --- a/yandex_music/client.py +++ b/yandex_music/client.py @@ -8,7 +8,7 @@ from yandex_music import YandexMusicObject, Status, Settings, PermissionAlerts, ArtistAlbums from yandex_music.utils.request import Request from yandex_music.utils.difference import Difference -from yandex_music.exceptions import InvalidToken +from yandex_music.exceptions import InvalidToken, Captcha CLIENT_ID = '23cabbbdc6cd418abb4b39c32c41195d' CLIENT_SECRET = '53bc75238f0c4d08a118e51fe9203300' @@ -86,7 +86,8 @@ class Client(YandexMusicObject): self.account = self.account_status().account @classmethod - def from_credentials(cls, username, password, x_captcha_answer=None, x_captcha_key=None, *args, **kwargs): + def from_credentials(cls, username, password, x_captcha_answer=None, x_captcha_key=None, captch_callback=None, + *args, **kwargs): """Инициализция клиента по логину и паролю. Данный метод получает токен каждый раз при вызове. Рекомендуется сгенерировать его самостоятельно, сохранить и @@ -97,14 +98,28 @@ class Client(YandexMusicObject): password (:obj:`str`): Пароль клиента (аутентификатор). x_captcha_answer (:obj:`str`, optional): Ответ на капчу (цифры с картинки). x_captcha_key (:obj:`str`, optional): Уникальный ключ капчи. + captch_callback (:obj:`function`, optional): Функция обратного вызова для обработки капчи, должна + принимать объект класса :class:`yandex_music.exceptions.Captcha` и возвращать строку с кодом. **kwargs (:obj:`dict`, optional): Аргументы для конструктора клиента. Returns: :obj:`yandex_music.Client`. """ - return cls(cls().generate_token_by_username_and_password(username, password, x_captcha_answer=x_captcha_answer, - x_captcha_key=x_captcha_key), *args, **kwargs) + token = x_captcha_key = x_captcha_answer = None + if captch_callback: + while not token: + try: + token = cls().generate_token_by_username_and_password(username, password, x_captcha_answer=x_captcha_answer, + x_captcha_key=x_captcha_key, captch_callback=captch_callback) + except Captcha as e: + x_captcha_answer = captch_callback(e.captcha) + x_captcha_key = e.captcha.x_captcha_key + else: + token = cls().generate_token_by_username_and_password(username, password, x_captcha_answer=x_captcha_answer, + x_captcha_key=x_captcha_key, captch_callback=captch_callback) + + return cls(token, *args, **kwargs) @classmethod def from_token(cls, token, *args, **kwargs):