|
发表于 2015-3-31 13:15:18
|
显示全部楼层
本帖最后由 1602264241 于 2014-11-26 15:50 编辑
利用飞哥的HttpHelper 1.3版本(因为我用VS2005开发,1.3报错少)实现模拟登录淘宝联盟并且下载淘宝客订单xls文件。现提供源码下载,有不明白的可以问我,同时如果您有好的修改建议请回复。我是第一次开发Http程序,请多包涵。
本次开发环境与工具如下:
IE9.0浏览器 + IE抓包插件HttpWatch +WIN7 64位系统 + VS2005 IDE + .NET 2.0框架
本想上传HttpWatch抓包插件,但由于文件超过9.6M的限制,无法提供了。请各位到google上面搜索下吧
测试时注意事项:
必须取消淘宝帐号登录保护http://110.taobao.com/protect/protect_web.htm
做这个程序关键是分析数据,只有数据分析出来了,才能动手写代码,当然您如果对HttpHelper类不熟悉的话,请参考飞哥相关的文章。
我看到好多人发文章都是直接发代码,我感觉没什么用,因为拿到代码后还要调试并且要揣摩代码的调用究竟有何用意,对于初学者(比如我)来说真的没有信心把它的代码看完,因为即使知道每句代码的含义,但却完全不知道他为什么要这么做,这么做的目的何在。所以授人以鱼,不如授人以渔。我的目的是要教会大家从如何分析数据开始直到把分析的结果写成代码。
下面来几张截图说明分析数据步骤:
第一步:在淘宝联盟www.alimama.com上面使用淘宝账号登录,输入账号密码点击登录后,截到如下数据,
(技巧:登录网站即POST数据,重点找POST方式,以及哪个网址中包含login字样,以及请求/回复流中是否包含有价值的信息,如:账号、密码或登录成功的提示信息等)
(思路:使用上面的技巧分析,发现有2个POST其中有个POST的网址包含login字样,并且请求流中包含用户名和密码,回复流中包含登录成功与否的提示,所以他就是我们要找的登录数据。)
现在我们知道了要POST的URL,即"https://login.taobao.com/member/login.jhtml",以及要POST的数据,还有服务器将会回复的内容,那么请看如下代码:
private void Login()
{
HttpItem item = new HttpItem();
item.URL = https://login.taobao.com/member/login.jhtml;
item.Method = "post";
item.Postdata = string.Format("ua=056u5Ob……&TPL_username={0}&TPL_password={1}&...……", HttpUtility.UrlEncode(txtLoginId.Text.Trim()), HttpUtility.UrlEncode(txtPwd.Text.Trim()));
item.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
item.Allowautoredirect = true;
HttpResult result = m_Http.GetHtml(item);
string html = result.Html;//服务器回复的内容,它是json格式,包括message,token等字段,message为空为登录成功,否则不为空
string cookie = result.Cookie;//保存cookie便于后面还要使用
Match m = Regex.Match(html, "(?<=,\"message\":\").*?(?=\",)");
if (string.IsNullOrEmpty(m.Value)) //登录成功账号密码正确的情况下
{
Match token = Regex.Match(html, "(?<=\"token\":\").*?(?=\")");//捕获token的值,后面提交的网址中将要使用它
if (!string.IsNullOrEmpty(token.Value))
{
……
}
}
}
如上代码所示,当访问请求提交后,服务器返回的json内容在变量html里面,其中message字段表示是否有错误,如:账号密码不正确,如果账号密码正确message字段值将为"",所以我们利用正则表达式捕获message的值用于判断账号密码是否正确。
(思路:我们发现回复的json里面除了message字段之外,还有个token字段,它有什么作用呢?先不着急,我们看看接下来的数据包里面有哪个地方包含了这个token数据。找到了!他就是接下来请求的网址)
另外token字段我们也要获取下来,因为下一个访问的网址要用到它。
第二步:根据捕获的token值拼装网址并继续访问,如下图
从上面得到的token值,经过拼装字符串得到下次访问的URL,即"https://passport.alipay.com/mini_apply_st.js?site=0&token={0}&callback=vstCallback62"。
(思路:既然上次访问的结果有价值,那么这次服务器返回的结果是否也有价值呢?我们看下结果,这次访问后服务器会返回一段js代码,其中包含一个"st"的值(看上图的红色框部分),我们发现下次请求的网址中真的用到了这个st哦!好兴奋)
同样,这次我们也像上次一样用正则表达式捕获"st”的值并且保存,因为后面要使用到它。
(小结:其实我一直在做一件事情,即:把这次访问的结果作为参数拼装一下将得到下次要访问的网址)
private void Login(){
……
Match token = Regex.Match(html, "(?<=\"token\":\").*?(?=\")");//获取token值
if (!string.IsNullOrEmpty(token.Value))
{
item = new HttpItem();
item.Method = "get";
item.URL = string.Format("https://passport.alipay.com/mini_apply_st.js?site=0&token={0}&callback=vstCallback62", token.Value);
item.Accept = "application/javascript, */*;q=0.8";
result = m_Http.GetHtml(item);
html = result.Html;
cookie += result.Cookie;
Match st = Regex.Match(html, "(?<gdlyhp.com=\"st\":\").*?(?=\")");//捕获st的值,后面还要使用它
……
}
} |
|