На нашем сайте мы используем cookie для сбора информации технического характера и обрабатываем IP-адрес вашего местоположения. Продолжая использовать этот сайт, вы даете согласие на использование файлов cookies. Здесь вы можете узнать, как мы пользуемся файлами cookies.
Я согласен
логотип upread.ru

Авторизация на сайтах 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, в котором хранить получаемые куки и затем отправлять другие запросы к сайту и парсить закрытую информацию. Либо же создавать ботов. Есть вопросы? Пишите, за плату я вам помогу.




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





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




Работа с Java Date и Time API: введение
Как улучшить настроение


© upread.ru 2013-2019
При перепечатке активная ссылка на сайт обязательна.
Задать вопрос
письмо
Здравствуйте! Вы можете задать мне любой вопрос. Если не получается отправить сообщение через эту форму, то пишите на почу up777up@yandex.ru
Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.