2012-04-12 15 views
7

Estoy creando una pequeña aplicación que tiene dos partes: una de ellas se muestra dentro de un navegador Chrome y la otra es una aplicación local programada en Python.Ubuntu Chrome: Cómo leer una cookie de una secuencia de comandos python

En Chrome, el usuario tiene un <select> para elegir su idioma preferido. Esa información es almacenada por Chrome en una cookie.

Me gustaría saber si es posible recuperar esa preferencia de idioma (es decir, leer la cookie) para que cuando ejecute la aplicación local, se muestre en el mismo idioma que el usuario ya seleccionó con Chrome.

No puedo cambiar la configuración regional del sistema, sin embargo (que es lo que probablemente tenga más sentido). Eso tiene que permanecer en inglés, pero si el usuario selecciona chino como idioma preferido a través de Chrome, y luego inicia la aplicación local, me gustaría que esa aplicación pueda iniciarse en chino.

He estado mirando el command line switches para Chrome, pero no he visto nada demasiado útil. A lo sumo, la opción --enable-file-cookies, y luego intenta abrir y analizar el archivo de cookies ... de alguna manera, pero toda la información que he podido encontrar es bastante vaga.

¡Gracias de antemano!

Actualización. La búsqueda adicional (1, 2) parece indicar que Chrome almacena las cookies utilizando SQL lite. Estoy investigando esto. Tal vez hay esperanza con eso ...

+0

¿son ambos el cliente python y el sitio web que habla con un servidor? si es así, simplemente podría almacenar las preferencias de idioma allí (enviadas por el navegador) y recuperar la información del cliente de Python ... – Hoff

+0

@Hoff -> Pensé en eso también. El cliente de Python no está hablando exactamente con el servidor, pero el servidor se está ejecutando en el servidor local por lo que (para fines prácticos) la respuesta es "sí". Podría hacer que el servidor guardara las preferencias de idioma. Lo mantendré como último recurso ... También es que tengo curiosidad sobre la administración de cookies en Chrome y bueno ... si ya tengo el idioma preferido almacenado en el disco duro (en la cookie) por Chrome, y puedo evitar volver a almacenarlo usando el servidor, sería genial. Gracias por la idea, aunque *:) * – BorrajaX

+0

El comando sqlite3 ~/.config/google-chrome/Default/Cookies parece prometedor ... Seguirá publicando :) – BorrajaX

Respuesta

8

Sí, como mencioné en los comentarios a mi pregunta, sqlite3 sonaba prometedor ... ¡¡¡El día que aprenda a leer, conquistaré el mundo !!

De todos modos, por si acaso es útil para otra persona:

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

Este pequeño fragmento se conectará a la cookies "base de datos" (en realidad es solo archivo, pero, de todos modos ...) y lea el valor de la cookie "preferredLanguage" emitida por localhost o 127.0.0.1. Se bloqueará si hay más de una cookie "preferredLanguage" emitida por localhost.

Cuestiones relacionadas