概述
需要使用playwright在chrome中打开chrome://system/,然后点开插件按钮,查看所有的插件内容,过滤出需要的内容。
代码实现
import logging.configimport osimport reimport timefrom playwright.sync_api import sync_playwrightlogging.config.fileConfig("logger.ini")logger = logging.getLogger()configs = None# 这个是录屏插件的部分名称,用于模糊匹配的plugin_name = 'screen'# 用于保存录屏插件pid的文件名称plugin_pid_file = ''def getExtensionId(extensionName):extensionName = extensionName.lower()"""根据插件名称,获取自定义插件的id:param extensionName::return:"""if not os.path.exists(configs['ext_chrome_path']):logger.warning('chrome not exist, please check. path:%s' % configs['ext_chrome_path'])returnurl = 'chrome://system/'with sync_playwright() as playwright:browser = playwright.chromium.launch_persistent_context(configs['chrome_user_data_dir'],args=configs['chrome_parameters'],headless=configs['record_headless'],executable_path=configs['ext_chrome_path'],ignore_default_args=['--enable-automation'])print(f'start to load page,{time.time()}')page = browser.new_page()# 打开指定网址page.goto(url)# 等待按钮被渲染出来page.wait_for_selector('id=extensions-value-btn')# 点击按钮page.click('id=extensions-value-btn')# 等待div被显示出来page.wait_for_selector('id=extensions-value')# 获取div内部的文本值text = page.inner_text('id=extensions-value')print(f'total plugin info: {text}')if text:for line in text.splitlines():(pid, name, version) = re.split(r'\s:\s', line)if extensionName in name.lower():return (pid, name)def get_extension_pid(my_configs):"""获取录屏插件的pid,作为chrome参数使用:return:"""global configs, plugin_pid_fileconfigs = my_configsplugin_pid_file = configs['plugin_pid_file']if not has_pid():logger.info('screen plugin id not exist, need to generate')generate_pid()logger.info(f'success to generate screen plugin')else:logger.info('screen plugin pid exist, just return')my_pid = ''with open(plugin_pid_file, 'r') as f:my_pid = f.readline()logger.info(f'final return screen plugin id: {my_pid}')return my_piddef has_pid():"""判断当前是否存在录屏插件的pid,不存在的话,则需要生成:return:"""return os.path.exists(plugin_pid_file)def generate_pid():logger.info('start to get custom plugin id')(pid, pname) = getExtensionId(plugin_name)logger.info(f'screen plugin id: {pid}')logger.info(f'screen plugin name: {pname}')with open(plugin_pid_file, 'w') as f:f.write(pid)if __name__ == "__main__":generate_pid()
