2012-03-27 6 views
3

Я работаю над проектом C#, где мне нужно получить данные с защищенного веб-сайта, который не имеет API или веб-служб. Мой план - войти в систему, перейти на нужную мне страницу и проанализировать HTML-код для доступа к битам данных, которые мне нужно для входа в базу данных. Сейчас я тестирую консольное приложение, но в конечном итоге оно будет преобразовано в приложение шины Azure Service.C# Консоль/доступ к серверу на сервере

Чтобы получить что-либо, вам нужно зайти на их страницу login.cfm, что означает, что мне нужно загрузить элементы ввода имени пользователя и пароля на странице и нажать кнопку отправки. Затем перейдите к странице, которую мне нужно проанализировать.

Поскольку у меня нет «браузера» для синтаксического анализа элементов управления, я пытаюсь использовать различные классы C# .NET, чтобы перейти на страницу, установить имя пользователя и пароль и нажать «Отправить», но ничего не работает ,

Любые примеры, на которые я могу обратить внимание, или классы .NET, которые я должен рассматривать, которые были разработаны для такого рода проектов?

Спасибо!

ответ

2

Используйте класс WebClient в System.Net

Для сохранения куки сессии вы будете иметь, чтобы сделать пользовательский класс WebClient.

#region webclient with cookies 
public class WebClientX : WebClient 
{ 
    public CookieContainer cookies = new CookieContainer(); 
    protected override WebRequest GetWebRequest(Uri location) 
    { 
     WebRequest req = base.GetWebRequest(location); 
     if (req is HttpWebRequest) 
      (req as HttpWebRequest).CookieContainer = cookies; 
     return req; 
    } 
    protected override WebResponse GetWebResponse(WebRequest request) 
    { 
     WebResponse res = base.GetWebResponse(request); 
     if (res is HttpWebResponse) 
      cookies.Add((res as HttpWebResponse).Cookies); 
     return res; 
    } 
} 
#endregion 

Используйте браузер надстройку, как FireBug или инструментальные средства разработки, встроенные в Chrome, чтобы получить данные HTTP POST отправляется при отправке формы. Отправьте эти POST с использованием класса WebClientX и проанализируйте HTML-ответ.

Самый быстрый способ разобрать HTML , когда вы уже знаете формат использует простой Regex.Match. Таким образом, вы будете выполнять действия в своем браузере с помощью средств разработки для записи POST, URL-адресов и содержимого HTML, затем вы будете выполнять те же задачи с помощью WebClientX.

+0

Спасибо, это был путь, который я искал. Как только я получаю GetWebResponse, как мне поместить значения в поля имени пользователя и пароля для входа? –

+0

@Chris H - вы не называете эти переопределенные защищенные функции. Что вам нужно сделать, так это узнать открытый интерфейс для WebClient. Сделать HTTP POST, как и отправить форму, будет методом UploadValues ​​WebClient. http://msdn.microsoft.com/en-us/library/system.net.webclient.aspx –

+0

Thats снова, я опубликовал полный код ниже. –

0

Итак, вот полный код для входа на одну страницу, затем прочитайте со второй страницы после входа.

class Program 
     { 
      static void Main(string[] args) 
      { 

       string uriString = "http://www.remotesite.com/login.cfm"; 

       // Create a new WebClient instance. 
       WebClientX myWebClient = new WebClientX(); 

       // Create a new NameValueCollection instance to hold some custom parameters to be posted to the URL. 
       NameValueCollection myNameValueCollection = new NameValueCollection(); 

       // Add necessary parameter/value pairs to the name/value container. 
       myNameValueCollection.Add("userid", "myname"); 
       myNameValueCollection.Add("mypassword", "mypassword"); 

       Console.WriteLine("\nUploading to {0} ...", uriString); 
       // 'The Upload(String,NameValueCollection)' implicitly method sets HTTP POST as the request method.    
       byte[] responseArray = myWebClient.UploadValues(uriString, myNameValueCollection); 

       // Decode and display the response. 
       Console.WriteLine("\nResponse received was :\n{0}", Encoding.ASCII.GetString(responseArray)); 

       Console.WriteLine("\n\n\n pausing..."); 
       Console.ReadKey(); 

       // Go to 2nd page on the site to get additional data 
       Stream myStream = myWebClient.OpenRead("https://www.remotesite.com/status_results.cfm?t=8&prog=d"); 

       Console.WriteLine("\nDisplaying Data :\n"); 
       StreamReader sr = new StreamReader(myStream); 
       StringBuilder sb = new StringBuilder(); 

       using (StreamReader reader = new StreamReader(myStream, System.Text.Encoding.UTF8)) 
       { 
        string line; 
        while ((line = reader.ReadLine()) != null) 
        { 
         sb.Append(line + "\r\n"); 
        } 
       } 

       using (StreamWriter outfile = new StreamWriter(@"Logfile1.txt")) 
       { 
        outfile.Write(sb.ToString()); 
       } 

       Console.WriteLine(sb.ToString()); 

       Console.WriteLine("\n\n\n pausing..."); 
       Console.ReadKey(); 

      } 

     } 

     public class WebClientX : WebClient 
     { 
      public CookieContainer cookies = new CookieContainer(); 
      protected override WebRequest GetWebRequest(Uri location) 
      // public override WebRequest GetWebRequest(Uri location) 
      { 
       WebRequest req = base.GetWebRequest(location); 
       if (req is HttpWebRequest) 
        (req as HttpWebRequest).CookieContainer = cookies; 
       return req; 
      } 
      protected override WebResponse GetWebResponse(WebRequest request) 
      { 
       WebResponse res = base.GetWebResponse(request); 
       if (res is HttpWebResponse) 
        cookies.Add((res as HttpWebResponse).Cookies); 
       return res; 
      } 
     } 
Смежные вопросы