看到神奇的用法, 趕快分享給大家.
範例是從json 檔取得 dict, 目的是要把json 或 dict 內容轉成 cookie 型別,
先來看 cookie class:
https://github.com/ultrafunkamsterdam/nodriver/blob/main/nodriver/cdp/network.py
@dataclass
class Cookie:
"""
Cookie object
"""
#: Cookie name.
name: str
#: Cookie value.
value: str
#: Cookie domain.
domain: str
#: Cookie path.
path: str
#: Cookie size.
size: int
#: True if cookie is http-only.
http_only: bool
#: True if cookie is secure.
secure: bool
#: True in case of session cookie.
session: bool
#: Cookie Priority
priority: CookiePriority
#: True if cookie is SameParty.
same_party: bool
#: Cookie source scheme type.
source_scheme: CookieSourceScheme
#: Cookie source port. Valid values are {-1, [1, 65535]}, -1 indicates an unspecified port.
#: An unspecified port value allows protocol clients to emulate legacy cookie scope for the port.
#: This is a temporary ability and it will be removed in the future.
source_port: int
#: Cookie expiration date as the number of seconds since the UNIX epoch.
expires: typing.Optional[float] = None
#: Cookie SameSite type.
same_site: typing.Optional[CookieSameSite] = None
#: Cookie partition key. The site of the top-level URL the browser was visiting at the start
#: of the request to the endpoint that set the cookie.
partition_key: typing.Optional[str] = None
#: True if cookie partition key is opaque.
partition_key_opaque: typing.Optional[bool] = None
def to_json(self) -> T_JSON_DICT:
json: T_JSON_DICT = dict()
json["name"] = self.name
json["value"] = self.value
json["domain"] = self.domain
json["path"] = self.path
json["size"] = self.size
json["httpOnly"] = self.http_only
json["secure"] = self.secure
json["session"] = self.session
json["priority"] = self.priority.to_json()
json["sameParty"] = self.same_party
json["sourceScheme"] = self.source_scheme.to_json()
json["sourcePort"] = self.source_port
if self.expires is not None:
json["expires"] = self.expires
if self.same_site is not None:
json["sameSite"] = self.same_site.to_json()
if self.partition_key is not None:
json["partitionKey"] = self.partition_key
if self.partition_key_opaque is not None:
json["partitionKeyOpaque"] = self.partition_key_opaque
return json
@classmethod
def from_json(cls, json: T_JSON_DICT) -> Cookie:
return cls(
name=str(json["name"]),
value=str(json["value"]),
domain=str(json["domain"]),
path=str(json["path"]),
size=int(json["size"]),
http_only=bool(json["httpOnly"]),
secure=bool(json["secure"]),
session=bool(json["session"]),
priority=CookiePriority.from_json(json["priority"]),
same_party=bool(json["sameParty"]),
source_scheme=CookieSourceScheme.from_json(json["sourceScheme"]),
source_port=int(json["sourcePort"]),
expires=(
float(json["expires"])
if json.get("expires", None) is not None
else None
),
same_site=(
CookieSameSite.from_json(json["sameSite"])
if json.get("sameSite", None) is not None
else None
),
partition_key=(
str(json["partitionKey"])
if json.get("partitionKey", None) is not None
else None
),
partition_key_opaque=(
bool(json["partitionKeyOpaque"])
if json.get("partitionKeyOpaque", None) is not None
else None
),
)
code 的呼叫點:
https://github.com/ultrafunkamsterdam/nodriver/blob/main/nodriver/cdp/storage.py
def get_cookies(
browser_context_id: typing.Optional[browser.BrowserContextID] = None,
) -> typing.Generator[T_JSON_DICT, T_JSON_DICT, typing.List[network.Cookie]]:
"""
Returns all browser cookies.
:param browser_context_id: *(Optional)* Browser context to use when called on the browser endpoint.
:returns: Array of cookie objects.
"""
params: T_JSON_DICT = dict()
if browser_context_id is not None:
params["browserContextId"] = browser_context_id.to_json()
cmd_dict: T_JSON_DICT = {
"method": "Storage.getCookies",
"params": params,
}
json = yield cmd_dict
return [network.Cookie.from_json(i) for i in json["cookies"]]
好神奇, 一行指令, 就完成轉換!
code 的呼叫點:
https://github.com/ultrafunkamsterdam/nodriver/blob/main/nodriver/core/browser.py
cookies = await connection.send(cdp.storage.get_cookies())