7

我正在创建一个包含两部分的小应用程序:其中一个显示在 Chrome 浏览器中,另一个是用 Python 编写的本地应用程序。

在 Chrome 中,用户<select>可以选择他/她的首选语言。该信息由 Chrome 存储在 cookie 中。

我想知道是否可以检索该语言首选项(意思是读取 cookie),因此当我运行本地应用程序时,它将以用户已经使用 Chrome 选择的相同语言显示。

不过,我无法更改系统的语言环境(这可能是最有意义的)。那必须保持英文,但如果用户通过 Chrome 选择中文作为首选语言,然后启动本地应用程序,我希望该应用程序能够以中文启动。

我一直在查看 Chrome 的命令行开关,但没有看到任何有用的东西。最多,该--enable-file-cookies选项,然后尝试打开并解析cookie文件......不知何故,但我能找到的所有信息都非常模糊。

先感谢您!

更新。进一步搜索 ( 1 , 2 ) 似乎表明 Chrome 使用 SQL lite 存储 cookie。我正在调查这个。或许还有希望……

4

1 回答 1

8

是的,正如我在对我的问题的评论中提到的,sqlite3 听起来很有希望......当我学会阅读的那一天,我将征服世界!

无论如何,以防万一对其他人有帮助:

#!/usr/bin/env python
import os
import sqlite3
import pwd

_cookieName = "preferredLanguage"

def getPreferredLanguageFromCookieDB():
    retval="en-US"
    cookieDBFilename = os.path.join(pwd.getpwuid(1000).pw_dir, ".config/google-chrome/Default/Cookies")
    if os.path.isfile(cookieDBFilename):
        connection = sqlite3.connect(cookieDBFilename)
        querier = connection.cursor()
        numCookiesMatching = int(querier.execute('SELECT COUNT(*) FROM cookies WHERE (host_key="127.0.0.1" or host_key="localhost") and name="%s"' % (_cookieName)).fetchone()[0])
        if numCookiesMatching == 1:
            retval = querier.execute('SELECT value FROM cookies WHERE (`cookies`.`host_key`="127.0.0.1" or `cookies`.`host_key`="localhost") and `cookies`.`name` = "%s"' % (_cookieName)).fetchone()[0]
        elif numCookiesMatching == 0:
            print("::getPreferredLanguageFromCookieDB > No cookie for '%s' found. Assuming wizard hasn't run yet, which is weird, but not critical" % (_cookieName))
            retval="en-US"
        else:
            raise KeyError("Found %s cookies matching %s in file %s. This shouldn't have happened" % (numCookiesMatching, _cookieName, cookieDBFilename))
            retval=None
    else:
        print("::getPreferredLanguageFromCookieDB > Cookie 'db' (actually, file) %s doesn't exist" % (cookieDBFilename))
        retval="en-US"

    return retval


if __name__ == "__main__":
    print "Prefered language: %s" % getPreferredLanguageFromCookieDB()

这个小片段将连接到 Cookies“数据库”(实际上只是文件,但无论如何......)并读取由或preferredLanguage发出的“” cookie的值。如果localhost 发出多个 " " cookie,它将崩溃。localhost127.0.0.1preferredLanguage

于 2012-04-12T17:38:56.723 回答