Авторизация на сайтах C#


Одна из интересных тем в программировании – это имитация работы браузеров и людей. Некий тандем. В это число входит, например, авторизация на сайте. Здесь программа должна уметь запросить страницу с входом, заполнить поля и получить результат. На примере одного сайта я покажу как это делать.

Итак, в одном из заказов потребовалось мне спарсить закрытый контент сайта. Закрытый от незарегистрированных пользователей. Сам парсинг (например, с помощью CsQuery) мы уже изучили, но вот как обойти форму входа? На самом деле это просто, но требуется внимательность. Ну и кое-что, конечно, надо просто знать.

Я не буду показывать вам рабочий сайт, авторизуемся мы на примере другого, но принцип работы совершенно идентичен. Вот сайт – keft.ru. Предположим, мы там зарегистрировались, а теперь хотим научиться автоматически входить. Если посмотреть исходный код сайта, то мы увидим обработчик формы входа:



Давайте попробуем послать по данному адресу обычный POST запрос и получить ответ. Напишем следующий код:

HttpClient h = new HttpClient();

var values = new Dictionary
{

};

var content = new FormUrlEncodedContent(values);
var response = await h.PostAsync("https://www.keft.ru/ajax/keft/login.php", content);
var responseString = await response.Content.ReadAsStringAsync();
textBox1.Text = responseString;
Попробуем его выполнить и получаем:



Что ж, получаем совершенно логичный и ожидаемый результат: сервер требует авторизации. Давайте посмотрим, какие данные браузер отсылает для авторизации. Переходим на вкладку “Network”, выбираем файл login.php и смотрим информацию POST-запроса. Тут нас интересуют две вещи: отсылаемые поля формы и заголовки запроса. Отсылаемые поля выглядят так:



Обратите внимание, что помимо двух полей логина и пароля, есть еще поле login_ok, которое отправляется пустым - это кнопка. Что ж, добавляем информацию к нашему коду:

            var values = new Dictionary
{
   { "login", "логин" },
   { "pass", "пароль" },
   { "login_ok", "" }
};
Дальше смотрим отправляемые заголовки:



Добавляем и их к нашему запросу:

h.DefaultRequestHeaders.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
                        h.DefaultRequestHeaders.Add("Accept-Language", "ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,pl;q=0.6");
                        h.DefaultRequestHeaders.Add("Cache-Control", "max-age=0");
                        h.DefaultRequestHeaders.Add("Connection", "keep-alive");
                        h.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/x-www-form-urlencoded"));
                        h.DefaultRequestHeaders.Add("Upgrade-Insecure-Requests", "1");
                        h.DefaultRequestHeaders.Add("Origin", "https://fool.keft.ru");
                        h.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36");
                        h.DefaultRequestHeaders.Add("Referer", "https://fool.keft.ru/");
                        h.DefaultRequestHeaders.Add("Host", "www.keft.ru");
                        h.DefaultRequestHeaders.Add("Accept-Charset", "ISO-8859-1");
Пробуем выполнить модифицированный код с авторизацией пост запроса:



И без проблем входим на сайт.

Требования к программе:

  • необходим Framework 4.5 или выше;

  • метод, в котором происходит запрос, должен быть асинхронным (async);

  • необходимо подключить пространства имен:

    using System.Net.Http;
    using System.Net.Http.Headers;
    
Что дальше?

А дальше все зависит от ТЗ или вашей фантазии. Например, можно подключить CookieContainer, в котором хранить получаемые куки и затем отправлять другие запросы к сайту и парсить закрытую информацию. Либо же создавать ботов. Есть вопросы? Пишите, за плату я вам помогу.
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегизаметки, парсинг, си шарп, POST-запрос




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Блог читающего программиста
Урок 8. Логические операторы C#
Перебор всех дней в году на PHP