2010-01-26 30 views
10

Trabajar en un script para recopilar el historial del navegador de los usuarios con marcas de tiempo (configuración educativa). Firefox 3 la historia se mantiene en un archivo de SQLite y sellos son en el tiempo UNIX época ... para que hagan y convertir a formato legible por medio de un comando SQL en Python es bastante sencillo:Convertir campos de fecha y hora en el archivo de historial de Chrome (sqlite) al formato legible

sql_select = """ SELECT datetime(moz_historyvisits.visit_date/1000000,'unixepoch','localtime'), 
         moz_places.url 
       FROM moz_places, moz_historyvisits 
       WHERE moz_places.id = moz_historyvisits.place_id 
      """ 
get_hist = list(cursor.execute (sql_select)) 

Chrome almacena también en la historia un archivo sqlite ... pero su historial de tiempo está aparentemente formateado como el número de microsegundos desde la medianoche UTC del 1 de enero de 1601 ....

¿Cómo se puede convertir esta marca de tiempo en un formato legible como en el ejemplo de Firefox? 2010-01-23 11:22:09)? Estoy escribiendo el guión con 2.5.x pitón (la versión de OS X 10.5), y la importación de módulo del sqlite3 ....

+0

para que quede claro, ¿quiere simplemente convertir un campo datetime devuelto del conjunto de registros en una cadena legible? –

+0

Eso es correcto ... ese bit en el ejemplo de Firefox me devuelve un sello como: 2010-01-23 11:22:09 ... Buscando hacer lo mismo con los registros de historial de Chrome ... – cit

Respuesta

1

esto puede no ser el código más Pythonic en el mundo, pero aquí es una solución: Cheated mediante el ajuste de zona horaria (EST aquí) al hacer esto:

utctime = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds = ms, hours =-5) 

Aquí está la función: se supone que el archivo historial de Chrome ha sido copiado de otra cuenta en/Usuarios/someuser/Documentos/tmp/cromo/historia

def getcr(): 
    connection = sqlite3.connect('/Users/someuser/Documents/tmp/Chrome/History') 
    cursor = connection.cursor() 
    get_time = list(cursor.execute("""SELECT last_visit_time FROM urls""")) 
    get_url = list(cursor.execute("""SELECT url from urls""")) 
    stripped_time = [] 
    crf = open ('/Users/someuser/Documents/tmp/cr/cr_hist.txt','w') 
    itr = iter(get_time) 
    itr2 = iter(get_url) 

    while True: 
     try: 
      newdate = str(itr.next()) 
      stripped1 = newdate.strip('(),L') 
      ms = int(stripped1) 
      utctime = datetime.datetime(1601,1,1) + datetime.timedelta(microseconds = ms, hours =-5) 
      stripped_time.append(str(utctime)) 
      newurl = str(itr2.next()) 
      stripped_url = newurl.strip('()') 
      stripped_time.append(str(stripped_url)) 
      crf.write('\n') 
      crf.write(str(utctime)) 
      crf.write('\n') 
      crf.write(str(newurl)) 
      crf.write('\n') 
      crf.write('\n') 
      crf.write('********* Next Entry *********') 
      crf.write('\n') 
     except StopIteration: 
      break 

    crf.close()    

    shutil.copy('/Users/someuser/Documents/tmp/cr/cr_hist.txt' , '/Users/parent/Documents/Chrome_History_Logs') 
    os.rename('/Users/someuser/Documents/Chrome_History_Logs/cr_hist.txt','/Users/someuser/Documents/Chrome_History_Logs/%s.txt' % formatdate) 
1

El módulo sqlite vuelve datetime objetos para los campos de fecha y hora, que tienen un método de formato para imprimir cadenas legibles llamado strftime.

Puede hacer algo como esto una vez que tenga el conjunto de registros:

for record in get_hist: 
    date_string = record[0].strftime("%Y-%m-%d %H:%M:%S") 
    url = record[1] 
+0

Supongo que soy buscando la salida del hombre perezoso, esperando simplemente reemplazar el bit 'unixepoch' en el código para Firefox, así que funcionará con Chrome ... Si Chrome usara unixepoch estaría todo listo y podría reutilizar la línea (primero cambiando las cosas de moz a las tablas de Chrome) ... Estoy atascado en cómo convertir ese formato de hora (también lo he visto referido como formato de hora 'WebKit') ... – cit

+1

Así que escriba una función para convertir el fecha. Entonces puedes hacer 'date = get_webkit_date (record [0])'. Esa * es * la salida del hombre perezoso. – jcdyer

+0

También hay un tiempo de respuesta si quieres ir hacia el otro lado (objeto cadena a fecha y hora).Consulte [documentos de fecha y hora de python] (http://docs.python.org/library/datetime.html) para obtener más detalles sobre cómo hacerlo. – jcdyer

4

Esta es una forma más Pythonic y la memoria de usar para hacer lo que usted ha descrito (por cierto, gracias por el código inicial!):

#!/usr/bin/env python 

import os 
import datetime 
import sqlite3 
import opster 
from itertools import izip 

SQL_TIME = 'SELECT time FROM info' 
SQL_URL = 'SELECT c0url FROM pages_content' 

def date_from_webkit(webkit_timestamp): 
    epoch_start = datetime.datetime(1601,1,1) 
    delta = datetime.timedelta(microseconds=int(webkit_timestamp)) 
    return epoch_start + delta 

@opster.command() 
def import_history(*paths): 
    for path in paths: 
     assert os.path.exists(path) 
     c = sqlite3.connect(path) 
     times = (row[0] for row in c.execute(SQL_TIME)) 
     urls = (row[0] for row in c.execute(SQL_URL)) 
     for timestamp, url in izip(times, urls): 
      date_time = date_from_webkit(timestamp) 
      print date_time, url 
     c.close() 

if __name__=='__main__': 
    opster.dispatch() 

La secuencia de comandos se puede utilizar de esta manera:

$ ./chrome-tools.py import-history ~/.config/chromium/Default/History* > history.txt 

de Opster curso puede ser expulsado, pero parece útil para mí :-)

+0

P.S .: Ahora recomendaría Argh en lugar de Opster. –

+0

Impresionante - gracias por el ahorro de tiempo: o) He aquí un script de Python actualizado, basado en el suyo, que funciona con Chrome/Chromium versión 38. Solo he probado esto en MacOS, pero debería funcionar en Linux y Windows como bien. https://gist.github.com/boris-chervenkov/84b7c3f06bb94c106ba8 –

14

Prueba esto:

sql_select = """ SELECT datetime(last_visit_time/1000000-11644473600,'unixepoch','localtime'), 
         url 
       FROM urls 
       ORDER BY last_visit_time DESC 
      """ 
get_hist = list(cursor.execute (sql_select)) 

O algo por el estilo

parece funcionar para mí.

+0

¿Por qué '11644473600'? Está funcionando, pero ¿qué significa el número grande? – polym

+0

Ok, he encontrado lo que significa el número. Es el "número de segundos entre el 1 de enero de 1970 y el 1 de enero de 1601", según este sitio: http://timothycomeau.info/chrome-history/ – polym

Cuestiones relacionadas