From e2721ec40d4d3349ce421cd2e74debedab2934f8 Mon Sep 17 00:00:00 2001 From: BoryaGames <67229357+BoryaGames@users.noreply.github.com> Date: Sat, 3 Jan 2026 06:45:20 -0800 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9A=D1=80=D0=B8=D1=82=D0=B8=D1=87=D0=B5?= =?UTF-8?q?=D1=81=D0=BA=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B8=D1=8F=20=D1=81=D0=BE=D0=BA=D0=B5=D1=82?= =?UTF-8?q?=D0=B0/=D0=B2=D1=85=D0=BE=D0=B4=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pymax/mixins/auth.py | 14 ++++++-------- src/pymax/mixins/socket.py | 2 +- src/pymax/payloads.py | 1 - src/pymax/static/constant.py | 4 ++-- 4 files changed, 9 insertions(+), 12 deletions(-) diff --git a/src/pymax/mixins/auth.py b/src/pymax/mixins/auth.py index 9b3f9a6..9787872 100644 --- a/src/pymax/mixins/auth.py +++ b/src/pymax/mixins/auth.py @@ -30,7 +30,7 @@ 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: + async def request_code(self, phone: str) -> str: """ Запрашивает код аутентификации для указанного номера телефона и возвращает временный токен. @@ -39,8 +39,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: Если полученные данные имеют неверный формат. @@ -51,8 +49,9 @@ async def request_code(self, phone: str, language: str = "ru") -> str: """ self.logger.info("Requesting auth code") + split_phone = phone[0:2] + " " + phone[2:5] + " " + phone[5:8] + " " + phone[8:10] + " " + phone[10:12] payload = RequestCodePayload( - phone=phone, type=AuthType.START_AUTH, language=language + phone=split_phone, type=AuthType.START_AUTH ).model_dump(by_alias=True) data = await self._send_and_wait(opcode=Opcode.AUTH_REQUEST, payload=payload) @@ -72,14 +71,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: Если полученные данные имеют неверный формат. @@ -87,8 +84,9 @@ async def resend_code(self, phone: str, language: str = "ru") -> str: """ self.logger.info("Resending auth code") + split_phone = phone[0:2] + " " + phone[2:5] + " " + phone[5:8] + " " + phone[8:10] + " " + phone[10:12] payload = RequestCodePayload( - phone=phone, type=AuthType.RESEND, language=language + phone=split_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 From 34ab6c1508e59a6d73af8171aeb5219f0c8433d5 Mon Sep 17 00:00:00 2001 From: BoryaGames <67229357+BoryaGames@users.noreply.github.com> Date: Sat, 3 Jan 2026 07:12:35 -0800 Subject: [PATCH 2/2] =?UTF-8?q?=D0=A3=D0=BB=D1=83=D1=87=D1=88=D0=B8=D0=BB?= =?UTF-8?q?=20=D1=80=D0=B0=D0=B7=D0=B4=D0=B5=D0=BB=D0=B5=D0=BD=D0=B8=D0=B5?= =?UTF-8?q?=20=D0=BD=D0=BE=D0=BC=D0=B5=D1=80=D0=B0=20=D1=82=D0=B5=D0=BB?= =?UTF-8?q?=D0=B5=D1=84=D0=BE=D0=BD=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pymax/mixins/auth.py | 46 ++++++++++++++++++++++++++++++++++++---- 1 file changed, 42 insertions(+), 4 deletions(-) diff --git a/src/pymax/mixins/auth.py b/src/pymax/mixins/auth.py index 9787872..ccf9ebb 100644 --- a/src/pymax/mixins/auth.py +++ b/src/pymax/mixins/auth.py @@ -29,6 +29,46 @@ class AuthMixin(ClientProtocol): def _check_phone(self) -> bool: return bool(re.match(PHONE_REGEX, self.phone)) + + 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: """ @@ -49,9 +89,8 @@ async def request_code(self, phone: str) -> str: """ self.logger.info("Requesting auth code") - split_phone = phone[0:2] + " " + phone[2:5] + " " + phone[5:8] + " " + phone[8:10] + " " + phone[10:12] payload = RequestCodePayload( - phone=split_phone, type=AuthType.START_AUTH + 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) @@ -84,9 +123,8 @@ async def resend_code(self, phone: str) -> str: """ self.logger.info("Resending auth code") - split_phone = phone[0:2] + " " + phone[2:5] + " " + phone[5:8] + " " + phone[8:10] + " " + phone[10:12] payload = RequestCodePayload( - phone=split_phone, type=AuthType.RESEND + 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)