|
| 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 在下载和请求时,就会自动切入高级容错策略。 |
0 commit comments