本次开发环境与工具如下:
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上面使用淘宝账号登录,输入账号密码点击登录后,截到如下数据,
<ignore_js_op> 
(技巧:登录网站即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值拼装网址并继续访问,如下图
<ignore_js_op> 
从上面得到的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, "(?<=\"st\":\").*?(?=\")");//捕获st的值,后面还要使用它
                   ……
              }
}

第三步:根据捕获的st值,继续访问,如下图
<ignore_js_op> 
通过将上面得到的st值再次拼装下网址得到URL即https://login.taobao.com/member/vst.htm?st={0}&……TPL_username%3D{1}……&callback=jsonp75
,{0}处填写上一步的st,{1}处填写淘宝账号
(思路:这次返回的值是否有价值呢?我们看看下面的请求哪个网址中出现这个返回值。找到了!返回值url后面跟的就是下次要访问的网址,好神奇呀)
这次服务器同样会返回下一次要访问的网址,我们将他捕获出来它就是url字段(上图中红框标记),代码如下
private void Login(){
                      ……
Match st = Regex.Match(html, "(?<=\"st\":\").*?(?=\")");
                    if (st.Success)
                    {
                        item.URL = string.Format("https://login.taobao.com/member/vst.htm?st={0}&……TPL_username%3D{1}……&callback=jsonp75
", st.Value, txtLoginId.Text.Trim());
                        item.Cookie = cookie;
                        result = m_Http.GetHtml(item);
                        html = result.Html;
                        cookie += result.Cookie;
                        Match url = Regex.Match(html, "(?<=\"url\":\").*?(?=\")");
                        if (url.Success)
                        {
                             ……
                       }
}

第四步:我们继续访问这个url,服务器将会进行重定向三次,每次重定向的网址从上次的结果HttpResult.Header[Location]属性中获取,再赋值给item.URL进行访问。如下图
<ignore_js_op> 
代码如下
private void Login()
{
       ……
       Match url = Regex.Match(html, "(?<=\"url\":\").*?(?=\")");
                        if (url.Success)
                        {
                            #region 这里HttpWatch中重定向三次
                            //阿里妈妈,阿里巴巴旗下网络营销平台
                            item.Method = "get";
                            item.Cookie = cookie;
                            item.URL = url.Value;//上次回复流中捕获的url
                            result = m_Http.GetHtml(item);//第1次重定向
                            cookie += result.Cookie;
                            item.URL = result.Header[HttpResponseHeader.Location];
                            item.Cookie = cookie;
                            result = m_Http.GetHtml(item);//第2次重定向
                            cookie += result.Cookie;
                            item.URL = result.Header[HttpResponseHeader.Location];
                            item.Cookie = cookie;
                            result = m_Http.GetHtml(item);//第3次重定向
                            cookie += result.Cookie; 
                            #endregion
                          ……
                       }
}

至此登录就完成了,接下来就是下载xls文件了。对于下载xls文件较简单,直接get方式提交网址,得到byte[]字节数组并利用FileStream类写到文件中。大家根据以上分析的思路学会分析才是最重要的,所以下载这部分就留给大家自已分析了。提示:下载观看我的源码+观察HttpWatch截获的数据2种方式相结合去分析,对于观察HttpWatch截获的数据主要观看他是POST还是GET方式,以及访问的地址和提交的COOKIE以及服务器返回的COOKIE,还有服务器的回复流这几个方面着手分析。

上面我在讲解的过程中分了4个步骤,是从第1步至第4步讲解的,其实我们在分析数据的时候应该首先从第4步开始一直回溯分析网址来源就得到了第1步。第4步中服务器发来的cookie才是最重要的,有了它才能访问淘宝联盟的首页(这个结论当然是通过几次试验得出的),但如果不进行第123步的话第4步的访问地址和cookie无法得出,所以第4步是分析数据的切入点,至关重要。

HttpHelper类登录淘宝联盟并下载淘宝客订单xls的更多相关文章

  1. 淘宝联盟api调用笔记

    一.流程及主要请求接口 每日凌晨1点开始,服务器定时自动请求淘宝联盟数据,请求完毕之后,执行一个存储过程对数据进行整理,删除过期...购买数量<...的商品......,请求接口分别有(tbk_ ...

  2. HttpWebRequest 模拟登录响应点击事件(分享自己用的HttpHelper类)

    平时也经常采集网站数据,也做模拟登录,但一般都是html控件POST到页面登录:还没有遇到用户服务器控件button按钮点击事件登录的,今天像往常一样POST传递参数,但怎么都能登录不了:最后发现还有 ...

  3. npm的一些常用命令(在国内,建议使用cnpm,在淘宝镜像里面下载就行)

    npm的一些常用命令(在国内,npm操作可能会比较慢,建议使用cnpm,在淘宝镜像里面下载就行,用法和npm一样) cnpm安装地址,直接安装 npm install cnpm -g --regist ...

  4. npm镜像指定用淘宝镜像去下载

    使用npm下载,蜗牛,使用cnpm又觉得那啥,所以.把cnpm也就是淘宝镜像绑定成npm下载的代理,这样使用npm的时候其实是用淘宝镜像去下载,这感觉,good! 1. npm config set ...

  5. 淘宝杨志丰:OceanBase--淘宝结构化大数据解决之道

    时至今日,“Big data”(大数据)时代的来临已经毋庸置疑,尤其是在电信.金融等行业,几乎已经到了“数据就是业务本身”的地步.这种趋势已经让很多相信数据之力量的企业做出改变.恰逢此时,为了让更多的 ...

  6. [C#HttpHelper]类1.4正式版教程与升级报告

       [C#HttpHelper]类1.4正式版教程与升级报告 导读 1.升级报告 2.HttpHelper1.4正式版下载 3.HttpHelper类使用方法, 4.最简单的Post与Get的写法 ...

  7. 淘管 ERP项目与淘宝对接中产生的若干问题及处理办法

    现象:ERP绑定淘宝后,下载商品数据时如果成功,ajax不断尝试重发. 原因:  /app/taoapi/lib/top/TopClient.php 中的curl()方法成功后,返回空值,而前端收到空 ...

  8. Java、C#双语版HttpHelper类

    Java.C#双语版HttpHelper类(解决网页抓取乱码问题)   在做一些需要抓取网页的项目时,经常性的遇到乱码问题.最省事的做法是去需要抓取的网站看看具体是什么编码,然后采用正确的编码进行解码 ...

  9. HttpHelper类及调用

    首先列出HttpHelper类 /// <summary> /// Http操作类 /// </summary> public class HttpHelper { priva ...

随机推荐

  1. Opensuse enable sound and mic card

    Install application pavucontrol Run pavucontrol You will see the configuration about sound card and ...

  2. Xcode 杂七杂八

    一.Exception 的捕捉 1.message send to dealloc instance  a, 输出控制台(lldb)后面输入:c + enter, 找到对应的行      b, po ...

  3. ASP.NET 访问路径 错误提示 HTTP 错误 404.8 原来路径中包含bin目录被拒绝

    HTTP 错误 404.8 - Not Found HTTP 错误 404.8 - Not Found 请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径. 最可能的原因 ...

  4. magento 每日新品展示

    http://blog.csdn.net/benben0503/article/details/8647020 1.创建Newarrivals.php文件: <?php /** * This i ...

  5. *BigDecimal初识

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处 理16位有效数.在实际应用中,需要对更大或者更小的数进 ...

  6. Eclipse Memory Analyzer,内存泄漏插件,安装使用一条龙

    网上文档很多,但最初都有问题.整理一份,作为备份.使用过程:开发代码写完后,对可能出现内存溢出的代码,添加配置文件,生成.hprof文件,用memory Analyzer分析排查问题,且泄漏内存大小可 ...

  7. C语言之memcpy函数

    昨天自己动手实现memcpy这个函数,用一个例程试了一下,结果正确,满心欢心,可是有些地方想不明白,于是百度了一下,结果自己写的函数简直无法直视. 觉得还是写个总结,以示教训. 先贴上我自己的函数: ...

  8. 小Q系列之 最佳裁判

    这个题需要注意一些数据条件 尤其是一些输入数据条件 #include<algorithm> #include<stdio.h> #include<math.h> u ...

  9. java栈与堆

    java基本类型: 变量存放在栈区 java引用类型: 变量名存放在栈区,变量内容存放在堆区. 实例一: int a = 6; int b = 9; swap(int x, int y) { int ...

  10. iOS开发Hessian

    HessianKit使用参考资料比较少,通过摸索,把测试过程贴出来,代码很乱,未整理,先实现功能,再应用到项目中.供新手参考.如有问题,跟帖指正... HessianService与Java Serv ...