Appearance
如何配置腕上漫画自定义漫画源
腕上漫画支持配置自定义漫画源,让你可以使用自己选择的漫画 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。使用前请确认手表和漫画源的存储、传输方式符合你的安全预期;不再使用该漫画源时,应退出账号并撤销对应会话。
快速部署漫画源
如果你找不到可用的漫画源,可以使用作者提供的开源仓库快速部署一个。
鉴于大部分用户没有写代码的经历,以及个人原因无法保证所有的漫画源可用,在这里优先推荐各位用户搭建自己的自定义漫画源。
搭建方法非常简单,只需要一个Vercel账号以及一个自己的域名即可。
可用仓库
选择下面可用的仓库,按照指引部署即可快速搭建好可用的漫画源。不过其中的域名是无法访问的,需要搜索Vercel如何绑定自定义域名才可以使用。
jmcomic API
ehentai API
使用Vercel部署
下面以部署 jmcomic API 为例,介绍如何使用 Vercel 部署漫画源。
准备工作
部署步骤
1. Fork仓库
访问 vercel-flask-jmcomic-api 仓库,点击右上角的 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配置信息,说明部署成功。
部署完成后,按照上面的 添加漫画源 步骤添加即可使用。
实验性功能:导入Venera漫画源
由于Venera的漫画源通常通过 JS 解析 HTML 获取数据,不适合直接在腕上漫画内运行,腕上漫画提供了实验性的转换方案,允许将 Venera 漫画源转换为腕上漫画可用的 HTTP API。
该方法需要用户拥有服务器和自定义域名,可参考以下仓库:
自定义漫画源格式要求
如果你想自己开发漫画源,需要遵循以下格式规范。
基本要求
- 建议支持 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反馈。

Roi Feng