本次开发环境与工具如下:
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. 【翻译】How To Tango With Django 1.5.4 第四章

    4.模板和静态媒体 这章讲解模板引擎 4.1使用模板 前面我们讲解了view和url 映射,创建出了django 的web页面,现在就要将模板混合进去 好的网站在布局上总是有许多重复的.django提 ...

  2. 《Linux内核分析》第七周 读书笔记

    <深入理解计算机系统>CHAPTER7阅读梳理 [学习时间:3hours] [学习内容:链接需要的代码&数据:链接机制:链接生成的目标文件] 一.链接概述 1.链接 定义:链接是将 ...

  3. Windows7中IIS简单安装与配置(详细图解)

    最近工作需要IIS,自己的电脑又是Windows7系统,找了下安装的方法,已经安装成功.在博客里记录一下,给需要的朋友,也是给自己留个备份,毕竟我脑子不是很好使. 一.首先是安装IIS.打开控制面板, ...

  4. 压缩文本、字节或者文件的压缩辅助类-GZipHelper 欢迎收藏

    压缩文本.字节或者文件的压缩辅助类-GZipHelper 欢迎收藏 下面为大家介绍一.NET下辅助公共类GZipHelper,该工具类主要作用是对文本.字符.文件等进行压缩与解压.该类主要使用命名空间 ...

  5. HtmlAgilityPack抓取搜房网数据简单示例

    HtmlAgilityPack是一个开源的解析HTML元素的类库,最大的特点是可以通过XPath来解析HMTL,如果您以前用C#操作过XML,那么使用起HtmlAgilityPack也会得心应手.目前 ...

  6. Winform 主窗体更换 构造函数传值

    制作登录窗体: 制作一个登陆窗体,实现点击按钮关闭此窗体并打开另一个窗体 直接在按钮点击事件中,实例化一个想要打开的窗体 使用show方法打开,并把登陆窗体的visible属性改为false Form ...

  7. css字体样式(Font Style),属性

    css字体样式(Font Style),属性   css字体样式(Font Style)是网页中不可或缺的样式属性之一,有了字体样式,我们的网页才能变得更加美观,因此字体样式属性也就成为了每一位设计者 ...

  8. axure rp pro 7.0(页面原型工具)

    axure rp pro 7.0 下载连接:地址

  9. * 和 ** python

    *代表tuple集合,**代表dict def func(a, b, c=0,  *args, **kw) print ('a=',a, 'b=',b,'c=',c,'args=',args,'kw= ...

  10. JS逗号运算符的用法详解

    逗号运算符的用法详解 注意: 一.由于目前正在功读JavaScript技术,所以这里拿JavaScript为例.你可以自己在PHP中试试. 二.JavaScript语法比较复杂,因此拿JavaScri ...