6

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

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

我开始做很多谷歌搜索并阅读我能找到的关于用 C# 编写屏幕刮板的所有内容。经过一番调查和多次尝试,我想我得出的结论是,这并不容易。

问题的关键(正如我现在所看到的)是 ASP 为程序员提供了许多维护状态的方法。Cookie、视图状态、会话变量、页面变量、获取和发布参数等。另外,程序员可以在服务器和客户端脚本之间划分工作。IE、Safari、Chrome 或 Firefox 等富 Web 客户端知道如何处理程序员编写的任何内容(以及 ASP 框架在幕后实现的内容)。

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

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

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

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

谁能对我应该把注意力集中在哪里有一些敏锐的洞察力?

这既是一个项目,也是一次学习经历。也就是说,我真的很想从目标站点自动登录和信息检索。

4

3 回答 3

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,application/xhtml+xml,application/ 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

于 2012-11-15T07:30:32.633 回答
1

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

顺便说一句,您不是“安全专家”吗?

于 2012-11-15T07:39:28.633 回答
0

你为什么不使用 IE,在 Windows 窗体中自动化 IE 非常简单,而且你也可以轻松处理代理。

于 2012-11-29T07:58:43.983 回答