firefoxで表示したウェブページの履歴はプロファイルのplaces.sqliteに保存されている。しかし、デフォルト設定では180日前以上の履歴は消去される。おそらくパフォーマンス上の理由かプライバシー上の理由なんだろう。

しかし、表示ページの履歴は過去の自分の興味関心を表す、言わば日記のようなデータなので出来れば残して起きたい。昔によく見ていたウェブサイトとかわかったら懐かしくて面白そうだ。places.sqliteは単なるsqliteデータベースファイルなので簡単にデータをエクスポートできる。以下のpythonスクリプトは履歴(タイトル、URL、タイムスタンプ、description)をCSVとして表示するサンプル。

#!/usr/bin/env python3

import sqlite3
from pathlib import Path
from io import StringIO
import csv
import argparse

def get_profile_history(profile_dir, min_time):
    profile = Path(profile_dir)
    db = profile / 'places.sqlite'
    connection = sqlite3.connect(db)
    connection.row_factory = sqlite3.Row

    cur = connection.cursor()

    query = """
    SELECT
        moz_historyvisits.visit_date AS visit_date,
        moz_places.url AS url,
        moz_places.title AS title,
        moz_places.description AS description
    FROM
        'moz_historyvisits'
        LEFT OUTER JOIN
            moz_places
        ON  moz_historyvisits.place_id = moz_places.id
    WHERE
        visit_date > ?
"""
    
    cur.execute(query, (min_time,))
    return cur


def row2csv(d):
    fieldnames = ('title', 'url', 'description', 'visit_date')
    with StringIO(newline='') as s:
        writer = csv.DictWriter(s, fieldnames=fieldnames)
        writer.writeheader()
        for h in d:
            writer.writerow(dict(h))

        return s.getvalue()


def get_args():
    parser = argparse.ArgumentParser()
    parser.add_argument('profile_dir', help='path to firefox profile')
    parser.add_argument('min_time', help='min microsec timestamp', default=0)

    return parser.parse_args()


if __name__ == '__main__':
    args = vars(get_args())
    history = get_profile_history(**args)
    print(row2csv(history))

数年後とかに、「ああ、このサイトよく見てたなぁ」とか思いたい。