Je veux écrire un programme simple qui montre mon activité Internet sur une période de temps (quel site j'ai visité, combien de fois et ainsi de suite). J'utilise principalement Google Chrome. J'ai découvert Chrome stocke l'historique du navigateur à cet emplacement (veuillez me corriger si je me trompe))
C:\Documents and Settings\<username>\Local Settings\Application Data\Google\Chrome\User Data\Default
Comment puis-je ouvrir les fichiers d'historique? Ils n'ont pas d'extension de fichier. Je n'ai pas pu ouvrir en utilisant le bloc-notes, le navigateur SQLite. Comment accéder à ces données par programme? Je veux savoir de quel format de fichier il s'agit et comment le lire en utilisant un langage de programmation comme C #.
C'est juste une base de données SQlite 3, j'ai pu l'ouvrir avec succès (bien que vous ne puissiez bien sûr pas ouvrir une base de données verrouillée d'un navigateur en cours d'exécution).
Voici une classe que j'ai créée pour lire les données de navigation de Google Chrome. La plupart du code que j'ai obtenu de ici mais je l'ai ajusté pour ajouter un support pour Google Chrome. Vous souhaitez probablement également télécharger SQLite pour .Net à partir de ici et ajouter les références à 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 de 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;
}
}
Cela a fonctionné comme un charme pour moi. J'espère que cela aide
Pour visualiser les bases de données sqlite (qui est l'index de l'historique de Chromium), j'ai préféré sqlitebrowser . C'est gratuit et fonctionne sur Windows, Mac et Linux. Un favori de tous les temps pour moi.
Il existe un programme open source appelé Hindsight ( https://github.com/obsidianforensics/hindsight ) qui analyse l'historique de navigation dans Chrome. Bien que le programme soit plutôt volumineux et compliqué, il accède aux différents fichiers Chrome SQLite à l'aide de requêtes SQL, qui peuvent être extraits et utilisés indépendamment, soit dans un navigateur SQLite soit dans un programme différent.
Un exemple d'un pour la base de données Chrome v30 + History est:
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
Il existe de nombreuses autres requêtes SQL pour différentes bases de données Chrome, ainsi que différentes versions de Chrome.
Puisque l'affiche originale demandait un programme simple, le voici. Le programme a été adapté à partir du site Web de l'espace de travail Java (tel que crédité dans le code). Vous devrez modifier l'argument de getConnection ()
pour indiquer où résident les fichiers d'historique. votre machine. Le programme se compile et s'exécute sur mon environnement 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 ();
}
}
}
}
Je sais que Safari utilise Binary PLists pour son historique (et SQLite pour son cache). Est-il possible que Chrome fasse de même?