7

2 つの部分を持つ小さなアプリケーションを作成しています。1 つは Chrome ブラウザー内に表示され、もう 1 つは Python でプログラムされたローカル アプリケーションです。

Chrome では、ユーザーは<select>好みの言語を選択できます。その情報は Chrome によって Cookie に保存されます。

その言語設定を取得する (つまり、Cookie を読み取る) ことができるかどうかを知りたいので、ローカル アプリケーションを実行すると、ユーザーが既に Chrome で選択したのと同じ言語で表示されます。

ただし、システムのロケールを変更することはできません (これがおそらく最も理にかなっています)。これは英語のままにしておく必要がありますが、ユーザーがChrome で優先言語として中国語を選択し、ローカル アプリケーションを起動した場合、そのアプリケーションを中国語で起動できるようにしたいと考えています。

Chrome のコマンド ライン スイッチを見てきましたが、あまり役立つものは見当たりませんでした。せいぜい、--enable-file-cookiesオプションで、Cookie ファイルを開いて解析しようとします...どういうわけか、しかし、私が見つけたすべての情報はかなりあいまいです。

前もって感謝します!

アップデート。さらに検索 ( 12 ) すると、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()

この小さなスニペットは、Cookie の「データベース」 (実際には単なるファイルですが...) に接続し、またはpreferredLanguageによって発行された " " Cookieの値を読み取ります。localhost によって発行された" " Cookie が複数ある場合、クラッシュします。localhost127.0.0.1preferredLanguage

于 2012-04-12T17:38:56.723 に答える