Программно войти на веб-страницу HTTPS (c #) - PullRequest
2 голосов
/ 10 июня 2011

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

private void VisitUrl()
    {

        string pageVisited = string.Empty;
        CookieContainer cookies = new CookieContainer();


        //Go to login page so that we get a cookie
        HttpWebRequest loginRequest = (HttpWebRequest)HttpWebRequest.Create("http://www.apage.com/login.asp");

        loginRequest.UseDefaultCredentials = true;
        loginRequest.UserAgent = Constants.usrAgentIE8;
        loginRequest.CookieContainer = cookies;
        loginRequest.AllowAutoRedirect = false;

        HttpWebResponse loginResponse = (HttpWebResponse)loginRequest.GetResponse();


        string guid = Regex.Match(loginResponse.Headers["Set-Cookie"], Constants.guidRegex).Value;
        guid = guid.Replace("%2D", "-");

        //Now that we have the cookie we can do a proper login
        HttpWebRequest doLogin = (HttpWebRequest)HttpWebRequest.Create("https://secure.apage.com/express/login.asp");

        //doLogin.UseDefaultCredentials = true;
        doLogin.UserAgent = Constants.usrAgentIE8;
        doLogin.Method = Constants.verbPOST;
        doLogin.ContentType = Constants.contTypeURLenc;
        doLogin.AllowAutoRedirect = false;



        using (StreamWriter sw = new StreamWriter(doLogin.GetRequestStream()))
        {
            sw.Write("usr=user&pass=" + Constants.pass + "&mc=1&guid=" + guid + "&dbnum=0&ic=1&task=dologin&app=library&x=32&y=10");

        }

        doLogin.CookieContainer = cookies;
        doLogin.Referer = "http://www.apage.com/login.asp";

        HttpWebResponse Response = (HttpWebResponse)doLogin.GetResponse();

        string resphead = Response.Headers["Set-Cookie"];

        string resp = Response.StatusCode.ToString();

        using (StreamReader sr = new StreamReader(Response.GetResponseStream()))
        {
            string textresponse = sr.ReadToEnd();

        }


        HttpWebRequest Request = (HttpWebRequest)HttpWebRequest.Create("http://www.apage.com/toc.aspx?id=40729");
        Request.UserAgent = Constants.usrAgentIE8;
        Request.UseDefaultCredentials = true;
        Request.CookieContainer = cookies;

        using (HttpWebResponse urlResponse = (HttpWebResponse)Request.GetResponse())
        {
            using (StreamReader reader = new StreamReader(urlResponse.GetResponseStream()))
            {
                pageVisited = reader.ReadToEnd();

            }

        }

    }

Проблема, с которой я столкнулся, заключается в том, что когда я пытаюсь выполнить третий запрос, http://www.apage.com/toc.aspx?id=40729, он просто пропускает cookie, и мне кажется, что я вернулся к логинустр.Это успешный вход в систему через браузер от fiddler:

 1  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 2  200 HTTPS   secure.apage.com    /express/login.asp  3,253   private     text/html   iexplore:5908           
 3  200 HTTPS   secure.apage.com    /express/zarketing.css  13,340      text/css    iexplore:5908           
 4  200 HTTPS   secure.apage.com    /express/images/_loadingtext.gif    798     image/gif   iexplore:5908           
 5  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 6  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 7  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 8  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 9  200 HTTP    CONNECT secure.apage.com:443    0           iexplore:5908           
 10 200 HTTPS   secure.apage.com    /express/images/_loadingbox1.gif    66      image/gif   iexplore:5908           
 11 200 HTTPS   secure.apage.com    /express/images/_loadingbox5.gif    66      image/gif   iexplore:5908           
 12 200 HTTPS   secure.apage.com    /express/images/_loadingbox4.gif    100     image/gif   iexplore:5908           
 13 200 HTTPS   secure.apage.com    /express/images/_loadingbox2.gif    66      image/gif   iexplore:5908           
 14 200 HTTPS   secure.apage.com    /express/images/_loadingbox3.gif    66      image/gif   iexplore:5908           
 15 302 HTTP    www.apage.com   /authenticate.asp?ticket=2ECCC1686F49BE35E14556E76EFCBF3E478157F89B826A03C421883BE61BB634D8DDDB25F8943414252CE46C27B1FAE837B802A7BD1EE9723ECDCB99B7D3D1DB60FAB3042D0D632BF1C41BA622C2546E&mc=1  142 max-age=0, no-cache, no-store  Expires: Fri, 10 Jun 2011 09:04:21 GMT   text/html   iexplore:5908           
 16 200 HTTP    www.apage.com   /toc.aspx?id=40729  86,179  max-age=0, no-cache, no-store  Expires: Fri, 10 Jun 2011 09:04:22 GMT   text/html; charset=utf-8    iexplore:5908           

Запрос 15 - это перенаправление, и в этом запросе уже есть отсутствующий файл cookie, но я не знаю, как создается этот файл cookie.Похоже, он не присутствует в ответе на мой второй запрос, https://secure.apage.com/express/login.asp, который я посмотрел во время отладки.

Нужно ли делать запросы на все картинки?

Есть идеи?

TIA

1 Ответ

0 голосов
/ 17 июля 2011

Вы пробовали использовать

doLogin.AllowAutoRedirect = true;

Код состояния HTTP 302 (строка 15) показывает, что файл был «временно перемещен». Возможно, вам придется разрешить перенаправления.

Кроме того, информация о файлах cookie также может быть передана в свойство Headers collection. Посмотрите в коллекции ответа Headers.Keys любое имя, например «cookie». Например, веб-сайт, на который я должен войти, использует имя «Set-Cookie». Я получаю значение следующим образом:

if (response.Headers["Set-Cookie"] != null)
{
    Match match = Regex.Match(response.Headers["Set-Cookie"].ToString(), @"(?'Name'\w+)
=(?'Value'\w+).+=(?'Path'[\s\S]+)");
    if (match.Success)
    {
        Cookie cookie = new Cookie(match.Groups["Name"].ToString(), 
match.Groups["Value"].ToString(), match.Groups["Path"].ToString(), "domain.name.com");
        cookies.Add(cookie);
    }
}
...