Время прочтения: 2 мин.
Однажды передо мной стояла задача: собрать информацию с сайта Youla для проведения аудиторской проверки.
Информация о поведении пользователя на сайте записывается в cookies сайта. Это может быть — поиск по определенному региону, сортировка по выбранной категории товара и др. Дальше с помощью cookies пользователь поддерживает общение с сайтом.
1.Для начала разберемся, где лежит файл cookies. У меня это выглядит так (ниже) и файл назывался Cookies без каких-либо опознавательных знаков:
C:\Users\*(пользователь)\AppData\Local\Google\Chrome\User Data\Default
Возможны еще варианты, поэтому запишем в программе путь к файлу через if else:
if (File.Exists(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Cookies")) pathToCookies = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Google\Chrome\User Data\Default\Cookies";
else pathToCookies = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData) + @"\Local\Google\Chrome\Profile 1\Cookies";
2. В nuget прямо из студии скачиваем и добавляем этот код в проект (указав в поиске «SQLite» и прописав using System.Data.SQLite).
3. Далее подключаемся.
SQLiteConnection connection = new SQLiteConnection(@"data source=" + pathToCookies, true)
connection.Open();-открываем соединение
SQLiteCommand command = new SQLiteCommand(«select * from cookies where host_key like ‘.youla.ru'», connection);-записываем команду.
SQLiteDataReader reader = command.ExecuteReader();-создаем ридер и читаем (у меня это были имя, значение, путь, домен).
В моем случае — это reader[2], reader[12], reader[4], reader[1]. Reader[12] называется encrypted_value и он encrypted (зашифрован).
Chrome использует тройное шифрование DES с паролем текущего пользователя в качестве начального числа на компьютерах с Windows. Чтобы расшифровать это в C #, нужно использовать API защиты данных Windows (DPAPI). Так что нам надо расшифровать для начала значение и для этого просто вставляем строку:
Encoding.ASCII.GetString(System.Security.Cryptography.ProtectedData.Unprotect((byte[])reader[12], null, System.Security.Cryptography.DataProtectionScope.CurrentUser));
Дальше сохраняем информацию и передаем в парсер.