2017-10-10 10 views
0

J'ai un code C# (c'est une application Web, hébergée sur IIS) où j'utilise HttpWebRequest pour obtenir HttpWebResponse. Là, je demande à n'importe quel site Web & obtenir la réponse sous forme de chaîne, puis j'analyse la chaîne de réponse. Mais récemment, je reçois la réponse où JavaScript récupère les données après le chargement de la page dans le navigateur.Comment faire face à JavaScript lors de l'extraction de la réponse http en C# en utilisant HttpWebRequest?

J'ai essayé de déboguer cela dans firebug & vu qu'au bas de la réponse il y a une fonction JavaScript qui met à jour les éléments dom après pageload. Est-il possible que je puisse faire la même chose dans mon code C#? J'ai cherché sur le net à propos de cette solution trouvée pas jusqu'à maintenant.

Voici le code que je utilise:

HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

     foreach (Cookie cook in response.Cookies) 
     { 
      Cookie cookie = new Cookie(); 
      cookie.Name = cook.Name; 
      cookie.Value = cook.Value; 
      cookie.Domain = cook.Domain; 
      cookie.Expires = DateTime.Now.AddDays(10); 
      cookieList.Add(cookie); 
     } 

     string postData = string.Format("username=" + txtUserID.Text + "&password=" + txtPwd.Text + "&url=https://example.com/&game="); 
     byte[] postBytes = Encoding.UTF8.GetBytes(postData); 
     HttpWebRequest req = (HttpWebRequest)WebRequest.Create("https://login.example.com/Login/authenticate"); 
     req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:42.0) Gecko/20100101 Firefox/42.0"; 
     req.KeepAlive = true; 
     req.AutomaticDecompression = DecompressionMethods.GZip; 

     ////set the cookie 
     req.CookieContainer = new CookieContainer(); 
     foreach (Cookie cook in cookieList) 
     { 
      Cookie cookie = new Cookie(); 
      cookie.Name = cook.Name; 
      cookie.Value = cook.Value; 
      cookie.Domain = cook.Domain; 
      cookie.Expires = DateTime.Now.AddDays(10); 
      req.CookieContainer.Add(cookie); 
     } 

     req.Headers.Add("Accept-Encoding", "gzip, deflate"); 
     req.Headers.Add("Accept-Language", "en-GB,en-US;q=0.8,en;q=0.6");//en-GB,en-US;q=0.8,en;q=0.6 
     req.Method = "POST"; 
     req.Host = "login.example.com"; 
     req.Referer = "https://login.example.com/Login/logout"; 
     req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"; 

     req.ContentType = "application/x-www-form-urlencoded;"; 
     req.ContentLength = postBytes.Length; 

     //getting the request stream and posting data 
     StreamWriter requestwriter = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII); 
     requestwriter.Write(postData); 
     requestwriter.Close(); 
     HttpWebResponse myHttpWebResponse = (HttpWebResponse)req.GetResponse(); 
     Stream responseStream = myHttpWebResponse.GetResponseStream(); 
     StreamReader myStreamReader = new StreamReader(responseStream, Encoding.ASCII); 
     string responseString = myStreamReader.ReadToEnd(); 
     myStreamReader.Close(); 
     responseStream.Close(); 
     myHttpWebResponse.Close(); 
+1

Vous avez besoin de quelque chose qui puisse fonctionner comme un navigateur et réellement exécuter du javascript. HttpRequest n'est pas capable de le faire. Il existe plusieurs bibliothèques et outils capables de faire cela (par exemple: https://github.com/cefsharp/CefSharp/). Si vous ne souhaitez pas utiliser de bibliothèque tierce, vous pouvez utiliser le contrôle WebBrowser pour cela (mais cela ne sera pas recommandé). – Evk

+0

Can github.com/cefsharp/CefSharp fonctionne-t-il dans une application Web hébergée sur IIS? – user1400290

+0

Il y a un moteur de rendu "hors écran", qui ne dépend d'aucune interface utilisateur (comme winforms ou wpf). Ce moteur de rendu peut fonctionner dans n'importe quel type d'application, y compris une application Web. – Evk

Répondre

0

j'ai finalement obtenu la solution facile à mon besoin. Voici le lien que je suivais: Link to tutorial

Voici le code qui va obtenir les résultats:

D'abord, vous devrez importer suivant:

using System.Drawing; 
using OpenQA.Selenium; 
using OpenQA.Selenium.PhantomJS; 
using System.Text.RegularExpressions; 
using System.IO; 
using HtmlAgilityPack; 

maintenant le code:

 var options = new PhantomJSOptions(); 
     var driver = new PhantomJSDriver(options); 
     driver.Manage().Window.Size = new Size(1360, 728); 
     var size = driver.Manage().Window.Size; 

     driver.Navigate().GoToUrl("https://example.com/"); 
     string url = driver.Url; 
     //the driver can now provide you with what you need (it will execute the script) 
     //get the source of the page 
     var source = driver.PageSource; 
     //fully navigate the dom 
     var pathElement1 = driver.FindElementByName("username"); 
     var pathElement2 = driver.FindElementByName("password"); 
     var pathElement3 = driver.FindElementByXPath("//button[@class='SubmitButton']"); 

     pathElement1.Clear(); 
     pathElement1.SendKeys("username"); 
     pathElement2.Clear(); 
     pathElement2.SendKeys("password"); 
     pathElement3.Click(); 

     //Now get the response after login button click 
     source = driver.PageSource;