Ответ 1
Это просто база данных SQlite 3, я смог ее успешно открыть (хотя, конечно, вы не можете открыть заблокированную базу данных работающего браузера).
Я хочу написать простую программу, которая показывает мою интернет-активность за определенный период времени (какой сайт я посетил, сколько раз и так далее). Я в основном использую браузер Google Chrome. Я обнаружил, что Chrome хранит историю браузера в этом месте (пожалуйста, исправьте меня, если я ошибаюсь)
C:\Documents and Settings\<username>\Local Settings\Application Data\Google\Chrome\User Data\Default
Как я могу открыть файлы истории? У них нет расширений. Я не мог открыть с помощью блокнота, браузера SQLite. Как мне получить доступ к этим данным программно? Я хочу знать, какой это формат файла и как его читать, используя язык программирования, такой как С#.
Это просто база данных SQlite 3, я смог ее успешно открыть (хотя, конечно, вы не можете открыть заблокированную базу данных работающего браузера).
Вот класс, который я создал для чтения данных из Google Chrome. Большая часть кода, который я получил от здесь, но я изменил его, чтобы добавить поддержку Google Chrome. Возможно, вы также захотите загрузить SQLite для .Net из здесь и добавить ссылки на 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;
}
}
Класс для 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;
}
}
Это работало как прелесть для меня. Надеюсь, что это поможет.
Для просмотра баз данных sqlite (что является индексом хронологии Chromium), я предпочел sqlitebrowser. Он бесплатный и работает на Windows, Mac и Linux. Мне все время нравится.
Поскольку оригинальный плакат попросил простую программу, вот он. Программа была адаптирована с веб-сайта рабочей области java (как указано в коде). Вам нужно будет изменить аргумент для getConnection ()
, чтобы указать, где находятся файлы истории на вашем компьютере. Программа компилируется и работает в среде 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 ();
}
}
}
}
Существует программа с открытым исходным кодом Hindsight (https://github.com/obsidianforensics/hindsight), которая анализирует историю просмотров в Chrome. Хотя программа довольно большая и сложная, она обращается к различным файлам Chrome SQLite с использованием SQL-запросов, которые могут извлекаться и использоваться независимо, либо в браузере SQLite, либо в другой программе.
Пример для базы данных Chrome v30 + History:
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
Существует множество запросов SQL для разных баз данных Chrome, а также разных версий Chrome.
Я знаю, что Safari использует Binary PLists для своей истории (и SQLite для своего кеша). Возможно ли, что Chrome делает то же самое?