C#使用ImitateLogin模拟登录百度

 更新时间:2015年12月04日 10:57:42   作者:Carey Tzou  
这篇文章主要介绍了C#使用ImitateLogin模拟登录百度 的相关资料,需要的朋友可以参考下

在之前的文章中,我已经介绍过一个社交网站模拟登录的类库:imitate-login ,这是一个通过c#的HttpWebRequest来模拟网站登录的库,之前实现了微博网页版和微博Wap版;现在,模拟百度登录的部分也已经完成。由于个人时间的限制,加上目前有多个项目在同时进行,因此更新频率会根据项目关注度来决定(Star & fork)。

这个类库的使用方法非常简单,仅对外提供一个方法:

LoginResult Login(1: string userName, 2: string password, 3: LoginSite loginSite); 

这个方法位于ImitateLogin的LoginHelper类中,使用之前需要先对其进行实例化。通过传入 用户名、密码以及登录的网站,返回一个包含登录结果状态、描述信息和Cookies字典的类。它通过 Thrift 来实现多语言的支持。

下面将通过介绍模拟百度登录的实现来介绍如何进行扩充与二次开发:

首先,创建百度登录类 BaiduLogin.cs 继承 ILogin 接口;实现其生成的 DoLogin 方法。

#region ILogin implementation
public LoginResult DoLogin(string UserName, string Password)
{
  throw new NotImplementedException();
}
public CookieContainer cookies { set; get;}
#endregion 

然后我们通过监听百度登录过程中的网络请求,梳理出修改过Cookies和最终提交登录所需的参数的请求。

Step1: 访问以下链接生成初始Cookies:

HttpHelper.GetHttpContent("https://passport.baidu.com/passApi/html/_blank.html", cookies: cookies, cookiesDomain: "passport.baidu.com");

Step2: 获取最终登录提交所需的token:

//1. Get the token.
string token_url = string.Format("https://passport.baidu.com/v2/api/?getapi&tpl=mn&apiver=v3&tt={0}&class=login&gid={1}&logintype=dialogLogin&callback=bd__cbs__{2}", TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), build_callback());
string prepareContent = HttpHelper.GetHttpContent(token_url, null, cookies, referer: "https://www.baidu.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.baidu.com");
//string prepareJson = prepareContent.Split('(')[1].Split(')')[0];
dynamic prepareJson = JsonConvert.DeserializeObject(prepareContent.Split('(')[1].Split(')')[0]);
string token = prepareJson.data.token; 

其中 build_callback 为随机生成6位字母或数字的组合的方法。

Step3: 获取用于加密密码的publickey:

//2. Get public key
string pubkey_url = "https://passport.baidu.com/v2/getpublickey?token={0}&tpl=mn&apiver=v3&tt={1}&gid={2}&callback=bd__cbs__{3}";
string pubkeyContent = HttpHelper.GetHttpContent(string.Format(pubkey_url, token, TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), build_callback()), null, cookies, referer: "https://www.baidu.com/", encode: Encoding.GetEncoding("GB2312"), cookiesDomain: "passport.baidu.com");
dynamic pubkeyJson = JsonConvert.DeserializeObject(pubkeyContent.Split('(')[1].Split(')')[0]);
rsa_pub_baidu = pubkeyJson.pubkey;
string KEY = pubkeyJson.key; 

stopwatch 是一个记录从最初执行到最终提交之前的耗时的一个计时器,get_pwa_rsa 为加密密码的方法。

Step4: 模拟执行最终的登录:

//3. Build post data
string login_data = "staticpage=https%3A%2F%2Fwww.baidu.com%2Fcache%2Fuser%2Fhtml%2Fv3Jump.html&charset=UTF-8&token={0}&tpl=mn&subpro=&apiver=v3&tt={1}&codestring=&safeflg=0&u=https%3A%2F%2Fwww.baidu.com%2F&isPhone=&detect=1&gid={2}&quick_user=0&logintype=dialogLogin&logLoginType=pc_loginDialog&idc=&loginmerge=true&splogin=rate&username={3}&password={4}&verifycode=&mem_pass=on&rsakey={5}&crypttype=12&ppui_logintime={6}&countrycode=&callback=parent.bd__pcbs__{7}";
login_data = string.Format(login_data, token, TimeHelper.ConvertDateTimeInt(DateTime.Now), Guid.NewGuid().ToString().ToUpper(), HttpUtility.UrlEncode(UserName), HttpUtility.UrlEncode(get_pwa_rsa(Password)), HttpUtility.UrlEncode(KEY), stopwatch.ElapsedMilliseconds, build_callback());
//4. Post the login data
string login_url = "https://passport.baidu.com/v2/api/?login";
HttpHelper.GetHttpContent(login_url, login_data, cookies, referer: "https://www.baidu.com/", cookiesDomain: "passport.baidu.com"); 

Step5:验证最终的登录结果:

string home_url = "https://www.baidu.com";
string result = HttpHelper.GetHttpContent(home_url, cookies: cookies, cookiesDomain: "passport.baidu.com");
//5. Verifty the login result
if (string.IsNullOrWhiteSpace(result) || result.Contains("账号存在异常") || !result.Contains("bds.comm.user=\""))
{
  return new LoginResult() { Result = ResultType.AccounntLimit, Msg = "Fail, Msg: Login fail! Maybe you account is disable or captcha is needed." };
}

Step6:创建返回结果类:

LoginResult loginResult = new LoginResult() { Result = ResultType.Success, Msg = "Success", Cookies = HttpHelper.GetAllCookies(cookies) }; 

至此,模拟登录部分的代码就完成了,为了能够被其它程序调用,你还需要在 LoginSite 的枚举中新增一条来标识这个登录方法,此处增加了一个 Baidu = 5,并设置 [Description(“Baidu”)]。

然后在 LoginHelper.cs 的 Login 方法中的 switch (loginSite) 里增加一个 case:

case LoginSite.Baidu:
  LoginClass = new BaiduLogin ();
  break;

以上内容是脚本之家小编给大家介绍的C#使用ImitateLogin模拟登录百度的全部叙述,希望大家喜欢。

相关文章

  • C#中单例的实现方法

    C#中单例的实现方法

    这篇文章主要介绍了C#中单例的实现方法,以实例形式分析了C#中单例的原理与实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-01-01
  • WinForm防止程序重复运行的方法分析

    WinForm防止程序重复运行的方法分析

    这篇文章主要介绍了WinForm防止程序重复运行的方法,通过记录窗口句柄实现防止WinForm程序重复运行的功能,需要的朋友可以参考下
    2017-05-05
  • 使用C#验证PDF数字签名有效性的方法示例

    使用C#验证PDF数字签名有效性的方法示例

    数字签名作为PDF文档中的重要安全机制,不仅能够验证文件的来源,还能确保文件内容在传输过程中未被篡改,本文将详细介绍如何使用免费.NET控件通过C#验证PDF签名的有效性以及验证PDF文档是否被修改,需要的朋友可以参考下
    2024-07-07
  • C#使用iTextSharp添加PDF水印

    C#使用iTextSharp添加PDF水印

    这篇文章主要为大家详细介绍了C#使用iTextSharp添加PDF水印的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • c# 基于任务的异步编程模式(TAP)的异常处理

    c# 基于任务的异步编程模式(TAP)的异常处理

    这篇文章主要介绍了c# 基于任务的异步编程模式的异常处理方法,帮助大家更好的理解和学习c#
    2020-11-11
  • c# 获取CookieContainer的所有cookies函数代码

    c# 获取CookieContainer的所有cookies函数代码

    这篇文章主要介绍了c# 获取CookieContainer所有cookies的函数代码,需要的朋友可以参考下
    2013-06-06
  • C#进行文件读写、创建、复制、移动、删除的方法

    C#进行文件读写、创建、复制、移动、删除的方法

    这篇文章主要介绍了C#进行文件读写、创建、复制、移动、删除的方法,涉及C#针对文件操作的常用技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • C#字符串与正则表达式的图文详解

    C#字符串与正则表达式的图文详解

    正则表达式是个非常好的工具,它的作用主要是用简单的有规则的表达式来检索和匹配一段字符串,这篇文章主要给大家介绍了关于C#字符串与正则表达式的相关资料,需要的朋友可以参考下
    2022-09-09
  • VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软提供的呢
    2016-12-12
  • C#控制台模拟电梯工作原理

    C#控制台模拟电梯工作原理

    简单的模拟一下电梯的运行,电梯内部和外部楼层呼叫的优先级判断。以前学硬件的时候做这个不成问题,现在用软件来模拟对我来说比较难,要C#的图形界面。求高手赐教。
    2015-06-06

最新评论