SK-415 / DynamicRender

本项目实现了将哔哩哔哩返回的数据渲染为类似与B站APP官方的分享图片

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

几乎一致的动态样式渲染!

banner

一、项目介绍

1、介绍

形象担当:@禾咕咕

2、基本功能

本项目实现了将哔哩哔哩返回的数据渲染为类似与B站APP官方的分享图片。 如下图所示:

3、环境

本项目基于Python3.9.0开发,在其他版本的运行状态未知。本项目使用2021年7月的哔哩哔哩API接口,不保证后续接口与数据结构不会发生变化。

4、依赖

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

5、项目结构

本项目结构如下:

├─ 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           示例       

6、交流

外联群QQ:781665797

二、使用

1、安装

(1)、pip安装(推荐)

您可以使用pip快速的安装

pip install bilibili-dynamic

(2)、自行构建

  • 克隆仓库中的代码。
  • 您可以使用 poetry 工具,如果您没有,可以执行下列pip 命令。
pip install poetry
  • 在项目根目录执行以下命令bulid
poetry publish --build
  • ./dist 中是构建完成的项目,然后执行(3) 所述的方法安装。

(3)、使用releases中的版本

请您前往releases页面,自行下载后缀名为.whl的文件,并牢记文件名称。然后使用:

pip install 下载下来的文件名称

2、使用

  • 传入 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 中准备了一个小示例,您可以参考其使用。

三、如何工作

我们将动态的渲染分为五大部分,每部分独立渲染:

头部信息文字部分功能块(图片动态的图片、视频的视频等)、附加卡片(相关游戏、直播预约等)、转发信息(转发内容) 每部分根据动态的内容渲染,如果没有该部分则不渲染。 每个模块渲染是异步的,其关系您可以根据下图理解:

此图仅供参考,在使用过程中有诸多因素会影响渲染的流程。

附加卡片通常不会下载图片,除了卡片展示游戏相关时。

转发信息就是将上述流程嵌套了一次,只是不渲染头部信息,其余基本一致,故不赘述。

1、头部信息

这个模块的实现是在DynamicRender.py中的DynamicPictureRendering类中的headRendering方法。 如项目介绍图片当中的一致,本模块实现了将头像、挂件缓存与渲染,同时本模块可以对该动态发布的时间、账号是否大会员、认证账号进行详细的渲染。

2、文字部分

该部分是本项目的核心模块,主要实现了将动态文字进行富文本化。实现是在DynamicRender.py中的DynamicPictureRendering类中的NGSSTrcker方法。 为了方便您更好对这个理解这个模块的运作方式,下图介绍了该模块的工作细节:

  • NGSS识别了特殊文本的样式,和在字符串中的位置,是后续文本处理的指导性数据。
  • RenderList包含了以特殊文本为分隔符的所有文本信息。
  • rl 包含了以字符为单位的文本渲染信息。
  • pl 包含了以bilibili表情包为单位的渲染信息。
  • tl 包含了以特殊功能图片的渲染信息,如动态抽奖前的小礼物,投票的柱状图,网页链接的链接图标。

3、功能块

这个模块的实现是在DynamicRender.py中的DynamicPictureRendering类中的FunctionBlock方法。 它实现了渲染九宫格与专栏封面,视频封面,与直播封面。

4、附加卡片

这个模块的实现是在DynamicRender.py中的DynamicPictureRendering类中的AddCard方法。 它实现了渲染投票,视频预约,直播预约,游戏信息等。

5、转发信息

这个模块的实现是在DynamicRender.py中的DynamicPictureRendering类中的Reprender方法。 渲染源动态内容,原理与总动态基本一致,差别仅在字体颜色和对于头部信息渲染的省略。 这个模块调用了上述除过头部信息以外的三个模块。

四、贡献 - 特别感谢 - license

1、贡献

如果您发现了更好的使用方法,不妨分享出来!你可以使用pr功能提交请求,我会审阅。或者在使用中出现了什么问题,都可以提交issue,或者加入我们的外联群(QQ:781665797)交流。

2、特别感谢

3、license

GNU AGPLv3 许可证

About

本项目实现了将哔哩哔哩返回的数据渲染为类似与B站APP官方的分享图片

License:GNU General Public License v3.0


Languages

Language:Python 100.0%