Retrieve data from browser local storage using c#

时光怂恿深爱的人放手 提交于 2020-05-24 20:27:11

问题


Is it possible to retrieve data from chrome/firefox local storage using C#?


回答1:


Disclaimer: I have tested this on my Windows 7 x64 running Google Chrome 13.0.782.220 at the moment. The information provided here is a result of my own research and is not any official way or API to retrieve this information. Use at your own risk. Also the technique presented here might break with any future release if Chrome changes the way to store this information.


So, Google Chrome uses SQLite to persist local storage data. You could use the System.Data.SQLite managed driver to read it from your .NET application. If you are running on Windows 7 (don't know for others as that's the one I have and can test), you will have the following folder:

c:\Users\SOMEUSERNAME\AppData\Local\Google\Chrome\User Data\Default\Local Storage\

This folder will contain multiple files with the .localstorage extension. Each file is for different site. For example for StackOverflow I have http_stackoverflow.com_0.localstorage but of course this naming is totally arbitrary and you cannot rely upon it. Each file represents a SQLite database.

I have noticed that this database contains a table called ItemTable with 2 string columns called key and value.

So to read the values it's a simple matter of sending a SQL query:

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"))
                    );
                }
            }
        }
    }
}



回答2:


When using Chromium Embedded Framework I found that the above solution has many limitations. It seems like Chromium have moved to using leveldb instead.

I ended up with a solution where I inject JS code that modify local storage in FrameLoadStart. (it should be easy to read values as well - JavascriptResponse.Result can be casted to a IDictionary when using this script: "window.localStorage;" instead)

// 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);
}


来源:https://stackoverflow.com/questions/7301611/retrieve-data-from-browser-local-storage-using-c-sharp

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!