Last active
February 14, 2024 18:17
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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