是否可以使用C#从chrome / firefox本地存储中检索数据?
答案 0 :(得分:12)
免责声明:我目前在运行Google Chrome 13.0.782.220的Windows 7 x64上对此进行了测试。此处提供的信息是我自己研究的结果,并不是检索此信息的任何官方方式或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
。
因此,读取值只是发送SQL查询的一个简单问题:
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"))
);
}
}
}
}
}
答案 1 :(得分:0)
使用Chromium Embedded Framework时,我发现上述解决方案有很多限制。看来Chromium已转而使用leveldb。
最后我找到了一个解决方案,其中注入了在FrameLoadStart中修改本地存储的JS代码。 (读取值也应该很容易-使用此脚本时,可以将JavascriptResponse.Result强制转换为IDictionary:“ window.localStorage;”)
// 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);
}