Преобразование полей даты и времени в хронологическом файле Chrome (sqlite) в читаемый формат
Работа с script для сбора истории браузера пользователей с отметками времени (образовательная установка).
История 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)? Я пишу script с python 2.5.x(версия на OS X 10.5) и импортирую модуль sqlite3....
Ответы
Ответ 1
Это может быть не самый питоновский код в мире, но здесь решение: обмануто, настраивая для часового пояса (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)
Ответ 2
Попробуйте следующее:
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))
Или что-то вдоль этих строк
похоже, работает для меня.
Ответ 3
Это более питонический и удобный для памяти способ сделать то, что вы описали (кстати, спасибо за исходный код!):
#!/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()
script может использоваться следующим образом:
$ ./chrome-tools.py import-history ~/.config/chromium/Default/History* > history.txt
Конечно, Opster можно выбросить, но мне кажется удобным: -)
Ответ 4
Модуль sqlite
возвращает datetime
объекты для полей datetime, которые имеют метод форматирования для печати читаемых строк, называемых strftime
.
Вы можете сделать что-то подобное, если у вас есть набор записей:
for record in get_hist:
date_string = record[0].strftime("%Y-%m-%d %H:%M:%S")
url = record[1]