Подтвердить что ты не робот

Как программно войти на сайт в экраны?

Мне нужна некоторая информация с веб-сайта, который не принадлежит мне, для получения этой информации мне нужно зайти на сайт, чтобы собрать информацию, это происходит через HTML-форму. Как сделать это аутентифицированное экранирование в С#?

Дополнительная информация:

  • Проверка подлинности на основе файлов cookie.
  • Требуется действие POST.
4b9b3361

Ответ 1

Вы сделаете запрос так, как будто вы только что заполнили форму. Предполагая, что это POST, вы делаете запрос POST с правильными данными. Теперь, если вы не можете войти прямо на ту же страницу, которую хотите очистить, вам нужно будет отслеживать, какие cookie файлы установлены после вашего запроса на вход, и включить их в свой запрос на скремблирование, чтобы вы могли оставаться в системе.

Это может выглядеть так:

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";
string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;
http.CookieContainer = new CookieContainer();
http.CookieContainer.Add(httpResponse.Cookies);
HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

Может быть.

Ответ 2

Вы можете использовать WebBrowser. Просто подайте URL-адрес сайта, затем используйте DOM, чтобы установить имя пользователя и пароль в правильные поля и, в конечном счете, отправить клик на кнопку отправки. Таким образом, вы не заботитесь ни о чем, кроме двух полей ввода и кнопки отправки. Нет обработки файлов cookie, без сырого разбора HTML, без HTTP-нюхания - все, что выполняется с помощью элемента управления браузера.

Если вы пойдете так, еще несколько предложений:

  • Вы можете не допустить, чтобы элемент управления загружал надстройки, такие как Flash, может сэкономить некоторое время.
  • После входа в систему вы можете получить любую необходимую информацию из DOM - не нужно анализировать необработанный HTML.
  • Если вы хотите сделать инструмент еще более портативным, если сайт изменится в будущем, вы можете заменить явное манипулирование DOM инъекцией JavaScript. JS может быть получен из внешнего ресурса, и как только он называется, он может выполнять популяцию полей и отправить.

Ответ 3

В некоторых случаях httpResponse.Cookies будет пустым. Вместо этого используйте CookieContainer.

CookieContainer cc = new CookieContainer();

HttpWebRequest http = WebRequest.Create(url) as HttpWebRequest;
http.KeepAlive = true;
http.Method = "POST";
http.ContentType = "application/x-www-form-urlencoded";

http.CookieContainer = cc;

string postData="FormNameForUserId=" + strUserId + "&FormNameForPassword=" + strPassword;
byte[] dataBytes = UTF8Encoding.UTF8.GetBytes(postData);
http.ContentLength = dataBytes.Length;
using (Stream postStream = http.GetRequestStream())
{
    postStream.Write(dataBytes, 0, dataBytes.Length);
}
HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;
// Probably want to inspect the http.Headers here first
http = WebRequest.Create(url2) as HttpWebRequest;

http.CookieContainer = cc;

HttpWebResponse httpResponse2 = http.GetResponse() as HttpWebResponse;

Ответ 4

Вам нужно использовать HTTPWebRequest и выполнить POST. Эта ссылка должна помочь вам приступить к работе. Ключ в том, что вам нужно посмотреть на HTML-форму страницы, которую вы пытаетесь отправить, чтобы просмотреть все параметры, необходимые для отправки этой публикации.

http://www.netomatix.com/httppostdata.aspx

http://geekswithblogs.net/rakker/archive/2006/04/21/76044.aspx

Ответ 5

В качестве дополнения к ответу на dlambin Необходимо иметь

http.AllowAutoRedirect=false;

В противном случае

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse;

Он сделает другой запрос на исходный url, и вы не сможете получить url2.