🔌插件系统实现

插件系统由PluginManager、MessageManager、Interface插件接口和插件库四部分组成

PluginManager:由加载类、注册类、查找类、运行类、插件线程五个类实现。

MessageManager:由监听线程实现。

Interface插件接口:依赖模块实现的接口留给插件编写者调用,更方便的完成插件编写。

插件库:插件开发者实现的一系列插件,该系统有一定的插件编写规范。

PART 1:PluginManager插件管理器

目的:实现多个插件的同时运行,插件的加载,插件的注册,插件信息的展示

  • 根据用户选择,加载对应插件

  • 列出对应插件参数

  • 多线程同时运行多个插件

  • 展示插件运行结果

  • 消息队列处理多个插件返回结果

  • 自行导入插件,同时安装插件依赖python库

加载类功能:

check函数用于遍历plugins文件夹中所有插件,判断是否所有插件都在Plugins.json中注册,如果未注册就交给注册类注册

# 加载类
class Load:
    def __init__(self,Register) -> None:
        self.Register=Register
        pass
        
    # 检测插件
    def check(self):
        # 读取 Plugins.json 文件
        with open("myproject\PluginSystem\Plugins.json", 'r') as f:
            registered_plugins = [i["name"] for i in json.load(f)['PluginList']]
            # print(registered_plugins)

        # 扫描子文件夹 Plugins 下的所有文件夹,找到其中的插件
        plugins = []
        for folder_name in os.listdir('myproject\PluginSystem\Plugins'):
    
            folder_path = os.path.join('myproject\PluginSystem\Plugins', folder_name)
            if os.path.isdir(folder_path) and os.path.isfile(os.path.join(folder_path, 'info.json')):
                plugins.append(folder_name)
        # print(plugins)

        # 检查每个插件是否都已经在 Plugins.json 中注册,为注册则注册该插件
        for plugin in plugins:
            if plugin not in registered_plugins:
                # print(f'Error: Plugin {plugin} is not registered in Plugins.json')
                self.Register.registe(plugin)
        print("所有插件加载完成")

PART 2:MessageManager插件消息管理器

目的:实现一个监听线程处理插件返回的消息

  • 处理插件返回的消息

  • 处理插件返回的日志

  • 储存插件返回的结果

监听多线程消息的实现原理:插件接口会接收来自各个插件返回的消息交给一个队列,开辟的监听线程会实时监听该队列,并且解析从队列中读取的消息,分类交给Recorder库将消息存储起来

PART 3:plugins.Interface插件接口

  • Interface.Trans_message(message)

向插件系统传递消息,插件系统会根据message处理消息

  • Get_HTMLExtractor(HTML="")

获取一个HTML解析器,HTML提取器将会解析html的input输入框,form表单,textarea多行输入框,接口使用实例

  • Get_SelfDefExtractor(setting={})

获得一个自定义提取器,提取指定的html元素

  • request_form(args)

针对使用HTMLExtractor.extract_form()提取器提取的表单结果,发送请求的一个接口,返回一个响应

接收参数详解:

具体实现:

  • request_input(args)

针对使用HTMLExtractor.extract_input()提取器提取的input输入框结果,发送请求的一个接口,返回一个响应

  • Get_Storage()

获得一个Storage对象用于向对数据库的操作:1.创建表单 2.向指定表单插入数据

  • GET_Recorder(project_name)

  • Get_file(plugin,filename,type)

获得该插件的工作路径下的文件操作

  • Get_a_file(file_path,type)

获得一个文件:

  • Get_url_from_scrapy(project_name)

从scrapy扫描结果载入url文件

最后更新于

这有帮助吗?