diff --git a/src/pymax/mixins/auth.py b/src/pymax/mixins/auth.py index 9b3f9a6..ccf9ebb 100644 --- a/src/pymax/mixins/auth.py +++ b/src/pymax/mixins/auth.py @@ -29,8 +29,48 @@ class AuthMixin(ClientProtocol): def _check_phone(self) -> bool: return bool(re.match(PHONE_REGEX, self.phone)) - - async def request_code(self, phone: str, language: str = "ru") -> str: + + def _split_phone(self, phone: str) -> str: + placeholder = "" + result = "" + digit_index = 0 + if phone.startswith("+7"): + result = "+7 " + placeholder = "000 000 00 00" + if phone.startswith("+375"): + result = "+375 " + placeholder = "00 000 00 00" + if phone.startswith("+994"): + result = "+994 " + placeholder = "00 000 00 00" + if phone.startswith("+374"): + result = "+374 " + placeholder = "00 000 000" + if phone.startswith("+995"): + result = "+995 " + placeholder = "000 00 00 00" + if phone.startswith("+996"): + result = "+996 " + placeholder = "000 000 000" + if phone.startswith("+373"): + result = "+373 " + placeholder = "0000 0000" + if phone.startswith("+992"): + result = "+992 " + placeholder = "00 000 0000" + if phone.startswith("+998"): + result = "+998 " + placeholder = "00 000 00 00" + phone = phone[len(result)-1:] + for char in placeholder: + if char == "0" and digit_index < len(phone): + result += phone[digit_index] + digit_index += 1 + elif char == " ": + result += " " + return result + + async def request_code(self, phone: str) -> str: """ Запрашивает код аутентификации для указанного номера телефона и возвращает временный токен. @@ -39,8 +79,6 @@ async def request_code(self, phone: str, language: str = "ru") -> str: :param phone: Номер телефона в международном формате. :type phone: str - :param language: Язык для сообщения с кодом. По умолчанию "ru". - :type language: str :return: Временный токен для дальнейшей аутентификации. :rtype: str :raises ValueError: Если полученные данные имеют неверный формат. @@ -52,7 +90,7 @@ async def request_code(self, phone: str, language: str = "ru") -> str: self.logger.info("Requesting auth code") payload = RequestCodePayload( - phone=phone, type=AuthType.START_AUTH, language=language + phone=self._split_phone(phone), type=AuthType.START_AUTH ).model_dump(by_alias=True) data = await self._send_and_wait(opcode=Opcode.AUTH_REQUEST, payload=payload) @@ -72,14 +110,12 @@ async def request_code(self, phone: str, language: str = "ru") -> str: self.logger.error("Invalid payload data received") raise ValueError("Invalid payload data received") - async def resend_code(self, phone: str, language: str = "ru") -> str: + async def resend_code(self, phone: str) -> str: """ Повторно запрашивает код аутентификации для указанного номера телефона и возвращает временный токен. :param phone: Номер телефона в международном формате. :type phone: str - :param language: Язык для сообщения с кодом. По умолчанию "ru". - :type language: str :return: Временный токен для дальнейшей аутентификации. :rtype: str :raises ValueError: Если полученные данные имеют неверный формат. @@ -88,7 +124,7 @@ async def resend_code(self, phone: str, language: str = "ru") -> str: self.logger.info("Resending auth code") payload = RequestCodePayload( - phone=phone, type=AuthType.RESEND, language=language + phone=self._split_phone(phone), type=AuthType.RESEND ).model_dump(by_alias=True) data = await self._send_and_wait(opcode=Opcode.AUTH_REQUEST, payload=payload) diff --git a/src/pymax/mixins/socket.py b/src/pymax/mixins/socket.py index e52fcb2..df3cf41 100644 --- a/src/pymax/mixins/socket.py +++ b/src/pymax/mixins/socket.py @@ -212,7 +212,7 @@ def _perform_ssl_handshake(self, raw_sock: socket.socket) -> socket.socket: suppress_ragged_eofs=True, ) wrapped.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) - wrapped.setblocking(False) + wrapped.setblocking(True) return wrapped except ssl.SSLError as e: self.logger.error("SSL handshake failed: %s", e) diff --git a/src/pymax/payloads.py b/src/pymax/payloads.py index e94bb36..7ccd1ba 100644 --- a/src/pymax/payloads.py +++ b/src/pymax/payloads.py @@ -56,7 +56,6 @@ class UserAgentPayload(CamelModel): class RequestCodePayload(CamelModel): phone: str type: AuthType = AuthType.START_AUTH - language: str = "ru" class SendCodePayload(CamelModel): diff --git a/src/pymax/static/constant.py b/src/pymax/static/constant.py index 6feed26..23b53a4 100644 --- a/src/pymax/static/constant.py +++ b/src/pymax/static/constant.py @@ -76,11 +76,11 @@ DEFAULT_LOCALE: Final[str] = "ru" DEFAULT_DEVICE_LOCALE: Final[str] = "ru" DEFAULT_DEVICE_NAME: Final[str] = choice(DEVICE_NAMES) -DEFAULT_APP_VERSION: Final[str] = "25.12.14" +DEFAULT_APP_VERSION: Final[str] = "25.21.0" DEFAULT_SCREEN: Final[str] = choice(SCREEN_SIZES) DEFAULT_OS_VERSION: Final[str] = choice(OS_VERSIONS) DEFAULT_USER_AGENT: Final[str] = ua_generator.generate().text -DEFAULT_BUILD_NUMBER: Final[int] = 0x97CB +DEFAULT_BUILD_NUMBER: Final[int] = 0x9E2A DEFAULT_CLIENT_SESSION_ID: Final[int] = randint(1, 15) DEFAULT_TIMEZONE: Final[str] = choice(TIMEZONES) DEFAULT_CHAT_MEMBERS_LIMIT: Final[int] = 50