Skip to content

Instantly share code, notes, and snippets.

@st3rven
Last active February 14, 2024 18:17
Show Gist options
  • Save st3rven/de22dc2dabf6bd69537d0277e4dc5977 to your computer and use it in GitHub Desktop.
Save st3rven/de22dc2dabf6bd69537d0277e4dc5977 to your computer and use it in GitHub Desktop.
Script that allows you to query for urls in 'History' file of the Chrome browser
import os
import shutil
import sqlite3
import sys
from datetime import datetime, timedelta
import argparse
import warnings
parser = argparse.ArgumentParser(description="This script allows you to query for urls in a 'History' file of the Chrome browser",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("-d", "--delta", default=7, type=int, help="Delta of days for the search")
parser.add_argument("-u", "--url", default="", help="Query for the url field")
parser.add_argument("-t", "--title", default="", help="Query for the title field; By defualt this values is empty to avoid filtering")
parser.add_argument("file", help="Path to the history file")
args = vars(parser.parse_args())
"""
Params:
query_title : str. title to query. Set "'%.%'" for empty. ex. "'%queryword%'"
query_url : str. url to query. Set "'%.%'" for empty
dt_to : datetime. to ex. datetime(2022, 1, 1, 0, 0)
dt_from : datetime. from
tz : int. timezone (UTC=0)
history_file_original : str. full/path/chromehistory/in_your_PC
history_file_tmp : str. filename of chromehistory snapshot
"""
days = args["delta"]
query_url = args["url"]
query_title = args["title"]
history_file_original = args["file"]
history_file_tmp = "chrome-history-snapshot"
query_url = f"'%{query_url}%'"
query_title = f"'%{query_title}%'"
dt_to = datetime.now()
# define the delta time for the query
dt_from = datetime.now() - timedelta(days)
tz = 9
def dt2str(dt):
return dt.strftime("%Y-%m-%d %H:%M:%S")
def date_from_webkit(webkit_timestamp, tz):
"""Convert webkit(utc) to local datetime"""
epoch_start = datetime(1601, 1, 1)
delta = timedelta(hours=tz, microseconds=int(webkit_timestamp))
return epoch_start + delta
def date_to_webkit(dt, tz):
"""Convert local datetime to webkit(utc)"""
epoch_start = datetime(1601, 1, 1)
delta = dt - epoch_start - timedelta(hours=tz)
delta_micro_sec = (delta.days * 60 * 60 * 24 + delta.seconds) * 1000 * 1000
return delta_micro_sec
def time_range_set(dt_from, dt_to, tz):
time_to = date_to_webkit(dt_to, tz)
time_from = date_to_webkit(dt_from, tz)
return time_from, time_to
def sql_query(time_from, time_to, title, url):
# Copy history file if updated
try:
if os.stat(history_file_original).st_mtime - os.stat(history_file_tmp).st_mtime > 1:
shutil.copy2(history_file_original, history_file_tmp)
except FileNotFoundError:
shutil.copy2(history_file_original, history_file_tmp)
conn = sqlite3.connect(history_file_tmp)
c = conn.cursor()
sql_string = f"""SELECT * FROM urls
WHERE {time_from} < last_visit_time
AND last_visit_time < {time_to}
AND title like {title}
AND url like {url}
ORDER BY last_visit_time DESC;"""
c.execute(sql_string)
fetch_result = c.fetchall()
return fetch_result
if __name__ == "__main__":
print(f" *** Query Chrome History *** ")
print(f" [*] From: {dt2str(dt_from)}, To: {dt2str(dt_to)}")
print(f" [*] Title: {query_title}")
print(f" [*] Url: {query_url}\n")
time_from, time_to = time_range_set(dt_from, dt_to, tz)
fetch_result = sql_query(time_from, time_to, query_title, query_url)
print(f"{len(fetch_result)} results...")
for i in fetch_result:
time = i[5]
url = i[1]
title = i[2]
dt = date_from_webkit(time, tz)
time_str = dt2str(dt)
# Formatting
max_len = 72
if len(title) > max_len:
title = title[:max_len] + "..."
print(time_str, title, url)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment