2012-04-12 15 views
7

Sto creando una piccola applicazione che ha due parti: una di queste viene visualizzata all'interno di un browser Chrome e l'altra è un'applicazione locale programmata in Python.Ubuntu Chrome: Come leggere un cookie da uno script Python

In Chrome, l'utente ha un <select> per scegliere la lingua preferita. Queste informazioni sono memorizzate da Chrome in un cookie.

Vorrei sapere se è possibile recuperare tale preferenza di lingua (ovvero, leggere il cookie) così quando eseguirò l'applicazione locale, verrà visualizzato nella stessa lingua dell'utente già selezionato con Chrome.

Non riesco a modificare le impostazioni locali del sistema (che è ciò che probabilmente avrebbe più senso). Deve rimanere in inglese, ma se l'utente seleziona cinese come lingua preferita tramite Chrome e quindi avvia l'applicazione locale, vorrei che quell'applicazione fosse in grado di avviarsi in cinese.

Ho guardato il command line switches per Chrome, ma non ho visto nulla di troppo utile. Al massimo, l'opzione --enable-file-cookies, e quindi tenta di aprire e analizzare il file cookie ... in qualche modo, ma tutte le informazioni che sono riuscito a trovare sono piuttosto vaghe.

Grazie in anticipo!

Aggiornamento

. Un'ulteriore ricerca (1, 2) sembra indicare che Chrome memorizza i cookie utilizzando SQL lite. Sto esaminando questo. Forse c'è speranza con questo ...

+0

sono sia il client python che il sito Web che parlano con un server? in tal caso, potresti semplicemente memorizzare la preferenza della lingua lì (inviata dal browser) e recuperare le informazioni dal client python ... – Hoff

+0

@Hoff -> Ci ho pensato anche io. Il client python non sta parlando esattamente con il server, ma il server è in esecuzione in localhost quindi (per scopi pratici) la risposta è "sì". Potrei avere il server che memorizza le preferenze della lingua. Lo terrò come ultima risorsa ... È anche che sono curioso della gestione dei cookie in Chrome e bene ... Se ho già la lingua preferita memorizzata nel disco rigido (nel cookie) da Chrome, e posso evitare di ri-memorizzarlo usando il server, sarebbe fantastico. Grazie per l'idea, però *:) * – BorrajaX

+0

Il comando sqlite3 ~/.config/google-chrome/Default/Cookies sembra promettente ... Continuerò a postare :) – BorrajaX

risposta

8

Sì, come ho detto nei commenti alla mia domanda, sqlite3 sembrava promettente ... Il giorno in cui imparo a leggere, conquisterò il mondo !!

Ad ogni modo, nel caso in cui è utile per qualcun altro:

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

questo piccolo frammento si connetterà al "database" Cookies (in realtà è solo file, ma, in ogni caso ...) e leggere il valore di il cookie "preferredLanguage" rilasciato da localhost o 127.0.0.1. Si arresterà in modo anomalo se è presente più di un cookie "preferredLanguage" emesso da localhost.

Problemi correlati