用于登录ASP.NET网站的控制台应用程序

时间:2012-11-15 04:03:05

标签: c# asp.net console-application web-crawler webclient

首先,请原谅我对这个主题的天真。我是一个退休的程序员,在DOS出现之前就开始了。我不是ASP.NET的专家。我需要知道的部分内容是我需要知道的。 (如果你跟着我......)

所以我想登录一个网站并抓取一些内容。在使用notepad和fiddler2查看HTML源代码之后,我很清楚该站点是使用ASP.NET技术实现的。

我开始做大量的谷歌阅读并阅读有关在c#中编写屏幕抓取工具的所有内容。经过一番调查和多次尝试,我认为我得出的结论并不容易。

问题的关键(我现在看到的)是ASP为程序员提供了很多维持状态的方法。 Cookie,viewstate,session vars,page vars,get和post params等。此外,程序员可以在服务器和客户端脚本之间划分工作。诸如IE或Safari或Chrome或Firefox之类的富Web客户端知道如何处理程序员编写的任何内容(以及ASP框架实现的内容)。

WebClient不是富Web客户端。它甚至不知道如何实现cookie。

所以我陷入了僵局。一种方法是尝试对ASP应用程序所期望的富客户端的所有功能进行反向工程,并在类固有类上编写WebClient,模拟富客户端以便登录。

或者我可以尝试将IE(或其他一些富客户端)嵌入到我的应用程序中,并希望暴露的界面足够丰富,以便我可以以编程方式填充用户名和密码字段并将表单POST回来。 (并访问响应流,以便我可以解析HTML以清除我之后的数据......)

或者我可以寻找一些比WebClient更丰富的第三方控件。

任何人都可以对我应该集中注意力的地方有一些敏锐的洞察力吗?

这与项目一样具有学习经验。也就是说,我真的想从目标站点自动进行登录和信息检索。

3 个答案:

答案 0 :(得分:3)

这是我用来登录网站并获取我的cookie的示例函数

string loginSite(string url, string username, string password)
        {
            HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
            string cookie = "";

            //this values will change depending on the website
            string values = "vb_login_username=" + username + "&vb_login_password=" + password
                                + "&securitytoken=guest&"
                                + "cookieuser=checked&"
                                + "do=login";
            req.Method = "POST";
            req.ContentType = "application/x-www-form-urlencoded";
            req.ContentLength = values.Length;
            CookieContainer a = new CookieContainer();
            req.CookieContainer = a;
            System.Net.ServicePointManager.Expect100Continue = false; // prevents 417 error
            using (StreamWriter writer = new StreamWriter(req.GetRequestStream(), System.Text.Encoding.ASCII)) { writer.Write(values); }
            HttpWebResponse c = (HttpWebResponse)req.GetResponse();
            Stream ResponseStream = c.GetResponseStream();
            StreamReader LeerResult = new StreamReader(ResponseStream);
            string Source = LeerResult.ReadToEnd();


            foreach (Cookie cook in c.Cookies) { cookie = cookie + cook.ToString() + ";"; }
            return cookie;
        }  

这是一个电话示例:

string Cookie = loginSite("http://theurl.comlogin.php?s=c29cea718f052eae2c6ed105df2b7172&do=login", "user", "passwd");

            HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://www.theurl.com");
            //once you got the cookie you add it to the header.

            req.Headers.Add("cookie", Cookie);
            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
            using (Stream respStream = response.GetResponseStream())
            {
                using (StreamReader sr = new StreamReader(respStream))
                {
                    string s = sr.ReadToEnd();
                    HtmlReturn = s;
                  //  System.Diagnostics.Debugger.Break();
                }
            }

使用Firefox,您可以使用扩展名HTTP-Headers来了解post发布的参数,并修改变量值:

 string values = "vb_login_username=" + username + "&vb_login_password=" + password
                                + "&securitytoken=guest&"
                                + "cookieuser=checked&"
                                + "do=login";

与目标网站上的参数匹配。

如果您决定使用firefox的Live-HTTP-HEaders,当您登录网站时,您将获得 来自标题的帖子信息,类似于:

  

GET / HTTP / 1.1主机:www.microsoft.com用户代理:Mozilla / 5.0   (Windows NT 6.1; rv:15.0)Gecko / 20100101 Firefox / 15.0.1接受:   text / html的,应用/ XHTML + xml的,应用/ XML; Q = 0.9, / 的; Q = 0.8   Accept-Language:es-es,es; q = 0.8,en-us; q = 0.5,en; q = 0.3 Accept-Encoding:   gzip,deflate连接:keep-alive Cookie:   WT_FPC = ID = 82.144.112.152-154450144.30258861:LV = 1351580394112:SS = 1351575867559;   WT_NVR_RU = 0 = MSDN:1 = 2 =; omn​​iID = 0d2276c2_bbdd_4386_a11d_f8da1dbc5489;   MUID = 349E06C547426937362B02CC434269B9;   MC1 = GUID = 47b2ed8aeea0de4797d3a40cf549dcbb&安培; HASH = 8aed&安培; LV = 201210&安培; V = 4和; LU = 1351608258765;   A = I&安培; I = AxUFAAAAAAALBwAAukh4HjpMmS4eKtKpWV0ljg !!&安培; V = 4; MSDN = L = EN-US

答案 1 :(得分:1)

我怀疑您可以构建可以为您执行此操作的Chrome扩展程序。

顺便说一下,你不是“安全专家”吗?

答案 2 :(得分:0)

为什么不使用IE,Windows Forms中的自动化IE非常简单,另外你也可以轻松处理代理。