2010-04-01 10 views
24

Desidero scrivere un programma semplice che mostri la mia attività su Internet per un periodo di tempo (quale sito ho visitato, quante volte e così via). Principalmente uso il browser Google Chrome. Ho scoperto che Chrome memorizza la cronologia del browser in questo percorso: C: \ Documents and Settings \\ Impostazioni locali \ Dati applicazioni \ Google \ Chrome \ Dati utente \ Predefinito (correggimi se ho torto). Come posso aprire i file di cronologia? Non hanno alcuna estensione di file. Non potevo aprire usando il blocco note, il browser SQLite. Come posso accedere a questi dati a livello di programmazione? Voglio sapere quale formato di file è e come leggerlo usando un linguaggio di programmazione come C#.Come accedere alla cronologia del browser Google Chrome a livello di programmazione sul computer locale

risposta

14

È solo un database SQlite 3, sono riuscito ad aprirlo correttamente (anche se ovviamente non è possibile aprire un database bloccato di un browser in esecuzione).

+0

Cosa hai usato per aprirlo con successo? – Arjang

+0

@Arjang Un client sqlite3, ovviamente – wRAR

+0

Grazie per la risposta – Arjang

0

So che Safari utilizza Binary PLists per la sua cronologia (e SQLite per la sua cache). È possibile che Chrome stia facendo lo stesso?

5

Per la visualizzazione di database SQLite (che è l'indice della cronologia di Chromium), ho preferito sqlitebrowser. È gratuito e funziona su Windows, Mac e Linux. Un favoloso di tutti i tempi per me.

7

Ecco una classe che ho creato per leggere i dati di navigazione da Google Chrome. La maggior parte del codice che ho ricevuto da here ma l'ho ottimizzato per aggiungere il supporto per Google Chrome. Probabilmente vorrai anche scaricare SQLite per .Net da here e aggiungere i riferimenti a System.Data.Sqlite.

class GoogleChrome 
{ 
    public List<URL> URLs = new List<URL>(); 
    public IEnumerable<URL> GetHistory() 
    { 
     // Get Current Users App Data 
     string documentsFolder = Environment.GetFolderPath 
     (Environment.SpecialFolder.ApplicationData); 
     string[] tempstr = documentsFolder.Split('\\'); 
     string tempstr1 = ""; 
     documentsFolder += "\\Google\\Chrome\\User Data\\Default"; 
     if (tempstr[tempstr.Length - 1] != "Local") 
     { 
      for (int i = 0; i < tempstr.Length - 1; i++) 
      { 
       tempstr1 += tempstr[i] + "\\"; 
      } 
      documentsFolder = tempstr1 + "Local\\Google\\Chrome\\User Data\\Default"; 
     } 


     // Check if directory exists 
     if (Directory.Exists(documentsFolder)) 
     { 
      return ExtractUserHistory(documentsFolder); 

     } 
     return null; 
    } 


    IEnumerable<URL> ExtractUserHistory(string folder) 
    { 
     // Get User history info 
     DataTable historyDT = ExtractFromTable("urls", folder); 

     // Get visit Time/Data info 
     DataTable visitsDT = ExtractFromTable("visits", 
     folder); 

     // Loop each history entry 
     foreach (DataRow row in historyDT.Rows) 
     { 

       // Obtain URL and Title strings 
       string url = row["url"].ToString(); 
       string title = row["title"].ToString(); 

       // Create new Entry 
       URL u = new URL(url.Replace('\'', ' '), 
       title.Replace('\'', ' '), 
       "Google Chrome"); 

       // Add entry to list 
       URLs.Add(u); 
     } 
     // Clear URL History 
     DeleteFromTable("urls", folder); 
     DeleteFromTable("visits", folder); 

     return URLs; 
    } 
    void DeleteFromTable(string table, string folder) 
    { 
     SQLiteConnection sql_con; 
     SQLiteCommand sql_cmd; 

     // FireFox database file 
     string dbPath = folder + "\\History"; 

     // If file exists 
     if (File.Exists(dbPath)) 
     { 
      // Data connection 
      sql_con = new SQLiteConnection("Data Source=" + dbPath + 
      ";Version=3;New=False;Compress=True;"); 

      // Open the Conn 
      sql_con.Open(); 

      // Delete Query 
      string CommandText = "delete from " + table; 

      // Create command 
      sql_cmd = new SQLiteCommand(CommandText, sql_con); 

      sql_cmd.ExecuteNonQuery(); 

      // Clean up 
      sql_con.Close(); 
     } 
    } 

    DataTable ExtractFromTable(string table, string folder) 
    { 
     SQLiteConnection sql_con; 
     SQLiteCommand sql_cmd; 
     SQLiteDataAdapter DB; 
     DataTable DT = new DataTable(); 

     // FireFox database file 
     string dbPath = folder + "\\History"; 

     // If file exists 
     if (File.Exists(dbPath)) 
     { 
      // Data connection 
      sql_con = new SQLiteConnection("Data Source=" + dbPath + 
      ";Version=3;New=False;Compress=True;"); 

      // Open the Connection 
      sql_con.Open(); 
      sql_cmd = sql_con.CreateCommand(); 

      // Select Query 
      string CommandText = "select * from " + table; 

      // Populate Data Table 
      DB = new SQLiteDataAdapter(CommandText, sql_con); 
      DB.Fill(DT); 

      // Clean up 
      sql_con.Close(); 
     } 
     return DT; 
    } 
} 

La classe per l'URL:

class URL 
{ 
    string url; 
    string title; 
    string browser; 
    public URL(string url, string title, string browser) 
    { 
     this.url = url; 
     this.title = title; 
     this.browser = browser; 
    } 

    public string getData() 
    { 
     return browser + " - " + title + " - " + url; 
    } 
} 

ha funzionato come un fascino per me. Spero che aiuti

2

Poiché il poster originale ha chiesto un programma semplice, eccolo. Il programma è stato adattato dal sito web di java workspace (come accreditato nel codice). Sarà necessario modificare l'argomento per getConnection() in modo che punti dove risiedono i file di cronologia sul computer. Il programma viene compilato e gira su mio ambiente Linux 2.6.39:

/** 
Adapted from http://www.javaworkspace.com/connectdatabase/connectSQLite.do 
Date: 09/25/2012 

Download sqlite-jdbc-<>.jar from http://www.xerial.org/trac/Xerial/wiki/SQLiteJDBC, and 
compile: javac GetChromiumHistory.java 
run:  java -classpath ".:sqlite-jdbc-3.7.2.jar" GetChromiumHistory 
*/ 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

/** 
* @author www.javaworkspace.com 
* 
*/ 
public class GetChromiumHistory 
{ 
    public static void main (String[] args) 
    { 

    Connection connection = null; 
    ResultSet resultSet = null; 
    Statement statement = null; 

    try 
     { 
     Class.forName ("org.sqlite.JDBC"); 
     connection = DriverManager 
      .getConnection ("jdbc:sqlite:/home/username/.config/chromium/Default/History"); 
     statement = connection.createStatement(); 
     resultSet = statement 
      .executeQuery ("SELECT * FROM urls where visit_count > 100"); 

     while (resultSet.next()) 
      { 
      System.out.println ("URL [" + resultSet.getString ("url") + "]" + 
         ", visit count [" + resultSet.getString ("visit_count") + "]"); 
      } 
     } 

    catch (Exception e) 
     { 
     e.printStackTrace(); 
     } 

    finally 
     { 
     try 
      { 
      resultSet.close(); 
      statement.close(); 
      connection.close(); 
      } 

     catch (Exception e) 
      { 
      e.printStackTrace(); 
      } 
     } 
    } 
} 
2

c'è un programma open source chiamato Hindsight (https://github.com/obsidianforensics/hindsight) che analizza la cronologia di navigazione in Chrome. Mentre il programma è piuttosto ampio e complicato, accede ai vari file SQLite di Chrome utilizzando query SQL, che possono essere estratte e utilizzate indipendentemente, sia in un browser SQLite che in un programma diverso.

Un esempio di uno per la V30 Chrome + database di storia è:

SELECT urls.id, urls.url, urls.title, urls.visit_count, urls.typed_count, urls.last_visit_time, urls.hidden, urls.favicon_id, visits.visit_time, visits.from_visit, visits.visit_duration, visits.transition, visit_source.source 
FROM urls JOIN visits ON urls.id = visits.url 
LEFT JOIN visit_source ON visits.id = visit_source.id 

ci sono molte altre query SQL per le diverse banche dati Chrome, così come diverse versioni di Chrome.

Problemi correlati