2019-02-12 · Develop

Chrome 历史记录获取

Chrome 浏览器将内部数据(如浏览器历史记录)存储在 SQLite 数据库中。
Google Chrome仅将最近3个月存储在 History(历史记录) 文件中,其余部分位于 Archived History(存档历史记录)文件中。

历史记录文件位置

WindowsVista或更高版本:

C:\Users\%USERNAME%\AppData\Local\Google\Chrome\User Data\Default\History

WindowsXP:

C:\Documents and Settings\%USERNAME%\Application Support\Google\Chrome\Default\History

MacOSX:

~/Library/Application Support/Google/Chrome/History

Linux:

~/.config/google-chrome/Default/History

表结构

使用数据库工具读取之后,可以看到如下的表

chrome-history-table

history-table-diagrams

时间处理

由于 Chrome 浏览器在 SQLite 中存储的时间是以 1601-01-01 00:00:00 为起点的时间间隔的微妙数, 和 Uniux 的时间戳存在一个间隔时间。 因此需要对时间进行一些处理

SELECT datetime(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') AS last_visit_time FROM urls ORDER BY last_visit_time DESC

Java 连接 SQLite

首先添加 SQLite 的驱动包

<dependency>
    <groupId>org.xerial</groupId>
    <artifactId>sqlite-jdbc</artifactId>
    <version>3.25.2</version>
    <scope>runtime</scope>
</dependency>
public class Application {

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        // language=SQL
        String sql =
                "SELECT \n" +
                "  url, title, \n" +
                "  datetime(last_visit_time / 1000000 + (strftime('%s', '1601-01-01')), 'unixepoch', 'localtime') AS last_visit_time \n" +
                "FROM urls \n" +
                "ORDER BY last_visit_time DESC";
        Class.forName("org.sqlite.JDBC");
        Connection conn = DriverManager.getConnection("jdbc:sqlite:C:\\Users\\Administrator\\Desktop\\History");
        Statement st = conn.createStatement();
        st.execute(sql);
        ResultSet rs = st.getResultSet();
        while (rs.next()) {
            System.out.println(
                    String.format("[%s]->(%s):{%s}",
                            rs.getString("url"),
                            rs.getString("title"),
                            rs.getString("last_visit_time")
                            )
            );
        }
        rs.close();
        st.close();
        conn.close();
    }
}

就可以看见如下的输出了

[https://www.smwenku.com/a/5c03d980bd9eee728baab5ca]->(記一次異常排查過程:druid連接池拋出DataSourceDisableException 原 - 神馬文庫):{2019-01-28 22:01:00}
[https://www.liangzl.com/get-article-detail-14466.html]->(关于druid连接池DataSourceDisableException异常丶一个站在Java后端设计之路的男青年个人博客网站):{2019-01-28 21:59:35}
[https://blog.csdn.net/m0_37995707/article/details/77776070]->(使用线程池插入数据报Could not open JDBC Connection for transaction 异常 - 等待未果 ~~ - CSDN博客):{2019-01-28 21:59:22}
[https://www.cnblogs.com/duanxz/p/5003013.html]->(使用druid连接池的超时回收机制排查连接泄露问题 - duanxz - 博客园):{2019-01-28 21:59:12}
[https://my.oschina.net/haogrgr/blog/224010]->(Druid连接池一个设置引发的血案 - 不经年,知不足 - 开源中国):{2019-01-28 21:58:34}