DynamicAdaptor
用于将bilibili的grpc动态和web动态转换成特定的数据类型
原理说明
将grpc数据转换成json数据,之后使用pydantic进行信息摘要。 web端的json数据同理
下载安装
pip install dynamicadaptor
使用方法
import httpx
from dynamicadaptor import format_message, formate_message
# web 返回的数据(同步调用)
def sample():
url = "https://api.bilibili.com/x/polymer/web-dynamic/v1/detail?timezone_offset=-480&id=746530608345251842"
headers = {
"Referer": "https://t.bilibili.com/746530608345251842"
}
result = httpx.get(url, headers=headers).json()
dynamic_formate = format_message(result["data"]["item"])
print(dynamic_formate)
sample()
# 若你的代码处于异步上下文中,可继续使用向后兼容的异步入口 formate_message:
# async def sample_async():
# result = httpx.AsyncClient().get(url, headers=headers)
# dynamic_formate = await formate_message(result["data"]["item"])
数据结构
message
├─message_type: str
├─message_id:str
├─header: Head
| ├─name: str
| ├─mid: int
| ├─face: Optional[str]
| ├─pub_time: Optional[str]
| ├─pub_ts: Optional[int]
| ├─vip: Optional
| | ├─status: Optional[int]
| | ├─type: int
| | └─vatar_subscript: Optional[int]
| |
| ├─pendant: Optional
| | ├─pid: Optional[int]
| | ├─image: Optional[str]
| | └─pendant_name: Optional[str]
| └─official_verify: Optional
| └─type: int
├─text: Optional
| ├─text: Optional
| ├─topic: Optional
| | └─name: str
| └─rich_text_nodes:Optional[List[RichTextDetail]]
| ├─type: str
| ├─text: str
| ├─orig_text: Optional[str]
| └─emoji: Optional
| ├─icon_url: Optional[str]
| ├─text: Optional[str]
| └─type: Union[int, str, None]
|
├─major: Optional
| ├─type: str
| ├─draw: Optional
| | └─items: List
| | ├─height: int
| | ├─width: int
| | └─src: str
| ├─archive: Optional
| | ├─cover: str
| | ├─title: str
| | ├─desc: Optional[str]
| | ├─duration_text: str
| | └─badge: Optional
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─live_rcmd: Optional
| | └─content: Json
| | └─live_play_info
| | ├─title: str
| | ├─cover: str
| | └─watched_show
| | └─text_large:str
| ├─article: Optional
| | ├─cover: List[str]
| | ├─title: str
| | ├─desc: str
| | └─label: str
| ├─common: Optional
| | ├─biz_type: int
| | ├─cover: Optional[str]
| | ├─desc: Optional[str]
| | ├─title: Optional[str]
| | └─badge: Optional
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─music: Optional
| | ├─cover: str
| | ├─label: str
| | └─title: str
| ├─pgc: Optional
| | ├─cover: str
| | ├─title: str
| | ├─badge
| | | ├─text: Optional[str]
| | | ├─color: Optional[str]
| | | └─bg_color: Optional[str]
| | └─stat
| | ├─danmaku: str
| | └─play: str
| ├─medialist: Optional
| | ├─cover: str
| | ├─title: str
| | ├─sub_title: str
| | └─badge
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─courses: Optional
| | ├─cover: str
| | ├─title: str
| | ├─desc: str
| | ├─sub_title: str
| | └─badge
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| └─live
| ├─cover: str
| ├─title: str
| ├─desc_first: str
| ├─desc_second: str
| └─badge
| ├─text: Optional[str]
| ├─color: Optional[str]
| └─bg_color: Optional[str]
├─additional: Optional
| ├─type: str
| ├─goods: Optional
| | ├─head_text: str
| | └─items: List
| | ├─cover: str
| | ├─price: str
| | └─name: str
| ├─reserve: Optional
| | ├─title: str
| | ├─desc1
| | | └─text: str
| | └─desc2
| | └─text: str
| ├─common
| | ├─sub_type: str
| | ├─head_text: Optional[str]
| | ├─cover: str
| | ├─desc1: str
| | ├─desc2: Optional[str]
| | └─title: str
| ├─ugc
| | ├─cover: str
| | ├─title: str
| | ├─desc_second: str
| | ├─duration: str
| | └─head_text: Optional[str]
| └─vote
| ├─desc: str
| └─join_num: int
└─forward: Optional
├─message_type: str
├─message_id:str
├─header: Head
| ├─name: str
| ├─mid: int
| ├─face: Optional[str]
| ├─pub_time: Optional[str]
| ├─pub_ts: Optional[int]
| ├─vip: Optional
| | ├─status: Optional[int]
| | ├─type: int
| | └─vatar_subscript: Optional[int]
| |
| ├─pendant: Optional
| | ├─pid: Optional[int]
| | ├─image: Optional[str]
| | └─pendant_name: Optional[str]
| └─official_verify: Optional
| └─type: int
├─text: Optional
| ├─text: Optional
| ├─topic: Optional
| | └─name: str
| └─rich_text_nodes:Optional[List[RichTextDetail]]
| ├─type: str
| ├─text: str
| ├─orig_text: Optional[str]
| └─emoji: Optional
| ├─icon_url: Optional[str]
| ├─text: Optional[str]
| └─type: Union[int, str, None]
|
├─major: Optional
| ├─type: str
| ├─draw: Optional
| | └─items: List
| | ├─height: int
| | ├─width: int
| | └─src: str
| ├─archive: Optional
| | ├─cover: str
| | ├─title: str
| | ├─desc: Optional[str]
| | ├─duration_text: str
| | └─badge: Optional
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─live_rcmd: Optional
| | └─content: Json
| | └─live_play_info
| | ├─title: str
| | ├─cover: str
| | └─watched_show
| | └─text_large:str
| ├─article: Optional
| | ├─cover: List[str]
| | ├─title: str
| | ├─desc: str
| | └─label: str
| ├─common: Optional
| | ├─biz_type: int
| | ├─cover: Optional[str]
| | ├─desc: Optional[str]
| | ├─title: Optional[str]
| | └─badge: Optional
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─music: Optional
| | ├─cover: str
| | ├─label: str
| | └─title: str
| ├─pgc: Optional
| | ├─cover: str
| | ├─title: str
| | ├─badge
| | | ├─text: Optional[str]
| | | ├─color: Optional[str]
| | | └─bg_color: Optional[str]
| | └─stat
| | ├─danmaku: str
| | └─play: str
| ├─medialist: Optional
| | ├─cover: str
| | ├─title: str
| | ├─sub_title: str
| | └─badge
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| ├─courses: Optional
| | ├─cover: str
| | ├─title: str
| | ├─desc: str
| | ├─sub_title: str
| | └─badge
| | ├─text: Optional[str]
| | ├─color: Optional[str]
| | └─bg_color: Optional[str]
| └─live
| ├─cover: str
| ├─title: str
| ├─desc_first: str
| ├─desc_second: str
| └─badge
| ├─text: Optional[str]
| ├─color: Optional[str]
| └─bg_color: Optional[str]
└─additional: Optional
├─type: str
├─goods: Optional
| ├─head_text: str
| └─items: List
| ├─cover: str
| ├─price: str
| └─name: str
├─reserve: Optional
| ├─title: str
| ├─desc1
| | └─text: str
| └─desc2
| └─text: str
├─common
| ├─sub_type: str
| ├─head_text: Optional[str]
| ├─cover: str
| ├─desc1: str
| ├─desc2: Optional[str]
| └─title: str
├─ugc
| ├─cover: str
| ├─title: str
| ├─desc_second: str
| ├─duration: str
| └─head_text: Optional[str]
└─vote
├─desc: str
└─join_num: int
License
GPL
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
dynamicadaptor-0.6.1.tar.gz
(20.3 kB
view details)
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file dynamicadaptor-0.6.1.tar.gz.
File metadata
- Download URL: dynamicadaptor-0.6.1.tar.gz
- Upload date:
- Size: 20.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via:
pdm/2.28.0 CPython/3.12.3 Linux/6.8.0-134-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1612cc245abb512e30756e9d24c317c2e2b402aaa78c1f1ee2eae4ff0ef00382
|
|
| MD5 |
8445ed43024b6911ae8050dc2c4d69ed
|
|
| BLAKE2b-256 |
c6579bf09d209c69f8e9365bd5d7eda90394a5ae2d129a40a3d75318b1736c0d
|
File details
Details for the file dynamicadaptor-0.6.1-py3-none-any.whl.
File metadata
- Download URL: dynamicadaptor-0.6.1-py3-none-any.whl
- Upload date:
- Size: 16.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via:
pdm/2.28.0 CPython/3.12.3 Linux/6.8.0-134-generic
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17ba2d3f48205a79edc2388c234bc6e8e3a680d0d6579fc7e3de5897d579aaef
|
|
| MD5 |
661393c13312bb7f66a442da1cc7263a
|
|
| BLAKE2b-256 |
1fc79304b898f22601eb4b80cbb527c77acf09a4b03d5b4591353c07a86edfab
|