Add Legado repo link and 163zw example source

This commit is contained in:
Narylr committed 2026-03-19 23:12:43 +08:00
1 parent 4cfe178b41
commit 5934e806dd
2 files changed
+68 -10

No files matched your search

+24 -10
View File
@@ -1,10 +1,11 @@
# book-source-creator-skill
仓库地址:`https://github.com/Narylr350/book-source-creator-skill`
这是一个用于为 Legado 阅读器创建、调试和验证书源的技能仓库。
这是一个用于为 Legado 阅读器创建、调试和验证书源的技能仓库。仓库根目录用于说明如何使用,真正的技能包放在 [`book-source-creator/`](./book-source-creator/) 目录里,这样不会和技能本身的 `README.md` 冲突。
- 本仓库地址:`https://github.com/Narylr350/book-source-creator-skill`
- Legado 仓库地址:`https://github.com/gedoor/legado`
这个 skill 已在 Codex 环境中测试成功。其他 AI 工具目前没有系统测试过,所以不承诺在其他工具里能直接得到同样结果。
这个 skill 已在 Codex 环境中测试成功。其他 AI 工具目前没有系统测试过。
## 需要什么
@@ -20,6 +21,7 @@
```text
book-source-creator-skill/
README.md # 仓库级使用说明
examples/ # 示例书源
book-source-creator/ # 技能本体
SKILL.md
README.md
@@ -104,16 +106,28 @@ book-source-creator-skill/
9. 导入 Legado 实测
```
### 示例 3:163中文网实测结论
### 示例 3:163中文网书源
这个仓库对应的 skill 已经实际用于 `163中文网` 书源生成与验证:
- 示例书源文件:[`examples/163zw-legado.json`](./examples/163zw-legado.json)
- 测试站点:`https://www.163zw.com/`
- 搜索、详情、目录、正文链路都已通过 Browser MCP 实测
- 目录存在分页,已纳入规则设计
- 正文存在单章多页,已纳入规则设计
- 在当前测试样本下,`163中文网` 书源未发现明显问题
这个仓库对应的 skill 已经实际用于 `163中文网` 书源生成与验证。当前这一版书源在实际检查中没有发现明显问题,但不代表站点未来不会改版。
这里的“未发现问题”是指在 Codex + Browser MCP + Legado 导入验证这一轮里没有发现明显故障,不代表站点未来不会改版。
## 163中文网书源创建过程
这份 `163中文网` 书源是按下面的流程做出来的:
1. 先确认站点是否需要登录。`163中文网` 当前公开搜索、详情、目录、正文都可直接访问,所以不需要先走登录流程。
2. 输出网站可生成性评估。结论是可生成,但正文存在单章多页、目录存在多页分页,所以应明确记录风险点。
3. 用 Browser MCP 验证搜索链路。搜索 `凡人修仙` 后,确认结果列表、书名、作者、封面和详情链接都能稳定拿到。
4. 进入详情页,确认书名、作者、简介、封面和章节列表入口。
5. 检查目录页,确认目录首屏只有部分章节,且存在分页,因此规则中需要 `nextTocUrl`。
6. 进入正文页,确认正文是真实文本而不是图片,但单章被拆成多页,因此规则中需要 `nextContentUrl` 来拼接同一章。
7. 生成书源 JSON,并把目录分页和正文分页都写进规则。
8. 用辅助脚本做结构校验和规则审计。
9. 最后在 Legado 中实际导入检查,当前未发现明显问题。
这套流程的核心不是“先写规则”,而是“先用 Browser MCP 把站点行为看清楚,再决定规则怎么写”。
## 脚本说明
+44
View File
@@ -0,0 +1,44 @@
[
{
"bookSourceName": "163中文网",
"bookSourceUrl": "https://www.163zw.com",
"bookSourceType": 0,
"bookSourceGroup": "国内小说",
"bookUrlPattern": "https?://www\\.163zw\\.com/\\d+/\\d+/?",
"customOrder": 0,
"enabled": true,
"enabledExplore": false,
"header": "",
"loginUrl": "",
"bookSourceComment": "基于 Browser MCP 实测制作。已验证搜索、详情、目录和正文链路;正文支持单章多页拼接,目录支持多页翻页。",
"lastUpdateTime": 1773492000,
"weight": 0,
"exploreUrl": "",
"searchUrl": "https://www.163zw.com/search.php?q={{key}}&p={{page}}",
"ruleSearch": {
"bookList": "@css:div.box.hot > div.row > div.col-12.col-md-6",
"name": "@css:dd h3 a@text##^\\[[^\\]]+\\]##",
"author": "@css:dd.book_other span@text",
"coverUrl": "@css:dt a img@src@js:result.indexOf('http') === 0 ? result : 'https://www.163zw.com' + result",
"bookUrl": "@css:dt a@href@js:result.indexOf('http') === 0 ? result : 'https://www.163zw.com' + result"
},
"ruleExplore": {},
"ruleBookInfo": {
"name": "@css:div.row.book_info h1@text",
"author": "@css:div.row.book_info div.info li:nth-child(1) a@text",
"coverUrl": "@css:div.row.book_info img@src@js:result.indexOf('http') === 0 ? result : 'https://www.163zw.com' + result",
"intro": "@css:#intro_pc@text##^简介:\\s*## ##您要是觉得《[\\s\\S]*$##",
"tocUrl": ""
},
"ruleToc": {
"chapterList": "@css:div.book_list.book_list2 ul.row li",
"chapterName": "@css:a@text",
"chapterUrl": "@css:a@href@js:result.indexOf('http') === 0 ? result : 'https://www.163zw.com' + result",
"nextTocUrl": "@css:ul.pagination li.active + li a.page-link@href@js:result && /index_\\d+\\.html$/.test(result) ? ['https://www.163zw.com' + result] : []"
},
"ruleContent": {
"content": "<js>\nvar html = result || '';\nvar match = html.match(/<article[^>]*class=[\"'][^\"']*font_max[^\"']*[\"'][^>]*>([\\s\\S]*?)<\\/article>/i);\nvar body = match ? match[1] : html;\nresult = body\n .replace(/第\\(\\d+\\/\\d+\\)页/g, '')\n .replace(/&nbsp;/gi, ' ')\n .replace(/<br\\s*\\/?>/gi, '\\n')\n .replace(/<[^>]+>/g, '')\n .replace(/\\r/g, '')\n .replace(/\\n{3,}/g, '\\n\\n')\n .trim();\nresult;\n</js>",
"nextContentUrl": "@css:a#next1@href@js:if(!result){[]}else{var cur=String(baseUrl||'');var next=result.indexOf('http')===0?result:'https://www.163zw.com'+result;var c=cur.match(/\\/(\\d+)(?:_(\\d+))?\\.html(?:$|[?#])/);var n=next.match(/\\/(\\d+)(?:_(\\d+))?\\.html(?:$|[?#])/);c&&n&&c[1]===n[1]?[next]:[];}"
}
}
]