JMComic-Crawler-Python/assets/docs/sources/tutorial/6_plugin.md
2024-06-26 00:14:30 +08:00

122 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Plugin - 插件
plugin(扩展/插件)是v2.2.0新引入的机制,使用插件可以实现灵活无感知的功能增强。
目前jmcomic已经内置了一些插件源码位于 src/jmcomic/jm_plugin.py。
你可以在这里查看这些插件的配置→ [option_file_syntax](../option_file_syntax.md#3-option插件配置项)
## 1. 插件机制介绍
你可以在option配置文件中配置插件插件会特定的<u>`事件`</u>发生时自动执行。
jmcomic里的内置事件如下
- `after_init`: option对象创建后
- `before_image`: 下载图片前
- `before_album`: 下载本子前
- `before_photo`: 下载章节前
- `after_image`: 下载图片后
- `after_album`: 下载本子后
- `after_photo`: 下载章节后
举例你可以配置一个login插件在option对象创建后`after_init`)时,调用`login`插件,执行登录禁漫的功能。
这样你后续使用option下载本子时都会处于已登录状态。已登录状态可以让你访问所有禁漫本子。
## 2. 示例在after_init时调用login插件
`login`插件功能登录JM获取并保存cookies到option内。后续option创建的Client都会携带cookies即都是登录状态。
配置方式将以下配置写入option文件
```yaml
plugins: # 插件配置项
after_init: # 在after_init事件时自动执行插件
- plugin: login # 插件的key
kwargs: # 下面是给插件的参数 (kwargs),由插件类自定义
username: un # 禁漫帐号
password: pw # 密码
```
有了上述option配置当你调用下面的代码时login插件就会执行。
```python
import jmcomic
option = jmcomic.create_option_by_file('xxx.yml') # 创建option对象
# 程序走到这里login插件已经调用完毕了
# 后续下载本子就都是已登录状态里了
option.download_album(123)
```
## 3. 怎么手动调用插件
你可以使用下面的代码触发某个事件
```python
# 假设你已经创建了option对象
from jmcomic import JmOption
option: JmOption
# 手动调用after_init事件下的插件
option.call_all_plugin('after_init')
# 手动调用一个特定事件的插件(如果你没有配置这个事件的插件,那么无事发生。)
option.call_all_plugin('my_event')
```
## 4. 示例:自定义插件
* 如果你有好的plugin想法也欢迎向我提PR将你的plugin内置到jmcomic模块中
下面演示自定义插件分为3步:
1. 自定义plugin类
2. 让plugin类生效
3. 使用plugin的key
```python
# 1. 自定义plugin类
from jmcomic import JmOptionPlugin, JmModuleConfig
# 自定义一个类继承JmOptionPlugin
class MyPlugin(JmOptionPlugin):
# 指定你的插件的key
plugin_key = 'myplugin'
# 实现invoke方法
# 方法的参数可以自定义,这里假设方法只有一个参数 word
def invoke(self, word) -> None:
print(word)
# 2. 让plugin类生效
JmModuleConfig.register_plugin(MyPlugin)
```
接下来在option中配置如下内容来使用你的插件
```yaml
# 3. 在配置文件中使用plugin
plugins:
after_init: # 事件
- plugin: myplugin # 你自定义的插件key
kwargs:
word: hello jmcomic # 你自定义的插件的参数
```
完成上述步骤后每当你使用下面的代码你的plugin会被调用控制台就会打印出 `hello jmcomic`
```python
from jmcomic import create_option
option = create_option('xxx')
```