Преобразуйте поля даты и времени в файле истории Chrome (sqlite) в читаемый формат - PullRequest
10 голосов
/ 26 января 2010

Работа над сценарием для сбора истории браузера пользователей с отметками времени (образовательная настройка). История Firefox 3 хранится в файле sqlite, а штампы находятся в эпоху UNIX ... получить их и преобразовать в читаемый формат с помощью команды SQL в python довольно просто:

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 также сохраняет историю в файле sqlite ... но его метка времени в истории, по-видимому, отформатирована как число микросекунд с полуночи UTC 1 января 1601 года ...

Как эту метку времени можно преобразовать в читаемый формат, как в примере с Firefox (например, 2010-01-23 11:22:09) ? Я пишу сценарий с python 2.5.x (версия для OS X 10.5) и импортирую модуль sqlite3 ....

Ответы [ 4 ]

14 голосов
/ 06 ноября 2010

Попробуйте это:

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))

Или что-то в этом роде

, кажется, работает на меня.

4 голосов
/ 04 июля 2010

Это более питонный и удобный для памяти способ сделать то, что вы описали (кстати, спасибо за исходный код!):

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

Сценарий можно использовать так:

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

Конечно Opster можно выбросить, но мне это кажется удобным: -)

1 голос
/ 04 марта 2010

Возможно, это не самый Pythonic-код в мире, но вот решение: обмануть, настроив часовой пояс (EST здесь), выполнив следующее:

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

Вот функция: предполагается, что файл истории Chrome был скопирован из другой учетной записи в / Users / someuser / Documents / tmp / Chrome / History

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 голос
/ 26 января 2010

Модуль sqlite возвращает datetime объекты для полей даты и времени, которые имеют метод формата для печати читаемых строк, называемый strftime.

Вы можете сделать что-то подобное, если у вас есть набор записей:

for record in get_hist:
  date_string = record[0].strftime("%Y-%m-%d %H:%M:%S")
  url = record[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...