from httpx import AsyncClient from pydurian.sms.errors import ApiError, EmptyCode, EmptyPhoneError BASE_URL = "https://api.durianrcs.com/out/ext_api/" class SmsService: def __init__(self: "SmsService", user: str, project_id: str, api_key: str) -> None: self._user: str = user self._app_id: str = project_id self._api_key: str = api_key async def _send_request(self: "SmsService", path: str, params: dict[str, str]) -> dict | None: async with AsyncClient( base_url=BASE_URL, params={"name": self._user, "ApiKey": self._api_key, "pid": self._app_id}, ) as client: try: resp = await client.get(path, params=params) data: dict = resp.json() if resp.is_success: return data raise ApiError(data.get("msg")) # noqa: TRY301 except Exception as err: # noqa: E722 raise ApiError("can't connect") from err # noqa: TRY003 async def get_number( self: "SmsService", country_code: str = None, allow_banned: bool = False ) -> str: params = { "num": 1, "noblack": not allow_banned, "serial": 2, } if country_code: params["cuy"] = country_code data = await self._send_request( "getMobile", params, ) phone_number = data["data"] if not phone_number: raise EmptyPhoneError return phone_number async def get_code(self: "SmsService", phone_number: str) -> str: data = await self._send_request( "getMsg", params={ "pn": phone_number, "serial": 2, }, ) code = data["data"] if code == "": raise EmptyCode return code async def ban_phone_number(self: "SmsService", phone_number: str) -> str: data = await self._send_request( "addBlack", params={ "pn": phone_number, }, ) return data["msg"] async def release_phone_number(self: "SmsService", phone_number: str) -> None: data = await self._send_request( "passMobile", params={ "pn": phone_number, }, ) if data["code"] == 200: return raise ApiError(data["msg"]) async def get_country_numbers_count(self: "SmsService") -> dict: data = await self._send_request( "getCountryPhoneNum", params={ "vip": "null", }, ) if data["code"] != 200: raise ApiError(data["msg"]) return data["data"] async def get_user_info(self: "SmsService") -> dict: data = await self._send_request("getUserInfo", {}) if data["code"] != 200: raise ApiError(data["msg"]) return data["data"]