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

и хотя я нашел много статей и другой информации о том, как ПОЛУЧИТЬ и ПОСТАВИТЬ, используя 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) все еще не удается войти в систему. Я создал форму, и из этой формы я ввожу парольи имя пользователя.Когда он делает это, он говорит, что потерпел неудачу, и это нормально.Я также использую Фиддер, чтобы посмотреть, что все происходит.

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

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

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

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

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

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

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

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

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

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

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

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

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);

    }

1 Ответ

4 голосов
/ 08 февраля 2011

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

здесь ссылка для начала работы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...