如何使用Python阅读firefox的about:config条目?

时间:2014-07-03 08:09:00

标签: firefox python-3.x

如何使用Python阅读firefox版本30.0的about:config条目?我尝试使用这个answer指向的内容(在JavaScript中),但它没有帮助。

1 个答案:

答案 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"true12 * 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")

替代

dumps interesting Preferences写入已知文件,或使用其他形式的IPC(套接字,无论如何)与您的python脚本进行通信。