No project description provided
Project description
DynamicAdaptor
用于将bilibili的grpc动态和web动态转换成特定的数据类型
原理说明
将grpc数据转换成json数据,之后使用pydantic进行信息摘要。 web端的json数据同理
下载安装
pip install dynamicadaptor
使用方法
from google.protobuf.json_format import MessageToDict
from dynamicadaptor.DynamicConversion import formate_message
from bilirpc.api import get_dy_detail
import asyncio
import httpx
# 如果数据是grpc返回的数据,则需要转换成json数据
async def sample1():
dynamic_grpc = await get_dy_detail("746530608345251842")
dynamic: dict = MessageToDict(dynamic_grpc[0])
dynamic_formate =await formate_message("grpc", dynamic)
print(dynamic_formate)
asyncio.run(sample1())
# 如果是web返回的数据
async def sample2():
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 =await formate_message("web", result["data"]["item"])
print(dynamic_formate)
asyncio.run(sample2())
数据结构
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
Project details
Release history Release notifications | RSS feed
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.5.5.tar.gz
(17.5 kB
view details)
Built Distribution
File details
Details for the file dynamicadaptor-0.5.5.tar.gz
.
File metadata
- Download URL: dynamicadaptor-0.5.5.tar.gz
- Upload date:
- Size: 17.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 6bd26e5e65bc6d5430cf1c4746527028de8e7da80224cbaba3c2632d64d8e38d |
|
MD5 | 33831ea16c5c49eba7b26377bbede347 |
|
BLAKE2b-256 | 6e6e4926e21f3e8ac9c92e8341dad91635c5652f22ab6d07e8b7ccca8ff1d8e7 |
File details
Details for the file dynamicadaptor-0.5.5-py3-none-any.whl
.
File metadata
- Download URL: dynamicadaptor-0.5.5-py3-none-any.whl
- Upload date:
- Size: 18.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/5.1.1 CPython/3.12.6
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | 9ae98201545537d8969de1e080d4621a1d7505f845c6b325e7acba531af1ceff |
|
MD5 | 0d17e4f31b11eeb766554f86bb3cba06 |
|
BLAKE2b-256 | 518cb4eef36fb16d7bfd8140701b821d68cc1cb8de16c0c82dac3509a92172a1 |