class BilibiliClient:
def __init__(
self,
timeout=10,
proxies=None,
*,
headers: Dict[str, str],
playwright_page: Page,
cookie_dict: Dict[str, str],
):
self.proxies = proxies
self.timeout = timeout
self.headers = headers
self._host = "https://api.bilibili.com"
self.playwright_page = playwright_page
self.cookie_dict = cookie_dict
这段代码定义了一个名为BilibiliClient
的类,它具有一个初始化方法__init__
。让我来逐行解释一下:
-
def __init__(self, timeout=10, proxies=None, *, headers: Dict[str, str], playwright_page: Page, cookie_dict: Dict[str, str]):
- 这是初始化方法的定义,它接受一些参数,包括timeout
、proxies
、headers
、playwright_page
和cookie_dict
。其中headers
、playwright_page
和cookie_dict
是必须使用关键字参数传入的。 -
self.proxies = proxies
- 这行代码将传入的proxies
赋值给类的proxies
属性。 -
self.timeout = timeout
- 这行代码将传入的timeout
赋值给类的timeout
属性。 -
self.headers = headers
- 这行代码将传入的headers
赋值给类的headers
属性。 -
self._host = "https://api.bilibili.com"
- 这行代码将字符串"https://api.bilibili.com"赋值给类的_host
属性。 -
self.playwright_page = playwright_page
- 这行代码将传入的playwright_page
赋值给类的playwright_page
属性。 -
self.cookie_dict = cookie_dict
- 这行代码将传入的cookie_dict
赋值给类的cookie_dict
属性。
这个类的作用可能是作为一个Bilibili的客户端,用于与Bilibili的API进行交互,其中包括设置请求的超时时间、代理、请求头、页面对象和Cookie等信息。
async def request(self, method, url, **kwargs) -> Any:
async with httpx.AsyncClient(proxies=self.proxies) as client:
response = await client.request(
method, url, timeout=self.timeout,
**kwargs
)
data: Dict = response.json()
if data.get("code") != 0:
raise DataFetchError(data.get("message", "unkonw error"))
else:
return data.get("data", {
})
这段代码定义了一个名为request
的异步方法,用于向指定的URL发起HTTP请求。让我来逐行解释一下:
-
async def request(self, method, url, **kwargs) -> Any:
- … … 这是一个异步方法的定义,它接受method
(请求方法)、url
(请求的URL)和kwargs
(其他请求参数)作为参数,并且返回一个Any
类型的值。 -
async with httpx.AsyncClient(proxies=self.proxies) as client:
- 这行代码创建了一个异步的httpx.AsyncClient
对象,用于发送HTTP请求,并使用了类中定义的proxies
属性作为代理。 -
response = await client.request(method, url, timeout=self.timeout, **kwargs)
- 这行代码使用client
对象发送HTTP请求,其中包括指定的请求方法、URL、超时时间和其他参数。 -
data: Dict = response.json()
- 这行代码将HTTP响应的JSON数据解析为Python字典类型,并赋值给data
变量。 -
if data.get("code") != 0:
- 这行代码检查响应数据中的code
字段是否为0,如果不是,则抛出一个DataFetchError
异常,异常消息为响应数据中的message
字段,如果没有则为"unknown error"。 -
return data.get("data", {})
- 如果响应数据中的code
字段为0,则返回响应数据中的data
字段,如果没有则返回一个空字典。
整体来说,这段代码的作用是向指定的URL发起HTTP请求,并处理响应数据,如果响应中的code
字段不为0,则抛出一个自定义的DataFetchError
异常,否则返回响应数据中的data
字段。
async def pre_request_data(self, req_data: Dict) -> Dict:
"""
发送请求进行请求参数签名
需要从 localStorage 拿 wbi_img_urls 这参数,值如下:
https://i0.hdslb.com/bfs/wbi/7cd084941338484aae1ad9425b84077c.png-https://i0.hdslb.com/bfs/wbi/4932caff0ff746e