Skip to content

Commit 99f5c6d

Browse files
authored
docs: 更新全语言 README 及错误 pip 链接,更新示例代码文档 (#515)
- 更新多语言版本 README 插件说明结构,并将版本更新计划规范化迁移至 roadmap - 优化基础教程中的 generator 翻页示例,采用更严谨的显式迭代控制机制 - 完善进阶域名策略教程,补充自定义 client 实例应用的最佳实践代码 - 补全异步插件开发的完整代码示例,提供更详细的配置与依赖包指引
1 parent 9ef2185 commit 99f5c6d

16 files changed

Lines changed: 937 additions & 22 deletions

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,4 +161,5 @@ cython_debug/
161161
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
162162
# and can be added to the global gitignore or merged into this file. For a more nuclear
163163
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
164-
.idea/
164+
.idea/
165+
.agent

README.md

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
<!-- 顶部标题 & 统计徽章 -->
22
<div align="center">
33
<h1 style="margin-top: 0" align="center">Python API for JMComic</h1>
4+
5+
<p align="center">
6+
<strong>简体中文</strong> •
7+
<a href="./assets/readme/README-en.md">English</a> •
8+
<a href="./assets/readme/README-jp.md">日本語</a> •
9+
<a href="./assets/readme/README-kr.md">한국어</a>
10+
</p>
11+
412
<p align="center">
513
<strong>提供 Python API 访问禁漫天堂(网页端 & 移动端),集成 GitHub Actions 下载器🚀</strong>
614
</p>
@@ -56,7 +64,7 @@
5664
* 通过pip官方源安装(推荐,并且更新也是这个命令)
5765

5866
```shell
59-
pip install jmcomic -i https://pypi.org/project -U
67+
pip install jmcomic -U
6068
```
6169
* 通过源代码安装
6270

@@ -175,14 +183,21 @@ jmcomic 123
175183
- `硬件占用监控插件`
176184
- `只下载新章插件`
177185
- `压缩文件插件`
186+
- `客户端代理插件`
178187
- `下载特定后缀图片插件`
179188
- `发送QQ邮件插件`
180-
- `自动使用浏览器cookies插件`
189+
- `日志主题过滤插件`
190+
- `自动获取浏览器cookies插件`
181191
- `导出收藏夹为csv文件插件`
182192
- `合并所有图片为pdf文件插件`
183193
- `合并所有图片为长图png插件`
184-
- `重复文件检测删除插件`
185194
- `网页观看本地章节插件`
195+
- `订阅更新插件`
196+
- `小章节跳过插件`
197+
- `重复文件检测删除插件`
198+
- `路径字符串替换插件`
199+
- `高级重试插件`
200+
- `封面下载插件`
186201

187202
## 使用小说明
188203

assets/docs/mkdocs.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,33 @@ theme:
3232
- search.share
3333
- navigation.tabs
3434
- navigation.top
35+
nav:
36+
- 首页: index.md
37+
- 版本更新计划: roadmap.md
38+
- 配置文件指南: option_file_syntax.md
39+
- Api 文档:
40+
- api/client.md
41+
- api/command-line.md
42+
- api/config.md
43+
- api/download.md
44+
- api/entity.md
45+
- api/option.md
46+
- api/plugin.md
47+
- api/toolkit.md
48+
- 使用教程:
49+
- tutorial/0_common_usage.md
50+
- tutorial/1_github_actions.md
51+
- tutorial/2_command_line.md
52+
- tutorial/4_module_custom.md
53+
- tutorial/5_filter.md
54+
- tutorial/6_plugin.md
55+
- tutorial/7_advance.md
56+
- tutorial/8_pick_domain.md
57+
- tutorial/9_custom_download_dir_name.md
58+
- tutorial/10_export_favorites.md
59+
- tutorial/11_log_custom.md
60+
- tutorial/12_domain_strategy.md
61+
3562
plugins:
3663
- search
3764
- mkdocstrings:

assets/docs/sources/api/plugin.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,4 +3,4 @@
33
::: jmcomic.jm_plugin
44
options:
55
filters:
6-
- Plugin$
6+
- (Plugin$|JmOptionPlugin|^Plugin)

assets/docs/sources/index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
>
88
> 你可以通过简单的几行Python代码,访问禁漫的接口,以及下载禁漫的本子。
99
>
10-
> [查看项目更新计划](TODO.md)
10+
> [查看项目更新计划](roadmap.md)
1111
1212
## 一图看懂 JMComic 工具生态
1313

assets/docs/sources/option_file_syntax.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,14 @@ client:
4242
# retry_times: 请求失败重试次数,默认为5
4343
retry_times: 5
4444

45+
# cache: 是否开启客户端级别的缓存,用于缓存已经请求过的元数据(如本子详情、搜索结果等),减少重复网络请求。
46+
# 支持以下几种配置值(详见 CacheRegistry 类):
47+
# - null 或 false (默认值): 关闭缓存,每次请求都重新发起。
48+
# - true 或 level_option: 开启 option 级别缓存,同一个 option 派生的所有 client 共享同一份缓存。
49+
# - level_client: 开启 client 级别缓存,每个 client 维持各自独立的缓存字典,互不干扰。
50+
cache: null
51+
52+
4553
# postman: 请求配置
4654
postman:
4755
meta_data:
@@ -137,6 +145,7 @@ dir_rule:
137145
plugins:
138146
after_init:
139147
- plugin: usage_log # 实时打印硬件占用率的插件
148+
# log: false # 选填。所有的插件都可以配置 `log: false` 以关闭该插件执行时产生的日志输出,默认是 true
140149
kwargs:
141150
interval: 0.5 # 间隔时间
142151
enable_warning: true # 占用过大时发出预警
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# 版本更新计划
1+
# 项目更新计划
22

33
| 版本范围 | 更新计划 |
44
|:--------:|:-----------------------------------------:|

assets/docs/sources/tutorial/0_common_usage.md

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -228,6 +228,7 @@ page: JmCategoryPage = cl.month_ranking(1)
228228
page: JmCategoryPage = cl.week_ranking(1)
229229

230230
# 循环获取分页,使用 cl.categories_filter_gen
231+
# 基础用法:简单的 for 循环
231232
for page in cl.categories_filter_gen(page=1, # 起始页码
232233
# 下面是分类参数
233234
time=JmMagicConstants.TIME_WEEK,
@@ -237,6 +238,22 @@ for page in cl.categories_filter_gen(page=1, # 起始页码
237238
for aid, atitle in page:
238239
print(aid, atitle)
239240

241+
# 高级用法:使用 generator 的 send() 方法在遍历中途动态修改查询条件
242+
# 注意:必须用 while 循环手动接收 send() 的返回值,避免在 for 循环内调用 send() 跳过分页
243+
generator = cl.categories_filter_gen(page=1, time=JmMagicConstants.TIME_WEEK)
244+
try:
245+
page = next(generator) # 预先启动生成器
246+
while True:
247+
# 打印第一页
248+
for aid, atitle in page:
249+
print(aid, atitle)
250+
251+
# 假设我们只想看前一页,下一页想换一个排序方式
252+
# 调用 send 传入包含新参数的 dict 即可覆盖原来的查询条件
253+
page = generator.send({"order_by": JmMagicConstants.ORDER_BY_LATEST})
254+
except StopIteration:
255+
pass
256+
240257
```
241258

242259
## 高级搜索(分类/副分类)
@@ -281,6 +298,19 @@ for page in html_cl.search_gen(search_query='mana',
281298
# 打印page内容
282299
for aid, atitle in page.iter_id_title():
283300
print(aid, atitle)
301+
302+
# 高级用法:使用 generator 的 send() 方法进行手动翻页或修改查询条件
303+
generator = html_cl.search_gen('mana')
304+
try:
305+
page = next(generator)
306+
while True:
307+
for aid, atitle in page.iter_id_title():
308+
print(aid, atitle)
309+
310+
# 可直接动态传参改变搜索条件,例如下一页换成搜索 'nana'
311+
page = generator.send({"search_query": 'nana'})
312+
except StopIteration:
313+
pass
284314
```
285315

286316

Lines changed: 114 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,114 @@
1+
# 域名与重试策略
2+
3+
访问禁漫时,常遇到网络不畅或默认域名失效的情况。jmcomic 提供了静态配置、动态获取和重试插件机制来应对。
4+
5+
下面演示如何配置和获取稳定或最新的可用域名。
6+
7+
## 1. 静态配置域名
8+
9+
如果你的网络环境下,某些域名(如 `18comic.vip`, `18comic.org`)可以稳定访问,最直接的方式是在配置文件中写死这些域名。
10+
11+
```yaml
12+
# option.yml 示例
13+
client:
14+
impl: html
15+
domain:
16+
html:
17+
- 18comic.vip
18+
- 18comic.org
19+
```
20+
21+
```python
22+
from jmcomic import *
23+
24+
# 通过配置文件构建并获取配置好的 Option 和 Client
25+
# Option会加载上面的域名列表,在请求时如果第一个域名失败,会自动重试列表中的下一个域名。
26+
op = create_option('option.yml')
27+
cl = op.new_jm_client()
28+
```
29+
30+
## 2. 动态获取域名
31+
32+
如果静态配置的域名失效,可以通过调用以下内置的 API 动态获取最新的禁漫域名。
33+
34+
> **注意**
35+
> 默认情况下,以下 API 在请求外网时会自动使用系统代理。但在 Linux 服务器等无全局代理的环境中,如果需要手动指定代理,你可以自行创建一个配置了 proxy 的 postman 对象并作为参数传入:
36+
> `JmModuleConfig.get_html_domain_all(postman=JmModuleConfig.new_postman(proxies={'http': 'http://127.0.0.1:7890', 'https': 'http://127.0.0.1:7890'}))`
37+
38+
39+
### 2.1 抓取全部可用域名(推荐)
40+
41+
通过请求禁漫的官方发布页,获取所有公告的最新的网页端域名列表。
42+
43+
```python
44+
from jmcomic import *
45+
46+
# 获取全量域名列表
47+
domain_list = JmModuleConfig.get_html_domain_all()
48+
print(f"全量域名列表:{domain_list}")
49+
50+
# 将获取到的域名替换掉全局默认域名列表
51+
JmModuleConfig.DOMAIN_HTML_LIST = domain_list
52+
53+
op = create_option('option.yml')
54+
# 新建的 Client 会默认使用刚刚更新的 DOMAIN_HTML_LIST
55+
cl = op.new_jm_client()
56+
```
57+
58+
### 2.2 通过 GitHub 兜底获取域名
59+
60+
如果连禁漫的发布页本身都被墙了无法访问,可以请求禁漫官方放在 GitHub 的仓库来解析最新域名。
61+
62+
```python
63+
from jmcomic import *
64+
65+
# 该请求发往 github.com,在大多数常规网络中均能保持连通
66+
domains = JmModuleConfig.get_html_domain_all_via_github()
67+
68+
op = JmOption.default()
69+
# 可以结合重试机制,允许失败时轮换多次
70+
op.client.retry_times = 3
71+
72+
# 应用域名池新建包含该域名的 Client (记得指定 impl='html')
73+
# 将新建的 client 赋值回 op,使其在后续的下载中生效
74+
op.client = op.new_jm_client(domain_list=domains, impl='html')
75+
76+
download_album('438696', op)
77+
```
78+
79+
### 2.3 获取单个跳转域名
80+
81+
除了获取全部域名,也可以通过访问永久跳转页获取单个重定向用的新域名。
82+
83+
```python
84+
from jmcomic import *
85+
86+
# 获取当前可用的单一网页端域名
87+
domain = JmModuleConfig.get_html_domain()
88+
89+
op = JmOption.default()
90+
op.client = op.new_jm_client(domain_list=[domain], impl='html')
91+
```
92+
93+
94+
## 3. 使用高级重试插件(AdvancedRetryPlugin)
95+
96+
默认的机制是在单次请求报错时,按顺序尝试数组内的下一个域名。
97+
如果经常遇到连接断开或超时,可以使用 `advanced_retry` 插件。该插件提供:
98+
- 记录历史失败次数
99+
- 限制单个域名的最大失败次数(超过则拉黑废弃)
100+
- 对列表循环多轮尝试等容错机制
101+
102+
**在 option.yml 中配置启用:**
103+
104+
```yaml
105+
plugins:
106+
after_init:
107+
- plugin: advanced_retry # 声明并开启高级重试插件
108+
kwargs:
109+
retry_config:
110+
retry_rounds: 3 # 整个域名数组支持轮询尝试的圈数
111+
retry_domain_max_times: 5 # 单个域名允许的最大失败次数
112+
```
113+
114+
配置后,用该 option 构建的 Client 在下载和请求时,就会自动切入高级容错策略。

assets/docs/sources/tutorial/4_module_custom.md

Lines changed: 4 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,6 @@
22

33

44

5-
下方所有函数都省略了如下的导包和准备代码
6-
7-
```python
8-
from jmcomic import *
9-
option = JmOption.default()
10-
client: JmcomicClient = option.build_jm_client()
11-
```
12-
13-
14-
155
## 自定义下载前后的回调函数
166

177
```python
@@ -151,8 +141,8 @@ def custom_jm_log():
151141
"""
152142

153143
# jmcomic模块在运行过程中会使用 jm_log() 这个函数进行打印信息
154-
# jm_log() 这个函数 最后会调用 JmModuleConfig.log_executor 函数
155-
# 你可以写一个自己的函数,替换 JmModuleConfig.log_executor,实现自定义log
144+
# jm_log() 这个函数 最后会调用 JmModuleConfig.EXECUTOR_LOG 函数
145+
# 你可以写一个自己的函数,替换 JmModuleConfig.EXECUTOR_LOG,实现自定义log
156146

157147
# 1. 自定义log函数
158148
def my_log(topic: str, msg: str):
@@ -164,11 +154,12 @@ def custom_jm_log():
164154
pass
165155

166156
# 2. 让my_log生效
167-
JmModuleConfig.log_executor = my_log
157+
JmModuleConfig.EXECUTOR_LOG = my_log
168158
```
169159

170160

171161

162+
172163
## 自定义异常监听器/回调
173164

174165
```python

0 commit comments

Comments
 (0)