如何使用Python阅读firefox版本30.0的about:config条目?我尝试使用这个answer指向的内容(在JavaScript中),但它没有帮助。
答案 0 :(得分:2)
是的,这是一个问题。 Firefox为大多数首选项提供默认值,并且仅存储与配置文件中的默认值不同的值。除此之外,每个附加组件都可能带有其他默认值,并在运行时创建新的首选项。
默认的pref文件可能包含在zip文件中,这使问题变得复杂。
您必须检查默认首选项的文件(在标准的Firefox发行版中)
$APPDIR/omni.ja:greprefs.js
$APPDIR/omni.ja:defaults/preferences/*.js
$APPDIR/browser/omni.ja:greprefs.js
$APPDIR/browser/omni.ja:defaults/preferences/*.js
$PROFILE/extensions/*/defaults/preferences/*.js
$PROFILE/extensions/*.xpi:defaults/preferences/*.js
虽然从默认值覆盖的首选项位于$PROFILE/prefs.js
。
首先,您需要找出$APPDIR
(Firefox的安装路径),然后找出$PROFILE
(Firefox用户个人资料路径)。
然后你需要在某些目录(简单)或某些zip文件(硬盘)中读取一些文件。一个主要问题是,您不能只使用zipfile
来读取omni.ja
(以及可能的一些xpi
文件),因为典型的python zipfile
实现在解释中过于严格的zip结构,无法打开这些文件。因此,您需要自己的zipfile
实施方案来解决此问题。
在*.js
文件中,基本上有两种类型的行(+空行,注释行):
pref("name", value)
user_pref("name", value)
pref
行是默认首选项,user_pref
行是用户首选项(默认情况下已覆盖)。
value
是一个Javascript表达式,例如"abc"
,true
,1
或2 * 3
。后者是一个问题,因为您需要JS引擎来正确评估它。但这在实践中并不是一个真正的问题,因为你不会发现在野外(通常)计算某些东西的表达式。
真正复制偏好系统(或about:config
)并不是一件容易的事,而且充满了障碍。只需阅读用户pref.js
即可查看覆盖的内容并了解默认值,这可能会轻松得多。
prefs.js
)import re
import json
PROFILE = "/path/to/firefox/profile"
def read_user_prefs(preffile):
r = re.compile(r"\s*user_pref\(([\"'])(.+?)\1,\s*(.+?)\);")
rv = {}
for l in preffile:
m = r.match(l)
if not m:
continue
k, v = m.group(2), m.group(3)
try:
rv[k] = json.loads(v)
except Exception as ex:
print "failed to parse", k, v, ex
return rv
with open("{}/prefs.js".format(PROFILE), "rb") as p:
prefs = read_user_prefs(p)
for k, v in prefs.items():
print u"({type:<16}) {key}: {value}".format(
key=k, value=v, type=str(type(v)))
print
print "Chrome debugging enabled:",
print prefs.get("devtools.chrome.enabled", False)
print "Last sync:",
print prefs.get("services.sync.tabs.lastSync", 0.0)
print "Pref that might not exist:",
print prefs.get("does.not.exist", "default")
将firefox-addon dumps interesting Preferences写入已知文件,或使用其他形式的IPC(套接字,无论如何)与您的python脚本进行通信。