最近要做个需求,需要在浏览器页面中进行一系列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类型的文件。
但是呢,如果插件被卸载了,那么你会发现再次运行此代码,就装不上插件了,因为进入了屏蔽名单
每次通过此方式来使插件退出屏蔽名单,很明显不够便捷,想必大家都是要完成自动化操作。经过一番寻找,最终定位到首选项配置文件。
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给本地浏览器自动安装插件功能已完整实现!