nonebot-plugin-htmlrender


Namenonebot-plugin-htmlrender JSON
Version 0.6.7 PyPI version JSON
download
home_pageNone
Summary通过浏览器渲染图片
upload_time2025-08-19 03:41:09
maintainerNone
docs_urlNone
authorNone
requires_python<4.0,>=3.9
licenseMIT License Copyright (c) 2021 kexue Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # nonebot-plugin-htmlrender

- 通过浏览器渲染图片
- 可通过查看`example`参考使用实例
- 如果有安装浏览器等问题,先查看文档最底下的`常见问题`再去看 issue 有没有已经存在的

## ✨ 功能

- 通过 html 和浏览器生成图片
- 支持`纯文本` `markdown` 和 `jinja2` 模板输入
- 通过 CSS 来控制样式

## 使用

参考[example/plugins/render/**init**.py](example/plugins/render/__init__.py)

```py
from nonebot import require

require("nonebot_plugin_htmlrender")
# 注意顺序,先require再 from ... import ...
# 注意顺序,先require再 from ... import ...
# 注意顺序,先require再 from ... import ...
from nonebot_plugin_htmlrender import (
    text_to_pic,
    md_to_pic,
    template_to_pic,
    get_new_page,
)
# 注意顺序,先require再 from ... import ...
# 注意顺序,先require再 from ... import ...
# 注意顺序,先require再 from ... import ...
```

## 配置

### .env 配置项说明

```ini
# Playwright 浏览器引擎类型
# 可不填,默认为 "chromium"
htmlrender_browser = "chromium"

# Playwright 浏览器下载地址
# 可选,用于自定义浏览器下载源
htmlrender_download_host = ""

# Playwright 浏览器下载代理
# 可选,用于配置下载浏览器时的代理
htmlrender_download_proxy = ""

# Playwright 浏览器代理地址
# 可选,用于配置浏览器访问时的代理
# 示例: htmlrender_proxy_host = "http://127.0.0.1:7890"

# Playwright 浏览器代理绕过地址
# 可选,指定不使用代理的地址
htmlrender_proxy_host_bypass = ""

# Playwright 浏览器通道
# 可选,支持以下值:
# - Chrome: "chrome", "chrome-beta", "chrome-dev", "chrome-canary"
# - Edge: "msedge", "msedge-beta", "msedge-dev", "msedge-canary"
# 配置后可直接使用系统浏览器,无需下载 Chromium
htmlrender_browser_channel = ""

# Playwright 浏览器可执行文件路径
# 可选,用于指定浏览器程序位置
htmlrender_browser_executable_path = ""

# CDP 远程调试地址
# 可选,用于连接已运行的浏览器实例
# 使用时需要在启动浏览器时添加参数 --remote-debugging-port=端口号
htmlrender_connect_over_cdp = "http://127.0.0.1:9222"

# Playwright ws 连接地址
# 可选,用于连接 playwright 的 docker 容器
# https://playwright.dev/docs/docker
# 配套的 docker-compose.yaml 中,已经填好了
htmlrender_connect="ws://playwright:3000"
```

## 部署

### (建议)使用 docker compose 进行部署

> 前提条件:你的项目使用 uv 管理 或 `pyproject.toml` 的 `dependencies` 中已经包含你的依赖
>
> 此方法会将 nonebot2 和 playwright 分开两个容器

1. 将 `docker-compose.yaml` & `entrypoint.sh` 复制到你自己的项目根目录下
2. 根据你的需要调整 `docker-compose.yaml` & `entrypoint.sh`
3. 拉取镜像 `docker compose pull`
4. 启动容器 `docker compose up -d`

> - 查看日志 `docker compose logs -f`
> - 停止/重启容器 `docker compose`

### docker 单容器部署

> 前提条件:你的项目使用 uv 管理 或 `pyproject.toml` 的 `dependencies` 中已经包含你的依赖
>
> 此方法会将 nonebot2 和 playwright 运行在同一个容器中
>
> 而且你还有需要清楚你要干什么

1. 将 `docker-compose.yaml` & `entrypoint.sh` 复制到你自己的项目根目录下
2. 根据你的情况,调整指令

```bash
docker run -d \
--name nonebot2 \
-v $(pwd):/app \
-p 9012:9012 \
-e "PLAYWRIGHT_BROWSERS_PATH=/app/pw-browsers" \
ghcr.io/kexue-z/nonebot-plugin-htmlrender/nonebot2-playwrght-uv sh -c "./entrypoint.sh"
```

## 说明
### markdown 转 图片

- 使用 `GitHub-light` 样式
- 支持绝大部分 md 语法
- 代码高亮
- latex 数学公式 (感谢@[MeetWq](https://github.com/MeetWq))
    - 使用 `$$...$$` 来输入独立公式
    - 使用 `$...$` 来输入行内公式
- 图片需要使用外部连接并使用`html`格式 否则文末会超出截图范围
- 图片可使用 md 语法 路径可为 `绝对路径`(建议), 或 `相对于template_path` 的路径

### 模板 转 图片

- 使用 jinja2 模板引擎
- 页面参数可自定义

## 🌰 栗子

[example.md](docs/example.md)

### 文本转图片(同时文本里面可以包括 html 图片)

![](docs/text2pic.png)

### markdown 转图片(同时文本里面可以包括 html 图片)

![](docs/md2pic.png)

### 纯 html 转图片

![](docs/html2pic.png)

### jinja2 模板转图片

![](docs/template2pic.png)

## 特别感谢

- [MeetWq](https://github.com/MeetWq) 提供数学公式支持代码和代码高亮

## 常见疑难杂症

### `playwright._impl._api_types.Error:` 初次运行时报错

- 一般为缺少必要的运行环境,如中文字体等

### Ubuntu 使用 `apt`

- 参考[Dao-bot Dockerfile](https://github.com/kexue-z/Dao-bot/blob/a7b35d6877b24b2bbd72039195bd1b3afebb5cf6/Dockerfile#L12-L15)

```sh
apt update && apt install -y locales locales-all fonts-noto libnss3-dev libxss1 libasound2 libxrandr2 libatk1.0-0 libgtk-3-0 libgbm-dev libxshmfence1
```

- 然后设置 ENV local

```sh
LANG zh_CN.UTF-8
LANGUAGE zh_CN.UTF-8
LC_ALL zh_CN.UTF-8
```

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "nonebot-plugin-htmlrender",
    "maintainer": null,
    "docs_url": null,
    "requires_python": "<4.0,>=3.9",
    "maintainer_email": null,
    "keywords": null,
    "author": null,
    "author_email": "kexue <x@kexue-cloud.cn>",
    "download_url": "https://files.pythonhosted.org/packages/69/b4/bb23fa23ff5a554a64dbfa849fd505f7270f25d9a178f153e9f685e9ee73/nonebot_plugin_htmlrender-0.6.7.tar.gz",
    "platform": null,
    "description": "# nonebot-plugin-htmlrender\n\n- \u901a\u8fc7\u6d4f\u89c8\u5668\u6e32\u67d3\u56fe\u7247\n- \u53ef\u901a\u8fc7\u67e5\u770b`example`\u53c2\u8003\u4f7f\u7528\u5b9e\u4f8b\n- \u5982\u679c\u6709\u5b89\u88c5\u6d4f\u89c8\u5668\u7b49\u95ee\u9898\uff0c\u5148\u67e5\u770b\u6587\u6863\u6700\u5e95\u4e0b\u7684`\u5e38\u89c1\u95ee\u9898`\u518d\u53bb\u770b issue \u6709\u6ca1\u6709\u5df2\u7ecf\u5b58\u5728\u7684\n\n## \u2728 \u529f\u80fd\n\n- \u901a\u8fc7 html \u548c\u6d4f\u89c8\u5668\u751f\u6210\u56fe\u7247\n- \u652f\u6301`\u7eaf\u6587\u672c` `markdown` \u548c `jinja2` \u6a21\u677f\u8f93\u5165\n- \u901a\u8fc7 CSS \u6765\u63a7\u5236\u6837\u5f0f\n\n## \u4f7f\u7528\n\n\u53c2\u8003[example/plugins/render/**init**.py](example/plugins/render/__init__.py)\n\n```py\nfrom nonebot import require\n\nrequire(\"nonebot_plugin_htmlrender\")\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\nfrom nonebot_plugin_htmlrender import (\n    text_to_pic,\n    md_to_pic,\n    template_to_pic,\n    get_new_page,\n)\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\n# \u6ce8\u610f\u987a\u5e8f\uff0c\u5148require\u518d from ... import ...\n```\n\n## \u914d\u7f6e\n\n### .env \u914d\u7f6e\u9879\u8bf4\u660e\n\n```ini\n# Playwright \u6d4f\u89c8\u5668\u5f15\u64ce\u7c7b\u578b\n# \u53ef\u4e0d\u586b\uff0c\u9ed8\u8ba4\u4e3a \"chromium\"\nhtmlrender_browser = \"chromium\"\n\n# Playwright \u6d4f\u89c8\u5668\u4e0b\u8f7d\u5730\u5740\n# \u53ef\u9009\uff0c\u7528\u4e8e\u81ea\u5b9a\u4e49\u6d4f\u89c8\u5668\u4e0b\u8f7d\u6e90\nhtmlrender_download_host = \"\"\n\n# Playwright \u6d4f\u89c8\u5668\u4e0b\u8f7d\u4ee3\u7406\n# \u53ef\u9009\uff0c\u7528\u4e8e\u914d\u7f6e\u4e0b\u8f7d\u6d4f\u89c8\u5668\u65f6\u7684\u4ee3\u7406\nhtmlrender_download_proxy = \"\"\n\n# Playwright \u6d4f\u89c8\u5668\u4ee3\u7406\u5730\u5740\n# \u53ef\u9009\uff0c\u7528\u4e8e\u914d\u7f6e\u6d4f\u89c8\u5668\u8bbf\u95ee\u65f6\u7684\u4ee3\u7406\n# \u793a\u4f8b: htmlrender_proxy_host = \"http://127.0.0.1:7890\"\n\n# Playwright \u6d4f\u89c8\u5668\u4ee3\u7406\u7ed5\u8fc7\u5730\u5740\n# \u53ef\u9009\uff0c\u6307\u5b9a\u4e0d\u4f7f\u7528\u4ee3\u7406\u7684\u5730\u5740\nhtmlrender_proxy_host_bypass = \"\"\n\n# Playwright \u6d4f\u89c8\u5668\u901a\u9053\n# \u53ef\u9009\uff0c\u652f\u6301\u4ee5\u4e0b\u503c:\n# - Chrome: \"chrome\", \"chrome-beta\", \"chrome-dev\", \"chrome-canary\"\n# - Edge: \"msedge\", \"msedge-beta\", \"msedge-dev\", \"msedge-canary\"\n# \u914d\u7f6e\u540e\u53ef\u76f4\u63a5\u4f7f\u7528\u7cfb\u7edf\u6d4f\u89c8\u5668\uff0c\u65e0\u9700\u4e0b\u8f7d Chromium\nhtmlrender_browser_channel = \"\"\n\n# Playwright \u6d4f\u89c8\u5668\u53ef\u6267\u884c\u6587\u4ef6\u8def\u5f84\n# \u53ef\u9009\uff0c\u7528\u4e8e\u6307\u5b9a\u6d4f\u89c8\u5668\u7a0b\u5e8f\u4f4d\u7f6e\nhtmlrender_browser_executable_path = \"\"\n\n# CDP \u8fdc\u7a0b\u8c03\u8bd5\u5730\u5740\n# \u53ef\u9009\uff0c\u7528\u4e8e\u8fde\u63a5\u5df2\u8fd0\u884c\u7684\u6d4f\u89c8\u5668\u5b9e\u4f8b\n# \u4f7f\u7528\u65f6\u9700\u8981\u5728\u542f\u52a8\u6d4f\u89c8\u5668\u65f6\u6dfb\u52a0\u53c2\u6570 --remote-debugging-port=\u7aef\u53e3\u53f7\nhtmlrender_connect_over_cdp = \"http://127.0.0.1:9222\"\n\n# Playwright ws \u8fde\u63a5\u5730\u5740\n# \u53ef\u9009\uff0c\u7528\u4e8e\u8fde\u63a5 playwright \u7684 docker \u5bb9\u5668\n# https://playwright.dev/docs/docker\n# \u914d\u5957\u7684 docker-compose.yaml \u4e2d\uff0c\u5df2\u7ecf\u586b\u597d\u4e86\nhtmlrender_connect=\"ws://playwright:3000\"\n```\n\n## \u90e8\u7f72\n\n### \uff08\u5efa\u8bae\uff09\u4f7f\u7528 docker compose \u8fdb\u884c\u90e8\u7f72\n\n> \u524d\u63d0\u6761\u4ef6\uff1a\u4f60\u7684\u9879\u76ee\u4f7f\u7528 uv \u7ba1\u7406 \u6216 `pyproject.toml` \u7684 `dependencies` \u4e2d\u5df2\u7ecf\u5305\u542b\u4f60\u7684\u4f9d\u8d56\n>\n> \u6b64\u65b9\u6cd5\u4f1a\u5c06 nonebot2 \u548c playwright \u5206\u5f00\u4e24\u4e2a\u5bb9\u5668\n\n1. \u5c06 `docker-compose.yaml` & `entrypoint.sh` \u590d\u5236\u5230\u4f60\u81ea\u5df1\u7684\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\n2. \u6839\u636e\u4f60\u7684\u9700\u8981\u8c03\u6574 `docker-compose.yaml` & `entrypoint.sh`\n3. \u62c9\u53d6\u955c\u50cf `docker compose pull`\n4. \u542f\u52a8\u5bb9\u5668 `docker compose up -d`\n\n> - \u67e5\u770b\u65e5\u5fd7 `docker compose logs -f`\n> - \u505c\u6b62/\u91cd\u542f\u5bb9\u5668 `docker compose`\n\n### docker \u5355\u5bb9\u5668\u90e8\u7f72\n\n> \u524d\u63d0\u6761\u4ef6\uff1a\u4f60\u7684\u9879\u76ee\u4f7f\u7528 uv \u7ba1\u7406 \u6216 `pyproject.toml` \u7684 `dependencies` \u4e2d\u5df2\u7ecf\u5305\u542b\u4f60\u7684\u4f9d\u8d56\n>\n> \u6b64\u65b9\u6cd5\u4f1a\u5c06 nonebot2 \u548c playwright \u8fd0\u884c\u5728\u540c\u4e00\u4e2a\u5bb9\u5668\u4e2d\n>\n> \u800c\u4e14\u4f60\u8fd8\u6709\u9700\u8981\u6e05\u695a\u4f60\u8981\u5e72\u4ec0\u4e48\n\n1. \u5c06 `docker-compose.yaml` & `entrypoint.sh` \u590d\u5236\u5230\u4f60\u81ea\u5df1\u7684\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\n2. \u6839\u636e\u4f60\u7684\u60c5\u51b5\uff0c\u8c03\u6574\u6307\u4ee4\n\n```bash\ndocker run -d \\\n--name nonebot2 \\\n-v $(pwd):/app \\\n-p 9012:9012 \\\n-e \"PLAYWRIGHT_BROWSERS_PATH=/app/pw-browsers\" \\\nghcr.io/kexue-z/nonebot-plugin-htmlrender/nonebot2-playwrght-uv sh -c \"./entrypoint.sh\"\n```\n\n## \u8bf4\u660e\n### markdown \u8f6c \u56fe\u7247\n\n- \u4f7f\u7528 `GitHub-light` \u6837\u5f0f\n- \u652f\u6301\u7edd\u5927\u90e8\u5206 md \u8bed\u6cd5\n- \u4ee3\u7801\u9ad8\u4eae\n- latex \u6570\u5b66\u516c\u5f0f \uff08\u611f\u8c22@[MeetWq](https://github.com/MeetWq)\uff09\n    - \u4f7f\u7528 `$$...$$` \u6765\u8f93\u5165\u72ec\u7acb\u516c\u5f0f\n    - \u4f7f\u7528 `$...$` \u6765\u8f93\u5165\u884c\u5185\u516c\u5f0f\n- \u56fe\u7247\u9700\u8981\u4f7f\u7528\u5916\u90e8\u8fde\u63a5\u5e76\u4f7f\u7528`html`\u683c\u5f0f \u5426\u5219\u6587\u672b\u4f1a\u8d85\u51fa\u622a\u56fe\u8303\u56f4\n- \u56fe\u7247\u53ef\u4f7f\u7528 md \u8bed\u6cd5 \u8def\u5f84\u53ef\u4e3a `\u7edd\u5bf9\u8def\u5f84`(\u5efa\u8bae), \u6216 `\u76f8\u5bf9\u4e8etemplate_path` \u7684\u8def\u5f84\n\n### \u6a21\u677f \u8f6c \u56fe\u7247\n\n- \u4f7f\u7528 jinja2 \u6a21\u677f\u5f15\u64ce\n- \u9875\u9762\u53c2\u6570\u53ef\u81ea\u5b9a\u4e49\n\n## \ud83c\udf30 \u6817\u5b50\n\n[example.md](docs/example.md)\n\n### \u6587\u672c\u8f6c\u56fe\u7247\uff08\u540c\u65f6\u6587\u672c\u91cc\u9762\u53ef\u4ee5\u5305\u62ec html \u56fe\u7247\uff09\n\n![](docs/text2pic.png)\n\n### markdown \u8f6c\u56fe\u7247\uff08\u540c\u65f6\u6587\u672c\u91cc\u9762\u53ef\u4ee5\u5305\u62ec html \u56fe\u7247\uff09\n\n![](docs/md2pic.png)\n\n### \u7eaf html \u8f6c\u56fe\u7247\n\n![](docs/html2pic.png)\n\n### jinja2 \u6a21\u677f\u8f6c\u56fe\u7247\n\n![](docs/template2pic.png)\n\n## \u7279\u522b\u611f\u8c22\n\n- [MeetWq](https://github.com/MeetWq) \u63d0\u4f9b\u6570\u5b66\u516c\u5f0f\u652f\u6301\u4ee3\u7801\u548c\u4ee3\u7801\u9ad8\u4eae\n\n## \u5e38\u89c1\u7591\u96be\u6742\u75c7\n\n### `playwright._impl._api_types.Error:` \u521d\u6b21\u8fd0\u884c\u65f6\u62a5\u9519\n\n- \u4e00\u822c\u4e3a\u7f3a\u5c11\u5fc5\u8981\u7684\u8fd0\u884c\u73af\u5883\uff0c\u5982\u4e2d\u6587\u5b57\u4f53\u7b49\n\n### Ubuntu \u4f7f\u7528 `apt`\n\n- \u53c2\u8003[Dao-bot Dockerfile](https://github.com/kexue-z/Dao-bot/blob/a7b35d6877b24b2bbd72039195bd1b3afebb5cf6/Dockerfile#L12-L15)\n\n```sh\napt update && apt install -y locales locales-all fonts-noto libnss3-dev libxss1 libasound2 libxrandr2 libatk1.0-0 libgtk-3-0 libgbm-dev libxshmfence1\n```\n\n- \u7136\u540e\u8bbe\u7f6e ENV local\n\n```sh\nLANG zh_CN.UTF-8\nLANGUAGE zh_CN.UTF-8\nLC_ALL zh_CN.UTF-8\n```\n",
    "bugtrack_url": null,
    "license": "MIT License  Copyright (c) 2021 kexue  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "\u901a\u8fc7\u6d4f\u89c8\u5668\u6e32\u67d3\u56fe\u7247",
    "version": "0.6.7",
    "project_urls": {
        "Bug Tracker": "https://github.com/kexue-z/nonebot-plugin-htmlrender/issues",
        "Homepage": "https://github.com/kexue-z/nonebot-plugin-htmlrender"
    },
    "split_keywords": [],
    "urls": [
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "7530e307374ef0b83fe8dc36004d94332255ff746698af0adb47b3337a7e8305",
                "md5": "138e4f2fbd46eea047bf1c00f15bf861",
                "sha256": "d782f20dbfd7573944ccd3e4dff2c69daaee8aa5e6f78443ef94057d4126e252"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_htmlrender-0.6.7-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "138e4f2fbd46eea047bf1c00f15bf861",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": "<4.0,>=3.9",
            "size": 1064240,
            "upload_time": "2025-08-19T03:41:07",
            "upload_time_iso_8601": "2025-08-19T03:41:07.025733Z",
            "url": "https://files.pythonhosted.org/packages/75/30/e307374ef0b83fe8dc36004d94332255ff746698af0adb47b3337a7e8305/nonebot_plugin_htmlrender-0.6.7-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": "",
            "digests": {
                "blake2b_256": "69b4bb23fa23ff5a554a64dbfa849fd505f7270f25d9a178f153e9f685e9ee73",
                "md5": "c3d28b2bb3cbb955baa85a3d5c79b4a8",
                "sha256": "968b06bdfef10e06ad64c9d945c89000b1eaa82a89d5bae71a0647a3a6271c38"
            },
            "downloads": -1,
            "filename": "nonebot_plugin_htmlrender-0.6.7.tar.gz",
            "has_sig": false,
            "md5_digest": "c3d28b2bb3cbb955baa85a3d5c79b4a8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": "<4.0,>=3.9",
            "size": 1392554,
            "upload_time": "2025-08-19T03:41:09",
            "upload_time_iso_8601": "2025-08-19T03:41:09.054193Z",
            "url": "https://files.pythonhosted.org/packages/69/b4/bb23fa23ff5a554a64dbfa849fd505f7270f25d9a178f153e9f685e9ee73/nonebot_plugin_htmlrender-0.6.7.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-19 03:41:09",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "kexue-z",
    "github_project": "nonebot-plugin-htmlrender",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "nonebot-plugin-htmlrender"
}
        
Elapsed time: 1.13826s