diff --git a/pyproject.toml b/pyproject.toml index c81edbb..7a62260 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -3,7 +3,7 @@ name = "scrapybara" [tool.poetry] name = "scrapybara" -version = "2.3.5" +version = "2.3.6" description = "" readme = "README.md" authors = [] diff --git a/reference.md b/reference.md index 90ff350..b2628fa 100644 --- a/reference.md +++ b/reference.md @@ -49,6 +49,14 @@ client.start()
+**blocked_domains:** `typing.Optional[typing.Sequence[str]]` + +
+
+ +
+
+ **request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration.
@@ -861,6 +869,62 @@ client.browser.get_cdp_url(
+ + + + +
client.browser.get_current_url(...) +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```python +from scrapybara import Scrapybara + +client = Scrapybara( + api_key="YOUR_API_KEY", +) +client.browser.get_current_url( + instance_id="instance_id", +) + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**instance_id:** `str` + +
+
+ +
+
+ +**request_options:** `typing.Optional[RequestOptions]` — Request-specific configuration. + +
+
+
+
+ +
diff --git a/src/scrapybara/__init__.py b/src/scrapybara/__init__.py index a892df8..3787602 100644 --- a/src/scrapybara/__init__.py +++ b/src/scrapybara/__init__.py @@ -5,6 +5,7 @@ BashResponse, BrowserAuthenticateResponse, BrowserGetCdpUrlResponse, + BrowserGetCurrentUrlResponse, Button, CellType, ClickMouseAction, @@ -67,6 +68,7 @@ "BashResponse", "BrowserAuthenticateResponse", "BrowserGetCdpUrlResponse", + "BrowserGetCurrentUrlResponse", "Button", "CellType", "ClickMouseAction", diff --git a/src/scrapybara/base_client.py b/src/scrapybara/base_client.py index 44799b9..d0edfa8 100644 --- a/src/scrapybara/base_client.py +++ b/src/scrapybara/base_client.py @@ -107,6 +107,7 @@ def start( *, instance_type: typing.Optional[DeploymentConfigInstanceType] = OMIT, timeout_hours: typing.Optional[float] = OMIT, + blocked_domains: typing.Optional[typing.Sequence[str]] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> GetInstanceResponse: """ @@ -116,6 +117,8 @@ def start( timeout_hours : typing.Optional[float] + blocked_domains : typing.Optional[typing.Sequence[str]] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -139,6 +142,7 @@ def start( json={ "instance_type": instance_type, "timeout_hours": timeout_hours, + "blocked_domains": blocked_domains, }, headers={ "content-type": "application/json", @@ -383,6 +387,7 @@ async def start( *, instance_type: typing.Optional[DeploymentConfigInstanceType] = OMIT, timeout_hours: typing.Optional[float] = OMIT, + blocked_domains: typing.Optional[typing.Sequence[str]] = OMIT, request_options: typing.Optional[RequestOptions] = None, ) -> GetInstanceResponse: """ @@ -392,6 +397,8 @@ async def start( timeout_hours : typing.Optional[float] + blocked_domains : typing.Optional[typing.Sequence[str]] + request_options : typing.Optional[RequestOptions] Request-specific configuration. @@ -423,6 +430,7 @@ async def main() -> None: json={ "instance_type": instance_type, "timeout_hours": timeout_hours, + "blocked_domains": blocked_domains, }, headers={ "content-type": "application/json", diff --git a/src/scrapybara/browser/client.py b/src/scrapybara/browser/client.py index b9add3c..1d6fe94 100644 --- a/src/scrapybara/browser/client.py +++ b/src/scrapybara/browser/client.py @@ -11,6 +11,7 @@ from json.decoder import JSONDecodeError from ..core.api_error import ApiError from ..types.browser_get_cdp_url_response import BrowserGetCdpUrlResponse +from ..types.browser_get_current_url_response import BrowserGetCurrentUrlResponse from ..types.save_browser_auth_response import SaveBrowserAuthResponse from ..types.modify_browser_auth_response import ModifyBrowserAuthResponse from ..types.browser_authenticate_response import BrowserAuthenticateResponse @@ -134,6 +135,62 @@ def get_cdp_url( raise ApiError(status_code=_response.status_code, body=_response.text) raise ApiError(status_code=_response.status_code, body=_response_json) + def get_current_url( + self, instance_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + """ + Parameters + ---------- + instance_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + BrowserGetCurrentUrlResponse + Successful Response + + Examples + -------- + from scrapybara import Scrapybara + + client = Scrapybara( + api_key="YOUR_API_KEY", + ) + client.browser.get_current_url( + instance_id="instance_id", + ) + """ + _response = self._client_wrapper.httpx_client.request( + f"v1/instance/{jsonable_encoder(instance_id)}/browser/current_url", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + BrowserGetCurrentUrlResponse, + parse_obj_as( + type_=BrowserGetCurrentUrlResponse, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 422: + raise UnprocessableEntityError( + typing.cast( + HttpValidationError, + parse_obj_as( + type_=HttpValidationError, # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + def save_auth( self, instance_id: str, @@ -518,6 +575,70 @@ async def main() -> None: raise ApiError(status_code=_response.status_code, body=_response.text) raise ApiError(status_code=_response.status_code, body=_response_json) + async def get_current_url( + self, instance_id: str, *, request_options: typing.Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + """ + Parameters + ---------- + instance_id : str + + request_options : typing.Optional[RequestOptions] + Request-specific configuration. + + Returns + ------- + BrowserGetCurrentUrlResponse + Successful Response + + Examples + -------- + import asyncio + + from scrapybara import AsyncScrapybara + + client = AsyncScrapybara( + api_key="YOUR_API_KEY", + ) + + + async def main() -> None: + await client.browser.get_current_url( + instance_id="instance_id", + ) + + + asyncio.run(main()) + """ + _response = await self._client_wrapper.httpx_client.request( + f"v1/instance/{jsonable_encoder(instance_id)}/browser/current_url", + method="GET", + request_options=request_options, + ) + try: + if 200 <= _response.status_code < 300: + return typing.cast( + BrowserGetCurrentUrlResponse, + parse_obj_as( + type_=BrowserGetCurrentUrlResponse, # type: ignore + object_=_response.json(), + ), + ) + if _response.status_code == 422: + raise UnprocessableEntityError( + typing.cast( + HttpValidationError, + parse_obj_as( + type_=HttpValidationError, # type: ignore + object_=_response.json(), + ), + ) + ) + _response_json = _response.json() + except JSONDecodeError: + raise ApiError(status_code=_response.status_code, body=_response.text) + raise ApiError(status_code=_response.status_code, body=_response_json) + async def save_auth( self, instance_id: str, diff --git a/src/scrapybara/client.py b/src/scrapybara/client.py index f5aa4ea..7d4d55c 100644 --- a/src/scrapybara/client.py +++ b/src/scrapybara/client.py @@ -31,6 +31,7 @@ AuthStateResponse, BrowserAuthenticateResponse, BrowserGetCdpUrlResponse, + BrowserGetCurrentUrlResponse, Button, ClickMouseActionClickType, ComputerResponse, @@ -136,6 +137,13 @@ def get_cdp_url( return self._client.browser.get_cdp_url( self.instance_id, request_options=request_options ) + + def get_current_url( + self, request_options: Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + return self._client.browser.get_current_url( + self.instance_id, request_options=request_options + ) def save_auth( self, @@ -196,6 +204,13 @@ async def get_cdp_url( return await self._client.browser.get_cdp_url( self.instance_id, request_options=request_options ) + + async def get_current_url( + self, request_options: Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + return await self._client.browser.get_current_url( + self.instance_id, request_options=request_options + ) async def save_auth( self, @@ -1020,6 +1035,13 @@ def get_cdp_url( return self._client.browser.get_cdp_url( self.id, request_options=request_options ) + + def get_current_url( + self, request_options: Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + return self._client.browser.get_current_url( + self.id, request_options=request_options + ) def save_auth( self, @@ -1460,6 +1482,13 @@ async def get_cdp_url( return await self._client.browser.get_cdp_url( self.id, request_options=request_options ) + + async def get_current_url( + self, request_options: Optional[RequestOptions] = None + ) -> BrowserGetCurrentUrlResponse: + return await self._client.browser.get_current_url( + self.id, request_options=request_options + ) async def save_auth( self, @@ -1534,11 +1563,13 @@ def start_ubuntu( self, *, timeout_hours: Optional[float] = OMIT, + blocked_domains: Optional[Sequence[str]] = OMIT, request_options: Optional[RequestOptions] = None, ) -> UbuntuInstance: response = self._base_client.start( instance_type="ubuntu", timeout_hours=timeout_hours, + blocked_domains=blocked_domains, request_options=request_options, ) return UbuntuInstance( @@ -1552,11 +1583,13 @@ def start_browser( self, *, timeout_hours: Optional[float] = OMIT, + blocked_domains: Optional[Sequence[str]] = OMIT, request_options: Optional[RequestOptions] = None, ) -> BrowserInstance: response = self._base_client.start( instance_type="browser", timeout_hours=timeout_hours, + blocked_domains=blocked_domains, request_options=request_options, ) return BrowserInstance( @@ -1946,11 +1979,13 @@ async def start_ubuntu( self, *, timeout_hours: Optional[float] = OMIT, + blocked_domains: Optional[Sequence[str]] = OMIT, request_options: Optional[RequestOptions] = None, ) -> AsyncUbuntuInstance: response = await self._base_client.start( instance_type="ubuntu", timeout_hours=timeout_hours, + blocked_domains=blocked_domains, request_options=request_options, ) return AsyncUbuntuInstance( @@ -1964,11 +1999,13 @@ async def start_browser( self, *, timeout_hours: Optional[float] = OMIT, + blocked_domains: Optional[Sequence[str]] = OMIT, request_options: Optional[RequestOptions] = None, ) -> AsyncBrowserInstance: response = await self._base_client.start( instance_type="browser", timeout_hours=timeout_hours, + blocked_domains=blocked_domains, request_options=request_options, ) return AsyncBrowserInstance( diff --git a/src/scrapybara/core/client_wrapper.py b/src/scrapybara/core/client_wrapper.py index 8831014..2579bf6 100644 --- a/src/scrapybara/core/client_wrapper.py +++ b/src/scrapybara/core/client_wrapper.py @@ -16,7 +16,7 @@ def get_headers(self) -> typing.Dict[str, str]: headers: typing.Dict[str, str] = { "X-Fern-Language": "Python", "X-Fern-SDK-Name": "scrapybara", - "X-Fern-SDK-Version": "2.3.5", + "X-Fern-SDK-Version": "2.3.6", } headers["x-api-key"] = self.api_key return headers diff --git a/src/scrapybara/types/__init__.py b/src/scrapybara/types/__init__.py index 5179743..93d8c21 100644 --- a/src/scrapybara/types/__init__.py +++ b/src/scrapybara/types/__init__.py @@ -3,6 +3,7 @@ from .bash_response import BashResponse from .browser_authenticate_response import BrowserAuthenticateResponse from .browser_get_cdp_url_response import BrowserGetCdpUrlResponse +from .browser_get_current_url_response import BrowserGetCurrentUrlResponse from .button import Button from .cell_type import CellType from .click_mouse_action import ClickMouseAction @@ -78,6 +79,7 @@ "BashResponse", "BrowserAuthenticateResponse", "BrowserGetCdpUrlResponse", + "BrowserGetCurrentUrlResponse", "Button", "CellType", "ClickMouseAction", diff --git a/src/scrapybara/types/browser_get_current_url_response.py b/src/scrapybara/types/browser_get_current_url_response.py new file mode 100644 index 0000000..3aa6a83 --- /dev/null +++ b/src/scrapybara/types/browser_get_current_url_response.py @@ -0,0 +1,19 @@ +# This file was auto-generated by Fern from our API Definition. + +from ..core.pydantic_utilities import UniversalBaseModel +from ..core.pydantic_utilities import IS_PYDANTIC_V2 +import typing +import pydantic + + +class BrowserGetCurrentUrlResponse(UniversalBaseModel): + current_url: str + + if IS_PYDANTIC_V2: + model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2 + else: + + class Config: + frozen = True + smart_union = True + extra = pydantic.Extra.allow