2012-04-12 11 views
7

Tworzę małą aplikację, która składa się z dwóch części: jedna z nich jest wyświetlana w przeglądarce Chrome, a druga to lokalna aplikacja zaprogramowana w języku Python.Ubuntu Chrome: Jak odczytać plik cookie ze skryptu pythonowego

W przeglądarce Chrome użytkownik ma <select>, aby wybrać preferowany język. Informacje te są przechowywane przez Chrome w pliku cookie.

Chciałbym wiedzieć, czy można odzyskać tę preferencję językową (czyli czytając plik cookie), więc gdy uruchomię aplikację lokalną, będzie ona wyświetlana w tym samym języku, co użytkownik wybrany w Chrome.

Nie mogę zmienić ustawień regionalnych systemu (co prawdopodobnie miałoby największy sens). To musi pozostać w języku angielskim, ale jeśli użytkownik wybierze chiński jako preferowany język przez Chrome, a następnie uruchomi lokalną aplikację, chciałbym, aby ta aplikacja mogła zacząć się w chińskim.

Oglądałem w przeglądarce Chrome command line switches, ale nie widziałem niczego zbyt pomocnego. Co najwyżej opcji --enable-file-cookies, a następnie spróbuj otworzyć i parsować plik cookie ... jakoś, ale wszystkie informacje, które udało mi się znaleźć, są dość niejasne.

Z góry dziękuję!

Aktualizacja. Dalsze wyszukiwanie (1, 2) wydaje się wskazywać, że Chrome przechowuje pliki cookie za pomocą SQL Lite. Patrzę na to. Może jest nadzieja z tym ...

+0

są zarówno klientem Pythona, jak i witryną rozmawiającą z serwerem? jeśli tak, możesz po prostu zapisać tam preferencje językowe (wysłane przez przeglądarkę) i pobrać informacje z klienta Pythona ... – Hoff

+0

@Hoff -> Myślałem o tym również. Klient Pythona nie rozmawia dokładnie z serwerem, ale serwer działa w localhost, więc (z przyczyn praktycznych) odpowiedź brzmi "tak". Mogę mieć serwer przechowujący preferencje językowe. Zachowam to jako ostatni zasób ... Ciekawi mnie również zarządzanie plikami cookie w Chrome i ... Jeśli mam już preferowany język zapisany na twardym dysku (w cookie) przez Chrome, i mogę uniknąć ponownego przechowywania go za pomocą serwera, byłoby świetnie. Dzięki za pomysł, chociaż *:) * – BorrajaX

+0

Polecenie sqlite3 ~/.config/google-chrome/Default/Cookies wydaje się być obiecujące ... Będzie wysyłane :) – BorrajaX

Odpowiedz

8

Tak, jak wspomniałem w komentarzach do mojego pytania, sqlite3 brzmiało obiecująco ... W dniu, w którym uczę się czytać, podbiję świat !!

Zresztą, tak na wszelki wypadek jest pomocne dla kogoś innego:

#!/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() 

Ten mały fragment połączy się z bazą danych „Cookies” (w rzeczywistości tylko plik, ale i tak ...) i odczytać wartość "preferredLanguage" cookie wydane przez localhost lub 127.0.0.1. Nastąpi awaria, jeśli istnieje więcej niż jeden plik cookie "preferredLanguage" wydany przez localhost.

Powiązane problemy