2009-06-10 7 views
22

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

Дополнительная информация: Проверка подлинности на основе

  • Cookie.
  • POST требуется действие.

ответ

22

Вы должны сделать запрос так, как будто вы только что заполнили форму. Предполагая, что это 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; 

Возможно.

+0

Спасибо, это похоже на то, что я мог бы использовать, я приму этот ответ, если он будет работать, когда я вернусь к программированию. :-) –

+0

Это работает, если веб-страница находится в обычном HTML, но если форма динамически создается через Javascript ... будет ли это работать? – Souper

+0

@Souper, вероятно, нет; вам нужно будет проверить, какие запросы, идущие от входа на страницу, которую вы хотите очистить, будут, а затем создавать запросы, которые имитируют это поведение. – dlamblin

0

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

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

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

+0

Yup, самая сложная часть, о которой я забыл упомянуть (потому что она используется большую часть времени), заключается в том, чтобы сохранить файл cookie со мной на следующей странице. –

5

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

Если идти по этому пути, еще несколько предложений:

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

Проблема в том, что я не могу создать форму GUI в этой части приложения. –

+0

Ну, это слишком плохо. если вы устали от работы с низкоуровневыми материалами, вы можете попробовать написать отдельное графическое приложение, которое будет создано из вашего приложения, выполнить очистку и сообщить результаты. Но это своего рода растяжение ... – eran

+0

@eran +1. Ваше решение выглядит более полным. – Souper

0

В дополнении к dlambin ответа Нужно иметь

http.AllowAutoRedirect=false; 

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

HttpWebResponse httpResponse = http.GetResponse() as HttpWebResponse; 

Это сделает другой запрос первоначальной URL, и вы не сможете получить URL2.

2

В некоторых случаях 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; 
+0

Это сработало очень хорошо, спасибо. –

 Смежные вопросы

  • Нет связанных вопросов^_^