我正在创建一个包含两个部分的小应用程序:其中一个显示在Chrome浏览器中,另一个是用Python编程的本地应用程序。
在Chrome中,用户有一个<select>
来选择他/她的首选语言。该信息由Chrome存储在Cookie中。
我想知道是否可以检索该语言首选项(意思是,读取cookie),因此当我运行本地应用程序时,它将显示在用户已使用Chrome选择的同一种语言上。
我无法改变系统的语言环境(这可能是最有意义的)。这必须保留英文,但如果用户通过Chrome选择中文作为首选语言,然后启动本地应用程序,我希望该应用程序能够以中文启动
我一直在关注Chrome的command line switches,但我没有看到任何有用的内容。最多是--enable-file-cookies
选项,然后尝试打开并解析cookie文件......不知何故,但我能找到的所有信息都非常模糊。
提前谢谢!
更新。进一步搜索(1,2)似乎表明Chrome使用SQL lite存储Cookie。我正在调查这个。也许有希望......
答案 0 :(得分: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
或{发出的“localhost
”cookie的值{1}}。如果localhost发布了多个“127.0.0.1
”cookie,它将崩溃。