Как мне войти в систему, перемещаться и возвращать данные с защищенного веб-сайта, пока все, что я делаю, не работает

и хотя я нашел много статей и другой информации о том, как выполнять GET и POST с помощью HttpWebRequest и Response, мне трудно заставить все работать так, как я ожидал.

Я играл с несколькими идеями, которые я нашел, но пока ничего не работает... Я опубликую свой код:

private void start_post()
    {
        string username = txtUser.Text;
        string password = txtPassword.Text;
        string strResponce;
        byte[] buffer = Encoding.ASCII.GetBytes("username="+username+"&password="+password);
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text);
        WebReq.Method = "POST";
        //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
        WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        WebReq.Headers.Add("Translate", "F");
        WebReq.AllowAutoRedirect = true;
        WebReq.CookieContainer = cookieJar;
        WebReq.KeepAlive = true;
        WebReq.ContentType = "application/x-www-form-urlencoded";
        WebReq.ContentLength = buffer.Length;
        Stream PostData = WebReq.GetRequestStream();
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
        //txtResult.Text = WebResp.StatusCode.ToString() + WebResp.Server.ToString();

        Stream answer = WebResp.GetResponseStream();
        StreamReader _answer = new StreamReader(answer);
        strResponce = _answer.ReadToEnd();
        //txtResult.Text = txtResult.Text + _answer.ReadToEnd();

        answer.Close();
        _answer.Close();

        foreach (Cookie cookie in WebResp.Cookies)
        {
            cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
            txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
        }

        if (strResponce.Contains("Log On Successful") || strResponce.Contains("already has a webseal session"))
        {
            MessageBox.Show("Login success");
            foreach (Control cont in this.Controls)
            {
                cont.Visible = true;
            }
        }
        else
        {
            MessageBox.Show("Login Failed.");
        }


    }

Здесь, в коде, я могу пройти весь путь до конца, и все еще получаю ошибку входа в систему, когда я перехожу на http://www.comicearth.com (мой собственный сайт, php и apache) Я создал форму и в этой форме ввожу пароль и имя пользователя. Когда он это делает, он говорит, что не удалось, и это нормально. Я также использую Fidder, чтобы следить за тем, что происходит.

Итак, из приведенного ниже кода я знаю, что делаю что-то не так.

Однако, когда я перехожу к другому веб-приложению, я получаю следующую ошибку в строке:

HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();

"Content-Length или Chunked Encoding нельзя установить для операции, которая не записывает данные".

Я пытаюсь найти, что не так, и все, что я сказал, это из-за перенаправления 302...

Итак, глядя в Fiddler, я вижу огромную разницу между публикованием данных и входом через веб-страницу. Так что я знаю, что делаю недостаточно, но я не знаю, где искать.

Моя цель - создать приложение, которое может войти на веб-сайт, а затем с помощью опции поиска извлекать необходимые данные, которые в настоящее время наши пользователи делают вручную, если я смогу автоматизировать часть утомительной работы, это действительно поможет всем. из. Однако в настоящее время я застрял на входе в систему, понимании файлов cookie и т. Д. Кроме того, на веб-сайте используются фреймы, я не знаю, будет ли это проблемой, но я решил опубликовать эту информацию на всякий случай. это еще одно препятствие, с которым я еще не сталкивался.

Дайте мне знать, если вам нужно, чтобы я увидел больше кода, в настоящее время я использую httpwebrequest и httpwebresponse, и я прочитал другую информацию о веб-клиенте.

Я скачал и поигрался с htmlagilitypack, но в настоящее время не уверен, что на 100% хорошо понимаю, как все это работает.

Если вы знаете о каких-либо хороших статьях или другой информации, которая более подробно освещает эту тему, или у вас есть что-нибудь, что я могу попробовать, дайте мне знать.

Большое спасибо за ваше время.

Обновите новый код, см. также мой комментарий ниже: - Хорошо, я обнаружил, что из-за перенаправления я получаю одно сообщение об ошибке: «Content-Length or Chunked Encoding и т. д.», и поэтому я включил allowAutoRedirect = false, и теперь я ищу тег «местоположение», перенаправляю себя и т. д., что избавляет от этого сообщения, однако я все еще не захожу на сайт, что разочаровывает, и я не могу понять, почему на момент. :С

private void start_post2()
    {
        string username = txtUser.Text;
        string password = txtPassword.Text;
        Uri link = new Uri(txtLink.Text);
        string postArgs = string.Format(@"userId={0}&password={1}", username, password);
        byte[] buffer = Encoding.ASCII.GetBytes(postArgs);
        HttpWebRequest WebReq = (HttpWebRequest)WebRequest.Create(txtLink.Text);
        WebReq.Method = "POST";
        //WebReq.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
        WebReq.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)";
        //WebReq.ClientCertificates.Add("Accept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
        WebReq.AllowAutoRedirect = false;
        WebReq.Accept = "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5";
        WebReq.Accept = "*/*";
        //WebReq.Headers.Add(HttpRequestHeader.Cookie, cookieJar);
        WebReq.CookieContainer = cookieJar;
        WebReq.KeepAlive = true;
        WebReq.ContentType = "application/x-www-form-urlencoded";
        WebReq.ContentLength = buffer.Length;
        Stream PostData = WebReq.GetRequestStream();
        PostData.Write(buffer, 0, buffer.Length);
        PostData.Close();

        HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
        if (WebResp == null) throw new Exception("Response is null");

        foreach (Cookie cookie in WebResp.Cookies)
        {
            cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
            //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
        }

        if (!string.IsNullOrEmpty(WebResp.Headers["Location"]))
        {
            string newLocation = WebResp.Headers["Location"];

            //Request the new location
            WebReq = (HttpWebRequest)WebRequest.Create(newLocation);
            WebReq.Method = "GET";
            WebReq.ContentType = "application/x-www-form-unlencoded";
            WebReq.AllowAutoRedirect = false;
            WebReq.CookieContainer = cookieJar;
            WebReq.CookieContainer.Add(WebResp.Cookies);

            buffer = Encoding.ASCII.GetBytes("userId=" + username + "&password=" + password);

            WebReq.ContentLength = buffer.Length;
            PostData = WebReq.GetRequestStream();
            PostData.Write(buffer, 0, buffer.Length);
            PostData.Close();

            WebResp = (HttpWebResponse)WebReq.GetResponse();

            foreach (Cookie cookie in WebResp.Cookies)
            {
                cookieJar.Add(new Cookie(cookie.Name.Trim(), cookie.Value.Trim(), cookie.Path, cookie.Domain));
                //txtResult.Text += cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString();
            }
        }
        else if (!string.IsNullOrEmpty(WebResp.Headers["Set-Cookie"]))
        {
            // thinking...
        }

        foreach (Cookie cookie in cookieJar.GetCookies(link))
        {
            MessageBox.Show(cookie.Name.ToString() + Environment.NewLine + cookie.Value.ToString() + Environment.NewLine + cookie.Path.ToString() + Environment.NewLine + cookie.Domain.ToString());
        }

        StreamReader sr = new StreamReader(WebResp.GetResponseStream());
        string responseHtml = sr.ReadToEnd().Trim();

        SearchPatient(WebReq, username, password);

    }

person Brian Montfort    schedule 07.02.2011    source источник
comment
ОБНОВЛЕНИЕ: Хорошо, я обнаружил, что из-за перенаправления я получал одно сообщение об ошибке: Content-Length или Chunked Encoding и т. д., и поэтому я включил allowAutoRedirect = false, и теперь я ищу тег местоположения и перенаправляю себя и т. д., который избавился от этого сообщения, однако я все еще не захожу на сайт, что разочаровывает, и я не могу понять, почему в данный момент. :С   -  person Brian Montfort    schedule 08.02.2011


Ответы (1)


Если это приложение winform и приложение представляет собой просто средство очистки экрана, а не очень большое приложение, вы можете использовать Watin для того, чтобы сделать разборку

вот ссылка для начала

person Ankush Roy    schedule 08.02.2011