使用C#从浏览器本地存储中检索数据

12

是否有可能使用C#从Chrome/Firefox本地存储中检索数据?


从哪个浏览器?Chrome,FireFox,IE,...?从哪个版本开始? - Darin Dimitrov
我更喜欢使用Chrome,无论是哪个版本(最新版本也可以)。但如果能够在Firefox/Chrome的任何版本上运行,那就更完美了(我猜如果它能在Chrome x版本上运行,那么它也能在任何高于x的版本上运行,对吗?) - adi
2个回答

13

免责声明:我已在我的 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个字符串列,分别为keyvalue
所以要读取值,只需发送一个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"))
                    );
                }
            }
        }
    }
}

0
当使用Chromium嵌入式框架时,我发现上述解决方案有很多限制。看起来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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接