主题
如何配置腕上漫画自定义漫画源
腕上漫画支持配置自定义漫画源,让你可以使用自己选择的漫画 API。本文将从简单到复杂,逐步介绍如何使用自定义漫画源。
内容来源与服务责任
请只接入你有权访问和使用的内容源,并遵守来源网站规则、作品授权和所在地适用法律。自行部署接口时,不得绕过付费、登录、访问控制或其他技术保护措施,也不得公开传播未经授权的内容。
添加漫画源
如果你已经有可用的漫画源地址,可以直接添加到腕上漫画中使用。
添加步骤
在快应用内直接添加
- 打开
腕上漫画应用
- 首页点击上面的
🖊进入漫画源管理
- 点击下面的
+按钮添加漫画源
- 输入你的漫画源地址:
你的域名(例如youapi.domain)
- 联网保存后通过验证即可使用

- 回到主页选择切换到你的漫画源,就可以开始使用了

使用腕上漫画同步器插件同步添加
- 打开
腕上漫画应用
- 回到
AstroBox,来到插件页面,选择腕上漫画同步器(没有装的自己到插件市场装)
- 进入插件页面,直接输入漫画源(格式:https://youapi.domain),等待获取成功之后点击
同步
- 回到主页选择切换到你的漫画源,就可以开始使用了

同步方式区别
提示
一般优先考虑直接在快应用内添加自定义漫画源,通过插件同步方式固然方便,但由于不同Vela设备底层支持的SSL证书不完全,所以在发现某个漫画源在无法通过快应用直接添加的时候,使用插件同步依然会导致对应漫画源无法使用,如果遇到这个情况建议联系对应漫画源作者或尝试自己换SSL证书。
上传Cookie
部分漫画源需要登录才能访问更多内容,你可以通过腕上漫画同步器插件上传Cookie。
Cookie 可能等同于登录凭据
Cookie 可能允许他人直接访问你的账号。仅向自己控制或充分信任的漫画源发送 Cookie,不要使用来源不明的同步器、公共接口或他人提供的服务器。建议使用权限较低的独立账号,不要使用保存了支付信息或重要个人数据的主账号。
复制 Cookie 时不要截图、录屏或粘贴到聊天软件。若 Cookie 意外泄露,请立即在来源网站退出所有会话、修改密码,并按网站提供的方式撤销登录状态。
安装插件
- 在 AstroBox 的插件市场中搜索并安装
腕上漫画同步器插件。
获取Cookie
不同漫画源对 Cookie 的要求不同。只有在确认漫画源可信、确实需要登录且你理解其用途时才应继续;不确定时不要提供 Cookie。
- 在电脑浏览器中打开你的漫画源网站
- 登录账号(如果需要)
- 按
F12打开开发者工具 → 切换到 Network(网络) 标签 - 刷新页面,点击任意一个请求
- 在请求头中找到
Cookie字段,复制其值
使用插件上传
- 打开 AstroBox 的 腕上漫画同步器 插件

- 漫画源域名:输入你的漫画源地址,例如
https://youapi.domain - 插件会自动获取漫画源名称并显示在漫画源名称字段
- Cookie:仅在确认插件和漫画源可信后,粘贴从浏览器复制的 Cookie 值
- 点击同步到手表按钮

完成!
再次注意
插件会将 Cookie 发送到手表上的腕上漫画应用,之后访问该漫画源时,请求会自动携带 Cookie。使用前请确认手表和漫画源的存储、传输方式符合你的安全预期;不再使用该漫画源时,应退出账号并撤销对应会话。
快速部署漫画源
如果找不到可用的漫画源,可以基于漫画源作者提供的开源仓库自行部署一个。考虑到大部分用户没有写代码的经验,且公开的漫画源难以保证长期可用,这里优先推荐大家部署自己的自定义漫画源。
可用仓库
选择 bandcomic 组织 下的任意仓库,按照其中的 README.md 指引部署,即可快速搭建可用的漫画源。
使用 Vercel 部署
下面介绍如何使用 Vercel 部署漫画源。
准备工作
部署步骤
1. Fork仓库
访问 bandcomic 组织 下的任意描述中带 Vercel 字样的仓库,点击右上角的 Fork 按钮,将仓库Fork到你的账号下。
2. 导入到Vercel
- 登录 Vercel

- 点击 Add New... → Project

- 在 Import Git Repository 页面,先链接你的GitHub账号,后选择你刚才Fork的仓库
- 点击 Import

3. 配置项目
- 全部保持默认配置
- 点击 Deploy 开始部署

4. 等待部署完成
部署过程通常需要1-2分钟,等待显示 Congratulations! 即表示部署成功。 
5. 绑定自定义域名
⚠️ 重要:Vercel默认分配的域名(xxx.vercel.app)在国内可能无法访问,需要绑定自己的域名。
- 进入项目页面,点击 Domains

- 点击 Add Existing,输入你的域名,点击 Save


- 按照提示在你的域名服务商处添加DNS解析记录
- 等待DNS生效(通常几分钟到几小时)
6. 测试漫画源
绑定域名后,访问 https://你的域名/config,如果能看到JSON配置信息,说明部署成功。
部署完成后,按照上面的 添加漫画源 步骤添加即可使用。
使用 EdgeOne Makers 部署
EdgeOne Makers(原 EdgeOne Pages)是腾讯云推出的免费 Web 托管平台,同样支持导入 GitHub 仓库一键部署。服务面向国内用户时,访问体验通常优于 Vercel。
下面介绍如何使用 EdgeOne Makers 部署漫画源。
准备工作
部署步骤
1. Fork 仓库
访问 bandcomic 组织 下的任意描述中带 EdgeOne 字样的仓库,点击右上角的 Fork 按钮,将仓库 Fork 到你的账号下。
2. 导入到 EdgeOne Makers
- 打开 EdgeOne Makers 控制台,登录腾讯云账号,首次使用点击 立即开通

- 点击 导入 Git 仓库,按提示授权绑定你的 GitHub 账号

- 选择你刚才 Fork 的仓库

3. 配置项目
- 全部保持默认配置(如需绑定自定义域名且域名没有备案,可将加速区域改为 全球可用区(不含中国大陆))
- 点击 开始部署 开始部署

4. 等待部署完成
部署过程通常需要 1-2 分钟,等待显示部署成功即表示完成。 
5. 绑定自定义域名
⚠️ 重要:EdgeOne 分配的项目域名如果选择了 中国大陆可用区 ,那默认的域名在国内访问受限(需通过控制台预览链接访问,且 3 小时失效),这时候需要绑定自己的域名。
- 进入项目页面,切换到 域名管理

- 点击 添加自定义域名,输入你的域名,点击 确定

- 按照提示在域名服务商处添加解析记录,验证域名归属权
- 再添加 CNAME 记录,等待生效(通常几分钟到几小时)
注意
若项目加速区域为 中国大陆可用区 或 全球可用区(含中国大陆),绑定自定义域名需先完成工信部备案;选择 全球可用区(不含中国大陆) 则无需备案。
6. 测试漫画源
绑定域名后,访问 https://你的域名/config,如果能看到 JSON 配置信息,说明部署成功。
部署完成后,按照上面的 添加漫画源 步骤添加即可使用。
实验性功能:导入 Venera 漫画源
Venera 的漫画源通常通过 JS 解析 HTML 获取数据,不适合直接在腕上漫画内运行。腕上漫画提供了实验性的转换方案,通过中间件服务将 Venera 的 JS 漫画源转换为腕上漫画可用的 HTTP API。
转换服务基于 RESTful-venera-source(Venera Source Converter)仓库,支持两种部署方式:
| 部署方式 | 说明 |
|---|---|
| 服务器部署 | 需要一台自己的服务器和自定义域名,在服务器上直接运行 Express 服务 |
| EdgeOne Makers 部署 | 无需服务器,参考 使用 EdgeOne Makers 部署 一节,导入该仓库即可 |
添加其他 Venera 源
如需使用其他 Venera 源,将对应的 .js 源文件放入你 Fork 仓库的 cloud-functions/sources 目录后重新部署即可。
部署完成后,按照上面的 添加漫画源 步骤添加你的域名即可使用。
自定义漫画源格式要求
如果你想自己开发漫画源,需要遵循以下格式规范。
基本要求
- 建议支持 SSL(HTTPS)。自 v2.1 起支持 HTTP 回退:HTTPS 连接失败时会自动尝试 HTTP 并提示未加密连接
- 必须在
/config路由输出漫画源配置 - 所有业务接口建议返回 UTF-8 JSON
- 图片 URL 必须能被快应用直接请求,或者由你的 API 代理后返回图片二进制
- 如果需要登录态,可以通过 Cookie 支持用户认证
配置文件格式
漫画源必须在 /config 路由输出以下配置文件:
json5
{
sourceKey: {
name: "sourceName", // 漫画源显示名称(主界面显示的名称)
apiUrl: "https://youapi.domain", // API 基础地址,建议 HTTPS,不要以 / 结尾
detailPath: "/album/<id>", // 漫画详情 API,必须包含 <id> 占位符
photoPath: "/photo/<id>/chapter/<chapter>", // 图片列表 API,必须包含 <id>,章节漫画还应包含 <chapter>
searchPath: "/search/<text>/<page>", // 搜索 API,必须包含 <text> 和 <page>
type: "sourceType", // 漫画源类型标识(建议)
},
}字段说明:
| 字段 | 必需 | 说明 |
|---|---|---|
sourceKey | 是 | 漫画源内部键名。Cookie、当前源选择等会使用它作为标识 |
name | 是 | 在腕上漫画主界面显示的漫画源名称 |
apiUrl | 是 | API 基础地址,建议 HTTPS(自 v2.1 起支持 HTTP 回退及 IP+端口形式),不要以 / 结尾 |
detailPath | 是 | 漫画详情接口路径,必须包含 <id> 占位符 |
photoPath | 是 | 漫画图片列表接口路径,必须包含 <id>,章节漫画还应包含 <chapter> |
searchPath | 是 | 搜索接口路径,必须包含 <text> 和 <page> |
type | 建议 | 漫画源类型标识,当前主要用于区分来源,可与 sourceKey 相同 |
实际请求流程
- ID 直达详情:用户输入纯数字时,应用会请求
GET {apiUrl}{detailPath.replace("<id>", 用户输入ID)},例如GET https://youapi.domain/album/114514 - 关键词搜索:用户输入非纯数字内容时进入搜索页,
<text>会被使用encodeURIComponent编码,例如GET https://youapi.domain/search/%E6%B5%8B%E8%AF%95/1 - 打开搜索结果:用户点击搜索结果后,会再次请求详情接口(传入
comic_id) - 打开阅读页:先请求图片列表,再逐页请求
images[].url中的图片
API路由输出规则
detailPath - 漫画详情
获取漫画详情信息,用于在详情页显示漫画的基本信息。
json5
{
item_id: 114514, // 漫画ID(必需)
name: "comicName", // 漫画名称(必需)
page_count: 24, // 页数(必需,章节漫画可先返回第一章页数)
views: 1919810, // 漫画浏览量(可选)
rate: 9.0, // 漫画评分(可选)
cover: "https://youapicover.domain", // 漫画封面(必需)
tags: ["tag1", "tag2"], // 漫画标签数组(可选)
total_chapters: 10, // 总章节数(可选,大于 1 时应用按章节漫画处理,未提供时建议返回 1)
}字段说明:
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
item_id | 是 | number / string | 漫画 ID,后续阅读和下载会继续使用 |
name | 是 | string | 漫画名称 |
page_count | 是 | number | 页数。章节漫画可先返回当前源可获得的总页数或第一章页数,阅读页会根据图片列表重新更新 |
cover | 是 | string | 封面图片 URL,应用会自动追加封面图片参数 |
views | 否 | number / string | 浏览量 |
rate | 否 | number / string | 评分 |
tags | 否 | array | 标签数组 |
total_chapters | 否 | number | 总章节数,大于 1 时应用按章节漫画处理,未提供时建议返回 1 |
searchPath - 搜索漫画
搜索漫画,返回分页搜索结果列表。
json5
{
page: 1, // 当前页数(必需)
has_more: true, // 后面是否还有更多页数(必需)
results: [
// 搜索结果数组(必需)
{
comic_id: 114514, // 漫画ID(必需)
title: "comicName", // 漫画名称(必需)
cover_url: "https://youapicover.domain", // 漫画封面(必需,应用会自动追加封面参数)
pages: 24, // 页数(可选)
},
],
}字段说明:
| 字段 | 必需 | 类型 | 说明 |
|---|---|---|---|
page | 是 | number | 当前返回的页码,应用会用 page + 1 作为下一次请求页码 |
has_more | 是 | boolean | 是否还有下一页 |
results | 是 | array | 搜索结果数组 |
results[].comic_id | 是 | number / string | 漫画 ID,点击结果后会传给详情接口 |
results[].title | 是 | string | 漫画标题 |
results[].cover_url | 是 | string | 搜索结果封面 URL,应用会自动追加封面图片参数 |
results[].pages | 否 | number | 页数,用于搜索结果中展示 |
photoPath - 图片列表
获取指定章节的图片列表,用于在阅读页面显示漫画内容。
💡
images[].url不需要提前拼好width、quality、ifPNG、ifLVGL参数,腕上漫画会在真正请求图片文件时自动追加这些参数。
json5
{
title: "comicName", // 当前漫画或章节标题(必需)
images: [
// 图片数组(必需)
{ url: "https://youapiphoto1.domain/image/1" },
{ url: "https://youapiphoto2.domain/image/2" },
],
}图片 URL 参数规则
腕上漫画会对封面图和正文图片追加不同参数。
正文图片
阅读页和下载正文图片时,应用会追加:
text
width=<设置里的图片尺寸>&quality=<设置里的图片质量>如果用户开启"PNG图片解析",还会追加:
text
ifPNG=1如果用户开启"图片预解码",还会追加:
text
ifLVGL=1并且 URL 末尾会追加 fragment,用于本地临时文件识别:
text
#<chapter>.bin
#<page>.bin示例:
text
https://youapi.domain/image/proxy?url=xxx&width=600&quality=50&ifPNG=1&ifLVGL=1#1.binfragment 不会发送到服务器,只用于客户端本地识别临时文件扩展名。
封面图片
搜索封面、详情封面、下载封面会追加:
text
width=80&quality=<设置里的图片质量>开启"PNG图片解析"后还会追加 ifPNG=1。封面不会追加 ifLVGL,也不会保存为 .bin。
如果你的旧接口使用 w 表示宽度,建议同时兼容 width:
python
width = request.args.get("width") or request.args.get("w")图片接口建议行为
图片接口可以是正文图片直出接口,也可以是代理接口,需要完整返回图片二进制数据(如 Content-Type: image/jpeg、image/png),建议提供正确的 Content-Length,不应做分段或流式响应。
| 参数 | 类型 | 说明 |
|---|---|---|
width | number | 目标宽度。正文图片默认可按 600 处理,封面会传 80 |
quality | number | 图片质量,范围建议 1-100。JPEG 可直接映射质量;PNG 可用于颜色量化 |
ifPNG | truthy | 为 1、true、yes、on 时返回 PNG |
ifLVGL | truthy | 为 1、true、yes、on 时返回 LVGL 预解码二进制 |
返回类型优先级:
text
ifLVGL=1 > ifPNG=1 > 默认 JPEGifLVGL=1:返回Content-Type: application/octet-stream的 LVGL 预解码.bin数据(优先于ifPNG)ifPNG=1:返回Content-Type: image/png。推荐不改变图片尺寸(除非传了width)、去掉透明通道铺白底转 RGB、使用最高 PNG 压缩等级,可复用quality做颜色量化- 默认返回
Content-Type: image/jpeg
封面请求不会带
ifLVGL,所以封面接口不需要处理 LVGL。
请求头说明
所有 API 请求都会携带以下请求头:
text
User-Agent: packageName(versionName(versionCode))/product/brand/osType/osVersionName/osVersionCode/language/region例如:
text
User-Agent: moe.yzf.comic(1.8(114))/Xiaomi Smart Band 9 Pro/Vela/NuttX/10.3.0/656128/zh/CN你可以根据 User-Agent 中的 product 判断设备型号,从而根据设备的性能返回不同尺寸或格式的图片。
如果用户通过同步器上传过 Cookie,请求还会携带:
text
Cookie: cookie_valueCookie支持
如果漫画源需要Cookie认证,用户可以通过腕上漫画同步器插件上传Cookie。
实现漫画源时不得记录、转发或公开用户 Cookie
应全程使用 HTTPS,限制日志内容,并向用户说明 Cookie 的存储位置、保留时间和删除方式。
Cookie 会以 JSON 格式存储在手表端:
json5
{
sourceKey: "cookie_value",
}其中 sourceKey 对应 /config 返回对象中的顶层键名,例如 JMComic。请求该漫画源接口时会自动添加 Cookie 请求头。
错误返回建议
建议错误时返回 JSON,并使用合适的 HTTP 状态码:
json
{
"code": 500,
"message": "错误原因"
}| 场景 | HTTP 状态码 | 返回 |
|---|---|---|
| 漫画不存在 | 404 | { "code": 404, "message": "Comic not found" } |
| 章节不存在 | 404 | { "code": 404, "message": "Chapter not found" } |
| 缺少参数 | 400 | { "code": 400, "message": "Missing parameter" } |
| 上游失败 | 502 / 500 | { "code": 500, "message": "Upstream failed" } |
最小可用示例
完整的接口返回格式、请求流程与最小可用 Flask 示例见项目仓库的自定义漫画源配置指南。
希望这篇指南能帮助你配置自己的漫画源!如果有任何问题,欢迎在项目仓库提Issue反馈。
