形象担当:@禾咕咕
本项目实现了将哔哩哔哩返回的数据渲染为类似与B站APP官方的分享图片。 如下图所示:
本项目基于Python3.9.0开发,在其他版本的运行状态未知。本项目使用2021年7月的哔哩哔哩API接口,不保证后续接口与数据结构不会发生变化。
Package | Version |
---|---|
Pillow | 8.0.1 |
aiohttp | 3.7.2 |
qrcode | 6.1 |
pydantic | 1.7.3 |
pathlib | 1.0.1 |
matplotlib | 3.4.0 |
urllib3 | 1.25.11 |
fonttools | 4.24.4 |
本项目结构如下:
├─ bilibili_dynamic
│ │
│ │ DynamicRender.py 主要的程序文件
│ │ format.py 进行数据验证的程序文件
│ │ initialize.py 进行初始化的程序文件
│ │ network.py 进行网络通信的程序文件
│ │ textTools.py 进行渲染的部分文字工具
│ │ __init__.py __init__.py
│ │ _version.py 版本信息
│ ├─ typeface 字体文件夹
│ │ │ Unifont.ttf Unifont字体
│ │ │ CODE2000.ttf CODE2000字体
│ │ │ NotoColorEmoji.ttf Noto emoji字体
│ │ │ NotoSansCJKsc-Regular.otf 思源黑体
│ │ │ NONT LICENSE Noto字体 LICENSE
│ │ ├─ reserve 后备字体
│ │
│ ├─ element 图片组件文件夹
│
│ README.md 自述文件
│ LICENSE LICENSE
│ test.py 示例
外联群QQ:781665797
您可以使用pip快速的安装
pip install bilibili-dynamic
- 克隆仓库中的代码。
- 您可以使用
poetry
工具,如果您没有,可以执行下列pip 命令。
pip install poetry
- 在项目根目录执行以下命令bulid
poetry publish --build
- ./dist 中是构建完成的项目,然后执行(3) 所述的方法安装。
请您前往releases页面,自行下载后缀名为.whl
的文件,并牢记文件名称。然后使用:
pip install 下载下来的文件名称
- 传入 API返回数据中的
data
下的card
或与结构之一样的数据。 path
参数用于指定缓存文件夹路径 不定义则默认为工作路径
下的tmp
文件夹,您可以为其指定正确的绝对路径
或相对路径
以自定义缓存文件夹,当然您也可以指定布尔值False
,即不缓存。
from bilibili_dynamic import DynamicRender
import asyncio
# 导入数据示例
from dylist import dylist
Render = DynamicRender.DynamicPictureRendering(path="./tmp")
async def test():
for element in dylist:
await Render.ReneringManage(element)
# 您可以在实例化的类中的 ReprenderIMG 获得图片对象
Render.ReprenderIMG.show()
break
# 运行协程函数需要在事件循环中运行
loop = asyncio.get_event_loop()
loop.run_until_complete(test())
注意: 这个写法只适用于
0.0.7
(含)以上的版本。
我们在
test.py
中准备了一个小示例,您可以参考其使用。
我们将动态的渲染分为五大部分,每部分独立渲染:
头部信息
、文字部分
、功能块
(图片动态的图片、视频的视频等)、附加卡片
(相关游戏、直播预约等)、转发信息
(转发内容)
每部分根据动态的内容渲染,如果没有该部分则不渲染。
每个模块渲染是异步的,其关系您可以根据下图理解:
此图仅供参考,在使用过程中有诸多因素会影响渲染的流程。
附加卡片通常不会下载图片,除了卡片展示游戏相关时。
转发信息就是将上述流程嵌套了一次,只是不渲染头部信息,其余基本一致,故不赘述。
这个模块的实现是在DynamicRender.py
中的DynamicPictureRendering
类中的headRendering
方法。
如项目介绍图片当中的一致,本模块实现了将头像、挂件缓存与渲染,同时本模块可以对该动态发布的时间、账号是否大会员、认证账号进行详细的渲染。
该部分是本项目的核心模块,主要实现了将动态文字进行富文本化。实现是在DynamicRender.py
中的DynamicPictureRendering
类中的NGSSTrcker
方法。
为了方便您更好对这个理解这个模块的运作方式,下图介绍了该模块的工作细节:
NGSS
识别了特殊文本的样式,和在字符串中的位置,是后续文本处理的指导性数据。RenderList
包含了以特殊文本为分隔符的所有文本信息。rl
包含了以字符
为单位的文本渲染信息。pl
包含了以bilibili表情包
为单位的渲染信息。tl
包含了以特殊功能图片
的渲染信息,如动态抽奖前的小礼物,投票的柱状图,网页链接的链接图标。
这个模块的实现是在DynamicRender.py
中的DynamicPictureRendering
类中的FunctionBlock
方法。
它实现了渲染九宫格与专栏封面,视频封面,与直播封面。
这个模块的实现是在DynamicRender.py
中的DynamicPictureRendering
类中的AddCard
方法。
它实现了渲染投票,视频预约,直播预约,游戏信息等。
这个模块的实现是在DynamicRender.py
中的DynamicPictureRendering
类中的Reprender
方法。
渲染源动态内容,原理与总动态基本一致,差别仅在字体颜色和对于头部信息渲染的省略。
这个模块调用了上述除过头部信息
以外的三个模块。
如果您发现了更好的使用方法,不妨分享出来!你可以使用pr功能提交请求,我会审阅。或者在使用中出现了什么问题,都可以提交issue,或者加入我们的外联群(QQ:781665797)
交流。
bilibili-API-collect
:非常详细的 B站 api 文档HarukaBot
:非常nb的机器人Google Noto Fonts
:适用于所有语言的漂亮且免费的字体!unifont
:伟大的字体项目
GNU AGPLv3
许可证