如何用Python通过Windows注册表给Chrome安装插件?

701 阅读3分钟

最近要做个需求,需要在浏览器页面中进行一系列dom操作,然后把提取到的文本或数据信息发送到客户端。那么实现这个功能首先便是要给本地浏览器安装插件,用户从客户端点击“开启”之后,如果检测到本地浏览器没有安装就先装插件,让用户手动安装那肯定体验不好,如何自动安装插件便是本文章所介绍的内容。

一开始想着通过python获取到浏览器实例直接安装,但是这样只能获取到一个新打开的浏览器实例,并不能实现给本地浏览器安装插件。

谷歌插件官网提供了 通过注册表安装插件的方法,下面是python的完整实现。

import winreg as reg 
def set_chrome_extension(extension_id, extension_path): 
try: 
    # 打开注册表路径(HKEY_CURRENT_USER),如果路径不存在则创建 
    registry_path = r"SOFTWARE\Google\Chrome\Extensions" 
    key = reg.CreateKey(reg.HKEY_CURRENT_USER, registry_path) 
    # 创建指定插件的注册表项 
    extension_key = reg.CreateKey(key, extension_id) 
    # 设置插件路径 
    reg.SetValueEx(extension_key, "update_url", 0, reg.REG_SZ, "https://clients2.google.com/service/update2/crx") 
    reg.SetValueEx(extension_key, "path", 0, reg.REG_SZ, extension_path) # 插件的本地路径 
    # 关闭注册表键 reg.CloseKey(extension_key) 
    print(f"插件 {extension_id} 已成功安装到 Chrome。") 
except Exception as e: 
    print(f"发生错误: {e}") 
finally: 
    reg.CloseKey(key) 
# 设置插件 ID 和本地路径
extension_id = "your_extension_id" # 插件的实际 ID 
extension_path = r"youer_extension_path" # 插件的本地路径 
set_chrome_extension(extension_id, extension_path)

Tips:安装流程需要在浏览器关闭状态下进行,重启浏览器后生效,其中插件的本地路径是插件已解压的文件夹,也可以自行稍作修改直接安装crx类型的文件。

但是呢,如果插件被卸载了,那么你会发现再次运行此代码,就装不上插件了,因为进入了屏蔽名单

image.png

每次通过此方式来使插件退出屏蔽名单,很明显不够便捷,想必大家都是要完成自动化操作。经过一番寻找,最终定位到首选项配置文件。

C:\Users\your_pc\AppData\Local\Google\Chrome\User Data\Default\Preferences Preferences文件中external_uninstalls便是屏蔽名单,在浏览器关闭状态下通过代码逻辑去掉此插件id,再次重启浏览器插件便会被自动带回!

下面贴出最终完整版代码。

import winreg as reg
import os
import json
from pathlib import Path

def get_chrome_preferences_path():
    reg_candidates = [
        (reg.HKEY_CURRENT_USER, r"SOFTWARE\Google\Chrome\BLBeacon"),
        (reg.HKEY_CURRENT_USER, r"SOFTWARE\WOW6432Node\Google\Chrome\BLBeacon"),
        (reg.HKEY_LOCAL_MACHINE, r"SOFTWARE\Google\Chrome\BLBeacon"),
        (reg.HKEY_LOCAL_MACHINE, r"SOFTWARE\WOW6432Node\Google\Chrome\BLBeacon"),
    ]
    for hive, subkey in reg_candidates:
        try:
            with reg.OpenKey(hive, subkey) as k:
                user_data_dir, _ = reg.QueryValueEx(k, "user_data_dir")
                path = Path(user_data_dir) / "Default" / "Preferences"
                if path.exists():
                    print(f"✅ 找到 Preferences 路径: {path}")
                    return str(path)
        except FileNotFoundError:
            continue
        except Exception as e:
            print(f"⚠️ 读取注册表失败 {subkey}: {e}")

    fallback = Path(os.getenv("LOCALAPPDATA", "")) / "Google" / "Chrome" / "User Data" / "Default" / "Preferences"
    if fallback.exists():
        print(f"✅ 使用 fallback 路径: {fallback}")
        return str(fallback)
    print(f"❌ Preferences 路径不存在: {fallback}")
    return None

def remove_extension_from_preferences(ext_id: str):
    pref_path = get_chrome_preferences_path()
    if not pref_path:
        print("❌ 无法找到 Preferences 路径")
        return

    try:
        data = json.loads(Path(pref_path).read_text(encoding="utf-8"))
    except Exception as e:
        print(f"❌ 读取 Preferences 失败: {e}")
        return

    changed = False
    extensions = data.get("extensions", {})

    if ext_id in extensions.get("external_uninstalls", []):
        extensions["external_uninstalls"].remove(ext_id)
        changed = True

    if ext_id in extensions.get("settings", {}):
        extensions["settings"].pop(ext_id, None)
        changed = True

    if changed:
        try:
            Path(pref_path).write_text(json.dumps(data, ensure_ascii=False, indent=2), encoding="utf-8")
            print(f"✅ 移除扩展 {ext_id}")
        except Exception as e:
            print(f"❌ 写入 Preferences 失败: {e}")
    else:
        print(f"ℹ️ 扩展 {ext_id} 未在 Preferences 中找到")

def set_chrome_extension(extension_id, extension_path):
    try:
        key = reg.CreateKey(reg.HKEY_CURRENT_USER, r"SOFTWARE\Google\Chrome\Extensions")
        extension_key = reg.CreateKey(key, extension_id)
        reg.SetValueEx(extension_key, "update_url", 0, reg.REG_SZ, "https://clients2.google.com/service/update2/crx")
        reg.SetValueEx(extension_key, "path", 0, reg.REG_SZ, extension_path)
        print(f"✅ 安装插件 {extension_id}")
    except Exception as e:
        print(f"❌ 设置插件失败: {e}")
    finally:
        reg.CloseKey(extension_key)
        reg.CloseKey(key)

# 示例调用
extension_id = "your_extension_id" # 插件的实际 ID 
extension_path = r"your_extension_path" # 插件的本地路径 

set_chrome_extension(extension_id, extension_path)
remove_extension_from_preferences(extension_id)

至此,通过python给本地浏览器自动安装插件功能已完整实现!