Войдите на сайт, через C #

Я относительно новичок в использовании C # и имею приложение, которое читает части исходного кода на веб-сайте. Это все работает; но проблема заключается в том, что на запрашиваемой странице пользователь должен войти в систему, чтобы получить доступ к этому исходному коду. Какая моя программа нуждается в первоначальном входе пользователя на сайт – после этого я смогу получить доступ и прочитать исходный код.

Веб-сайт, который должен быть зарегистрирован, – это: mmoinn.com/index.do?PageModule=UsersLogin

Я искал весь день о том, как это сделать, и попробовал примеры, но не повезло.

заранее спасибо

Вы можете продолжать использовать WebClient для POST (вместо GET, который является HTTP-глаголом, который вы сейчас используете с DownloadString), но я думаю, вам будет легче работать с (слегка) низкоуровневыми classами WebRequest и WebResponse.

Для этого есть две части: первая заключается в том, чтобы опубликовать форму входа, вторая восстанавливает заголовок «Set-cookie» и отправляет обратно серверу как «Cookie» вместе с вашим запросом GET. Сервер будет использовать этот файл cookie, чтобы идентифицировать вас с этого момента (при условии, что он использует аутентификацию на основе файлов cookie, которую я довольно уверен, поскольку эта страница возвращает заголовок Set-cookie, который включает в себя «PHPSESSID»).


POSTing в форме входа

Формы сообщений легко имитировать, это всего лишь случай форматирования ваших данных сообщения следующим образом:

field1=value1&field2=value2 

Используя WebRequest и код, который я адаптировал от Scott Hanselman , вот как вы должны были сформировать данные в форме входа в систему:

 string formUrl = "http://www.mmoinn.com/index.do?PageModule=UsersAction&Action=UsersLogin"; // NOTE: This is the URL the form POSTs to, not the URL of the form (you can find this in the "action" attribute of the HTML's form tag string formParams = string.Format("email_address={0}&password={1}", "your email", "your password"); string cookieHeader; WebRequest req = WebRequest.Create(formUrl); req.ContentType = "application/x-www-form-urlencoded"; req.Method = "POST"; byte[] bytes = Encoding.ASCII.GetBytes(formParams); req.ContentLength = bytes.Length; using (Stream os = req.GetRequestStream()) { os.Write(bytes, 0, bytes.Length); } WebResponse resp = req.GetResponse(); cookieHeader = resp.Headers["Set-cookie"]; 

Вот пример того, что вы должны увидеть в заголовке Set-cookie для своей формы входа:

 PHPSESSID=c4812cffcf2c45e0357a5a93c137642e; path=/; domain=.mmoinn.com,wowmine_referer=directenter; path=/; domain=.mmoinn.com,lang=en; path=/;domain=.mmoinn.com,adt_usertype=other,adt_host=- 

Получение страницы за формой входа в систему

Теперь вы можете выполнить свой запрос GET на страницу, для которой вам необходимо войти в систему.

 string pageSource; string getUrl = "the url of the page behind the login"; WebRequest getRequest = WebRequest.Create(getUrl); getRequest.Headers.Add("Cookie", cookieHeader); WebResponse getResponse = getRequest.GetResponse(); using (StreamReader sr = new StreamReader(getResponse.GetResponseStream())) { pageSource = sr.ReadToEnd(); } 

РЕДАКТИРОВАТЬ:

Если вам нужно просмотреть результаты первого POST, вы можете восстановить HTML-код, который он вернул, с помощью:

 using (StreamReader sr = new StreamReader(resp.GetResponseStream())) { pageSource = sr.ReadToEnd(); } 

Поместите это прямо под cookieHeader = resp.Headers["Set-cookie"]; а затем проверьте строку, содержащуюся в файле pageSource.

Вы можете немного упростить ситуацию, создав class, который происходит из WebClient, переопределив его метод GetWebRequest и установив на него объект CookieContainer. Если вы всегда устанавливаете один экземпляр CookieContainer, управление файлами cookie будет обрабатываться автоматически для вас.

Но единственный способ добраться до HttpWebRequest перед отправкой – это наследовать от WebClient и переопределить этот метод.

 public class CookieAwareWebClient : WebClient { private CookieContainer cookie = new CookieContainer(); protected override WebRequest GetWebRequest(Uri address) { WebRequest request = base.GetWebRequest(address); if (request is HttpWebRequest) { (request as HttpWebRequest).CookieContainer = cookie; } return request; } } var client = new CookieAwareWebClient(); client.BaseAddress = @"https://www.site.com/any/base/url/"; var loginData = new NameValueCollection(); loginData.Add("login", "YourLogin"); loginData.Add("password", "YourPassword"); client.UploadValues("login.php", "POST", loginData); //Now you are logged in and can request pages string htmlSource = client.DownloadString("index.php"); 

Мэтью Бриндли , ваш код работал очень хорошо для некоторого веб-сайта, который мне нужен (с логином), но мне нужно было перейти на HttpWebRequest и HttpWebResponse иначе я получаю 404 Bad Request с удаленного сервера. Кроме того, я хотел бы поделиться своим обходным путем с помощью вашего кода и заключается в том, что я попробовал его подключиться к веб-сайту на основе moodle , но он не работал на вашем шаге « GETting page behind the login form », потому что, когда вы успешно выполнили POSTing логин, Header 'Set-Cookie' ничего не возвращал, несмотря на то, что другие сайты это делают.

Поэтому я думаю, что там, где нам нужно хранить куки для следующих запросов, я добавил это.

К блоку « POSTing to the login form »:

 var cookies = new CookieContainer(); HttpWebRequest req = (HttpWebRequest)WebRequest.Create(formUrl); req.CookieContainer = cookies; 

И к « Получение страницы за формой входа »:

 HttpWebRequest getRequest = (HttpWebRequest)WebRequest.Create(getUrl); getRequest.CookieContainer = new CookieContainer(); getRequest.CookieContainer.Add(resp.Cookies); getRequest.Headers.Add("Cookie", cookieHeader); 

Сделав это, позвольте мне войти в систему и получить исходный код «страницы за логином» (на основе сайта moodle). Я знаю, что это неопределенное использование CookieContainer и HTTPCookies, потому что мы можем сначала спросить, есть ли ранее сохраненные cookies перед отправкой запроса на сервер. Это все равно работает без проблем, но вот хорошая информация для чтения о WebRequest и WebResponse с WebResponse проектов и учебным WebResponse :
Получение содержимого HTTP в .NET.
Как использовать HttpWebRequest и HttpWebResponse в .NET

Вы всегда можете использовать веб-тест Watin .

Иногда это может помочь отключить AllowAutoRedirect и установить как POST входа, так и страницу GET запрос того же пользовательского агента.

 request.UserAgent = userAgent; request.AllowAutoRedirect = false; 
  • Аутентификация и запрос временной шкалы пользователя с помощью API Twitter 1.1 oAuth
  • Как я могу заставить WebClient использовать Cookies?
  • Использование CookieContainer с classом WebClient
  • HTTP POST возвращает ошибку: 417 «Ожидание не выполнено».
  • Выбор между HttpClient и WebClient
  • Использование WebClient или WebRequest для входа на веб-сайт и доступа к данным
  • Как получить код статуса из веб-клиента?
  • Как получить строку json из url?
  • Загрузка файлов на файловый сервер с использованием classа webclient
  • Загрузите и загрузите двоичный файл на / из FTP-сервера в C # /. NET
  • Как отправить данные на определенный URL-адрес с помощью WebClient в C #
  • Давайте будем гением компьютера.