是否有可能使用C#从Chrome/Firefox本地存储中检索数据?
是否有可能使用C#从Chrome/Firefox本地存储中检索数据?
免责声明:我已在我的 Windows 7 x64 上测试了此方法,使用的是 Google Chrome 13.0.782.220。这里提供的信息是我自己研究的结果,不是任何官方途径或 API 检索此信息的方法。请自行承担风险。此外,如果 Chrome 改变存储此信息的方式,本文介绍的技术可能会失效。
所以,Google Chrome使用SQLite来存储本地存储数据。您可以使用System.Data.SQLite托管驱动程序从.NET应用程序中读取它。如果您正在运行Windows 7(不知道其他操作系统是否也是这样,因为我只能测试这个),您将拥有以下文件夹:
c:\Users\SOMEUSERNAME\AppData\Local\Google\Chrome\User Data\Default\Local Storage\
.localstorage
的文件。每个文件都是为不同的站点而准备的。例如,对于StackOverflow,我有http_stackoverflow.com_0.localstorage
,但是这种命名方式完全是任意的,您不能依赖它。每个文件代表一个SQLite数据库。ItemTable
的表,其中包含2个字符串列,分别为key
和value
。class Program
{
static void Main()
{
using (var conn = new SQLiteConnection("Data Source=http_stackoverflow.com_0.localstorage;Version=3;"))
using (var cmd = conn.CreateCommand())
{
conn.Open();
cmd.CommandText = "SELECT key, value FROM ItemTable";
using (var reader = cmd.ExecuteReader())
{
while (reader.Read())
{
Console.WriteLine(
"key: {0}, value: {1}",
reader.GetString(reader.GetOrdinal("key")),
reader.GetString(reader.GetOrdinal("value"))
);
}
}
}
}
}
// writing local storage in FrameLoadStart
foreach (var entry in LocalStorage)
{
script += $"window.localStorage.{entry.Key} = '{entry.Value}';";
}
IFrame frame = chromeBrowser.GetMainFrame();
var result = await frame.EvaluateScriptAsync(script , frame.Url, 0);
if(!result.Success)
{
throw new Exception(result.Message);
}