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