您的位置:首页 > 理论基础 > 计算机网络

使用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的相关使用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: