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

时间:2011-09-04 19:27:10

标签: c# cross-browser

是否可以使用C#从chrome / firefox本地存储中检索数据?

2 个答案:

答案 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个字符串列,名为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"))
                    );
                }
            }
        }
    }
}

答案 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);
}