Получить данные из локального хранилища браузера с помощью c # - PullRequest
10 голосов
/ 04 сентября 2011

Возможно ли получить данные из локального хранилища chrome / firefox с помощью C #?

Ответы [ 2 ]

12 голосов
/ 05 сентября 2011

Отказ от ответственности: я проверил это на моем 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 с двумя строковыми столбцами с именами 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"))
                    );
                }
            }
        }
    }
}
0 голосов
/ 24 августа 2018

При использовании Chromium Embedded Framework я обнаружил, что вышеуказанное решение имеет много ограничений. Похоже, что Chromium перешел на использование leveldb.

Я получил решение, в котором вводил код JS, модифицирующий локальное хранилище в FrameLoadStart. (также должно быть легко читать значения - 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...