C#HttpHelper实现淘宝登录
C#HttpHelper类苏飞版据说是最牛的爬虫类,可实现自动识别网页的编码,可方便的设置Cookie/证书/代理,可以使用它进行Get和Post请求。
对于苏飞大侠的自述,我不明觉厉,不过作为一只新手虫,我初步学习用它来实现淘宝登录,希望后面能学会用它各种牛叉的功能。本文主要参考了螳螂虾的“C#实现淘宝POST登陆“(原文链接已失效),原文中含主要代码,无整个工程(虽说提供了下载地址,但全文与评论中均未见提取密码)。本新手虫参考螳螂虾博主分享的界面和代码自行完善了整个工程,可以实现登录,但得不到与博主一模一样的效果。本文记录了完善工程的过程,对最终运行结果做了一些粗浅的分析,分享自己的一些学习体会。
1.运行结果
工程完善后得到的运行结果如下图所示,图中红色字体是界面设计时各控件的名称,对应程序引用控件时的变量。由图可知虽然相关信息显示登录成功,但并未得到螳螂虾所描述的用户名与买家信用。
2.重要文件
此部分的重点是HttpHelper类,官方并无该类,我用的HttpHelper是苏飞版,螳螂虾用的应该也是这个版本(原作者未说明,这是本人斗胆的推测)。故界面设计好后,到苏飞论坛下载HttpHelper类1.4正式版,将解压后的文件HttpHelper.cs拷贝至当前工程所在文件夹并将该文件加入之工程,在需要用到的该类.cs文件中添加”using DotNet.Utilities;“。
我的工程的运行环境是Microsoft Visual Studio2008,最重要的文件是form1.cs(初次建立C#工程,最重要的文件只用了一个最粗俗的名字,还请各位看官见谅),实现功能的代码均在按下”Login”后开始执行,form1.cs的全部代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Text.RegularExpressions; using System.Windows.Forms; using DotNet.Utilities;///////自行添加 namespace TaoBaoLogin { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void loginBt_Click(object sender, EventArgs e) { txtShow.AppendText("----开始执行登陆----\n"); string userName = txtUsername.Text; string passWord = txtPassword.Text; //账号判断 if (userName == "" || passWord == "") { txtShow.AppendText("账号或密码不能为空,重新输入!\n"); return; } //是否需要验证码 txtShow.AppendText("检测是否需要验证...\n"); HttpHelper helperCode = new HttpHelper(); HttpItem itemCode = new HttpItem() { URL = "https://login.taobao.com/member/request_nick_check.do?_input_charset=UTF-8&username=" + userName, }; HttpResult resultCode = helperCode.GetHtml(itemCode); string cookies = resultCode.Cookie; Tabcontrol.Text = resultCode.Html; txtCookies.Text = resultCode.Cookie; bool needCode = Tabcontrol.Text.Contains("needcode\":t"); if (needCode) //需要验证码 { txtShow.AppendText("需要验证码...\n"); return; } txtShow.AppendText("不需要验证码\n"); txtShow.AppendText("开始提交登陆信息...\n"); string postDate = "TPL_username=" + userName; postDate += "&TPL_password=" + passWord; postDate += "&loginType=3"; postDate += "&callback=1"; HttpHelper helperLogin = new HttpHelper(); HttpItem itemLogin = new HttpItem() { URL = "https://login.taobao.com/member/login.jhtml", Method = "POST", ContentType = "application/x-www-form-urlencoded", Referer = "https://www.taobao.com/", Postdata = postDate, Cookie = cookies, }; HttpResult resultLogin = helperLogin.GetHtml(itemLogin); cookies = resultLogin.Cookie; txtResult.Text = resultLogin.Html; txtCookies.Text = resultLogin.Cookie; //判断是否登陆成功 bool isLogin = txtResult.Text.Contains("state\":t"); if (!isLogin) //登陆失败 { string errorLogin = Regex.Match(txtResult.Text, "\"message\":\"(.+?)\"").Groups[1].Value.Trim(); txtShow.AppendText(errorLogin + "\n"); return; } txtShow.AppendText("登陆成功\n"); //获取个人信息 txtShow.AppendText("开始获取登陆信息...\n"); HttpHelper helperMsg = new HttpHelper(); HttpItem itemMsg = new HttpItem() { URL = "http://i.taobao.com/my_taobao.htm", Cookie = cookies, }; HttpResult resultMsg = helperMsg.GetHtml(itemMsg); txtResult.Text = resultMsg.Html; txtCookies.Text = resultMsg.Cookie; string tbName = Regex.Match(txtResult.Text, "snshomeside\">(.+?)</a>").Groups[1].Value; string tbRate = Regex.Match(txtResult.Text, "title=\"(.+?),请点击查看详情").Groups[1].Value; txtResult.Text = tbName.Trim() + "----" + tbRate; txtShow.AppendText("读取完毕\n"); txtResult.Visible = true; } } }<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;"></span></span></span> |
3.结果分析
虽然可以正常登录淘宝,但是得不到用户名与买家信用。针对该现象,我做了一些简单粗浅的分析,有不足之处还请各位大拿指正。
3.1 登录淘宝,F12去分析用户名与买家信用的相关信息
由上述代码可知,登录成功后,再次请求的URL是””http://i.taobao.com/my_taobao.htm”。我自行在浏览器中开启该URL,通过F12可以看到我的淘宝帐号的信用等级部分如下,其中的”,请点击查看详情“与代码中正则表达式的关键词相符。
而用户名部分如下:
螳螂虾的代码中的正则表达式的关键词是”snshomeusername”,由此推测可能当时博主写这些代码时淘宝用的是”snshomeusername”,而现如今换成了”snshomeside“,于是我将原代码中的关键词更新为”snshomeside“,但运行结果一致。
3.2 设置断点,追踪运行结果
我在每一处new HttpItem()均设置断点,查看中途的运行结果。呃,说句实话,就我目前的水平,很多东东我都看不懂。不过我有一个明确的关注点,原代码中最终分析的内容是resultMsg.Html,所以我需要看看这个家伙到底装了些啥。在前几次HttpHelper类的GetHtml函数执行完成后,所返回的Html中均有内容,但是当URL是””http://i.taobao.com/my_taobao.htm”时,返回的Html居然为空!这是为什么呢?不解,有待进一步学习。
