使用HttpWebRequest模拟登陆阿里巴巴(alibaba、httpwebrequest、login)
2015-01-07 21:54
549 查看
前言
其实老喜欢取经,偶尔也得分享下。关于阿里巴巴国际站的登陆,过程有点复杂但是算不上难。一不小心少个东西倒也挺麻烦的。主要是看下请求类HttpClient基本请求封装使用,AliClient模拟浏览器的操作与数据封装
这里只是简单说一下主要的类和注意点,主要步骤与注意点都写在代码注释里了。项目源码下载地址:http://git.oschina.net/GspringG/AliLogin
正文
主要类/方法
HttpClient请求模拟的基础类,也就那么个过程http header设置一下,然后模拟就行了.需要注意的地方在代码注释里using System; using System.Collections.Specialized; using System.Net; using System.Web; using Main.Http; namespace Main.Ali { public class AliClient { const string _csrf_token_ = "_csrf_token_"; public CookieContainer Cookie { get; set; } public string SessionId { get; set; } public string CsrfToken { get; set; } public AliLoginUser AliLoginUser { get; set; } public string DmtrackPageid { get; set; } public string UserName { get { if (AliLoginUser == null) return null; if (AliLoginUser.person_data == null) return null; return AliLoginUser.person_data.login_id; } } public AliClient() { Cookie = new CookieContainer(); } public string Get(string url) { return HttpClient.Get(AddCsrfTokenToUrl(url), this.Cookie, 3); } public string Post(string url, string postData) { return HttpClient.Post(AddCsrfTokenToUrl(url), this.Cookie, AddCsrfTokenToPostData(postData), 3); } //post请求时不用手动加了,默认都加上 private string AddCsrfTokenToPostData(string postData) { NameValueCollection queryString = HttpUtility.ParseQueryString(postData); if (queryString[_csrf_token_] == null) { queryString.Add("_csrf_token_", this.CsrfToken); } return queryString.ToString(); } //Get请求时不用手动加了,默认都加上 private string AddCsrfTokenToUrl(string url) { if (string.IsNullOrWhiteSpace(this.CsrfToken)) return url; UriBuilder ub = new UriBuilder(url); NameValueCollection queryString = HttpUtility.ParseQueryString(ub.Query); if (queryString[_csrf_token_] == null) { queryString.Add("_csrf_token_", this.CsrfToken); } ub.Query = queryString.ToString(); string newurl = ub.Uri.ToString(); return newurl; } } }
View Code
AliPassporter:阿里巴巴登陆核心类(具体个注意细节点都在代码内部已注释)
登陆过程为:从上到下依次
1.PrepareLogin:
/// <summary> /// 登陆前先请求一下页面获取sessionId,DmtrackPageid,初始化cookie的值,像正常访问浏览器一样 /// </summary> /// <param name="aliClient"> AliClient当需要多账号登陆时,每个账号的cookie 各种验证id等独有的东西放到各自的Client中,相当于每个独立的浏览器</param> /// <param name="isSpec">针对某种特殊情况取值方法不一样,默认false</param> public static void PrepareLogin(AliClient aliClient, bool isSpec = false);
2.DoLoginStep1:
/// <summary> /// 登录阿里巴巴 /// </summary> /// <param name="aliClient"> AliClient当需要多账号登陆时,每个账号的cookie 各种验证id等独有的东西放到各自的Client中</param> /// <param name="account">帐户名</param> /// <param name="password">密码</param> /// <param name="checkCode">验证码</param> /// <returns>登陆结果(true/false)</returns> public static bool DoLoginStep1(AliClient aliClient, string account, string password, string checkCode);
3.DoLoginStep2:
/// <summary> /// 登录处理第二步 /// </summary> /// <param name="aliClient"></param> /// <param name="userId">账户</param> /// <param name="password">密码</param> /// <param name="dmtrackPageid">令牌1</param> /// <param name="st">令牌三</param> /// <returns>登陆结果</returns> private static bool DoLoginStep2(AliClient aliClient, string userId, string password, string dmtrackPageid, string st);
4.DoCheckCode:
/// <summary> /// 获取checkcode,图片验证码,其实有时候是不需要的。可以先判断一下,不行再获取验证码 /// </summary> /// <param name="aliClient">aliClient</param> /// <returns>验证码图片,如果是web应用,直接把checkCodeUrl(img src=checkCodeUrl)写进去就行了</returns> public static Image DoCheckCode(AliClient aliClient);
5.登陆过程中还会调用GetToken、GetSt、GetCsrfToken等方法提供登录所需要的get/post参数
6.前端调用流程:登录过程关键代码(详情参见详细代码)
//1.初始化_aliClient,相当于打开一个浏览器,并设置一个空的cookie AliClient _aliClient=new AliClient {Cookie = new CookieContainer()}; //2.无需验证码登陆时这里替换为PrepareLogin(_aliClient); RefreshCheckCode(); //3.登陆系统,异步方法防止页面假死 var data=await AliPassporter.DoLoginAsync(_aliClient, UserName, Password, CheckCode); if (data) { //登陆成功,登陆后其他数据就随便抓了,这里要注意,需要手机验证码的,要在网页中先把手机验证码输入了 //我的测试账号默认写在里面,别乱玩就行了 //进入管理个人信息页面 var html = _aliClient.Get("http://accounts.alibaba.com/user/organization/manage_person_profile.htm"); MessageBox.Show("登陆成功!"); //_aliClient.Post(""); } else { MessageBox.Show("登陆失败!"); }
总结
以上就是阿里巴巴国际站登陆的全部过程,总体大同小异,很久之前写的了(建议先把注释看一遍再用)。现在拿出来分享一下,顺便复习一下HttpWebRequest的相关使用。相关文章推荐
- c# 使用 HttpWebRequest模拟登陆
- vb.net如何使用HttpWebRequest模拟登陆带验证码的网站
- [ 转]c# 使用 HttpWebRequest模拟登陆(附带验证码)
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
- 使用C#的HttpWebRequest模拟登陆网站
- 使用C#的HttpWebRequest模拟登陆网站
- 使用C#的HttpWebRequest模拟登陆网站
- 使用C#的HttpWebRequest模拟登陆网站
- 转:使用C#的HttpWebRequest模拟登陆网站
- HttpWebRequest模拟登陆,存储Cookie以便登录请求后使用
- 使用C#的HttpWebRequest模拟登陆网站
- 使用C#的HttpWebRequest模拟登陆网站
- c#第一篇 在WPF的window窗体中使用httpwebrequest实现模拟登陆网页,并在webbroser控件中显示
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- 用 c# 使用HttpWebRequest模拟登陆(带验证码)
- c# 使用 HttpWebRequest模拟登陆(附带验证码)
- 使用C#的HttpWebRequest模拟登陆网站
- C#如何HttpWebRequest模拟登陆,获取服务端返回Cookie以便登录请求后使用