Время прочтения: 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));

Дальше сохраняем информацию и передаем в парсер.