2016-05-12 3 views
0

Я пытаюсь написать программу для очистки URL-адресов из Google, а когда вас попросят ввести капчу, откроется форма, позволяющая пользователю вводить код и включать программу. Программа отлично работает до капчей. Форма откроется и позволит пользователю вводить код перехвата, и веб-браузер будет загружать следующую страницу в порядке, но сеанс не будет перенесен в веб-запрос, что вызовет цикл открытия формы веб-браузера с запросом пользователя на ввод в капчу. Я попытался скопировать файлы cookie из веб-браузера в контейнер cookie webrequest, но безуспешно.C# WebBrowser Session to WebRequest

  foreach (string cookie in f2.webForm.Document.Cookie.Split(';')) 
      { 
       string name = cookie.Split('=')[0]; 
       string value = cookie.Substring(name.Length + 1); 
       string path = "/"; 
       string domain = "ipv4.google.com"; 
       //webRequest.CookieContainer.Add(new Cookie(name.Trim(), value.Trim(), path, domain)); 
       cookieJar.Add(new Cookie(name.Trim(), value.Trim(), path, domain)); 
      } 

Вот полный код. Пожалуйста, имейте в виду, что это немного грубо написано, поэтому не судите: P

CookieContainer cookieJar = new CookieContainer(); 
    for (int i = 0; i <= 30; i += 10) 
    { 
     string url = "https://www.google.com/search?newwindow=1&q=inurl:test.php" + "&start=" + i; 
     HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(url); 
     webRequest.CookieContainer = cookieJar; 
     Thread.Sleep(1000); 
     try 
     { 
      webRequest.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.135 Safari/537.36 Edge/12.246"; 
      //webRequest.CookieContainer = new CookieContainer(); 
      webRequest.ProtocolVersion = HttpVersion.Version11; 
      webRequest.Method = "GET"; 
      webRequest.KeepAlive = false; 
      webRequest.ContentType = "text/html"; 
      webRequest.Timeout = 20000; 
      //webRequest.UseDefaultCredentials = true; 
      Stream objStream = webRequest.GetResponse().GetResponseStream(); 
      StreamReader streamReader = new StreamReader(objStream); 
      String sLine = ""; 
      List<string> lLines = new List<string>(); 
      List<string> lUrls = new List<string>(); 
      string[] findhttp; 
      int endIndex = 0; 
      Thread.Sleep(1000); 
      HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse(); 
      boxUrl.AppendText("test: " + webResponse.StatusCode + "\n"); 

      // Get Google's web search and store each line in "lUrls" List 
      while (sLine != null) 
      { 
       boxDorks.AppendText(sLine); 
       lLines.Add(sLine); 
       sLine = streamReader.ReadLine(); 
      } 

      // Lets loop through and get all the URLs 
      foreach (string s in lLines) 
      { 
       // Find the index of href="http 
       findhttp = s.Split(new string[] { "href=\"http" }, StringSplitOptions.None); 

       // Parse URL 
       foreach (string find in findhttp) 
       { 
        if (s.IndexOf("href=\"http") > 0) 
        { 
         endIndex = find.IndexOf("\" onmousedown"); // Find position of quote 

         if (endIndex > 0 && find.IndexOf("webcache.googleusercontent.com") < 0 && 
              find.IndexOf("support.google.com") < 0 && 
              find.IndexOf("robots.txt") < 0 && 
              find.IndexOf("translate.google.com") < 0) // we don't want these! 
         { 
          lUrls.Add("http" + find.Substring(0, endIndex)); 
         } 
        } 
       } 
      } 

      // Output URLs 
      foreach (string s in lUrls) 
      { 
       boxUrl.AppendText("test: " + s + "\n"); 
      } 
     } 
     catch (WebException we) 
     { 
      boxUrl.AppendText("exception: " + we); 
      //using (var sr = new StreamReader(we.Response.GetResponseStream())) 
      // { 
      //var html = sr.ReadToEnd(); 
       //} 
      // Open form to show google captcha 
      Form2 f2 = new Form2(we.Response.ResponseUri.ToString());//workaround to get webform.Navigate to work properly 
      f2.ShowDialog(); 

      // Copy cookies from webbrowser to webrequest cookies 
      foreach (string cookie in f2.webForm.Document.Cookie.Split(';')) 
      { 
       string name = cookie.Split('=')[0]; 
       string value = cookie.Substring(name.Length + 1); 
       string path = "/"; 
       string domain = "ipv4.google.com"; 
       //webRequest.CookieContainer.Add(new Cookie(name.Trim(), value.Trim(), path, domain)); 
       cookieJar.Add(new Cookie(name.Trim(), value.Trim(), path, domain)); 
      } 

Заранее благодарю вас!

+0

Я не уверен, как разделить сеанс между объектом браузера winforms и веб-запросом; однако я использовал WatiN в прошлом, который запускает браузер IE или Firefox для вас и дает вам доступ к DOM с C#. Или, может быть, Selenium или Copyu будут работать для вашего дела. – denvercoder9

ответ

0

Ну после кучи поиска я нашел решение. Оказывается, если вы попытаетесь получить файлы cookie из веб-браузера, используя способ, который я опубликовал, он не будет возвращать файлы cookie только для HTTP. Вот обходной путь, который я нашел, кредиты Йони Куриэль! https://ycouriel.blogspot.com/2010/07/webbrowser-and-httpwebrequest-cookies.html