在之前的文章中,我已经介绍过一个社交网站模拟登录的类库: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;

本文来自 The NewIdea,作者 Carey Tzou 。好了,大功告成!Todo List中还有淘宝、QQ、Facebook、Twitter、Google要做呢,我还想加入GitHub、Wechat…
现在,你可以帮我了吗?

首发地址:http://www.tnidea.com/login-baidu-throught-imitate-login.html
未经授权,拒绝任何全文及摘要转载!

转载于:https://www.cnblogs.com/NewIdea/p/login-baidu-throught-imitate-login.html

使用ImitateLogin模拟登录百度相关推荐

  1. curl php 百度,phpcurl模拟登录百度首页

    代码如下: */$post_fields = array();$post_fields = preg_data($contents,'aid',$post_fields);$post_fields = ...

  2. curl php 百度,php curl 模拟登录百度主页

    php curl 模拟登录百度首页 本帖最后由 STONEWP 于 2012-03-29 13:43:04 编辑 代码如下: $url = "https://passport.baidu.c ...

  3. selenium与python自动化测试模拟登录百度

    将一些必须必要条件准备好 1,安装chorme浏览器 1,安装依赖 sudo apt-get install libxss1 libappindicator1 libindicator7 2,下载go ...

  4. pyhon3模拟登录百度(2)—— 使用IE11理清百度登录内部逻辑和分析请求发送数据

    依照思路来,第一步就是难点和重点,搞清楚了网页登录的内部逻辑,才能进行下一步的模拟登录. 这里,我的浏览器是IE11.因为已经看了一篇手把手教学分析登录逻辑的文章,所以这里写的要节省多了. 通过分析发 ...

  5. python123练习题文库_python模拟登录百度文库后如何点击马上签到

    这是登录的代码: #-*- coding: UTF-8 -*- import HTMLParser import urlparse import urllib import urllib2 impor ...

  6. java模拟登录百度_模拟登陆百度的Java实现

    常常需要爬取百度统计出来的数据,难免要进行百度的模拟登陆!现将程序贴出来,供他人也供自己以后使用: ? ? package org.baidu; import java.util.List; impo ...

  7. 手把手教你----模拟登录百度首页

    目标网站:百度首页 目标网址:https://www.baidu.com/ 任务要求: (1)导入selenium库,并使用该库驱动Chrom浏览器,完成请求: 测试selenium是否成功 from ...

  8. python登录代码思路_终于找到一个思路比较清晰的可以模拟登录百度的代码!

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 转自:http://outofmemory.cn/code-snippet/11595/ # -*- coding: utf8 -*-import url ...

  9. selenium模拟登录百度指数

    java main WebDriver driver = new FirefoxDriver();driver.manage().window().maximize();driver.get(&quo ...

最新文章

  1. manifest文件
  2. zblog php 当前位置,zblogphp导航当前页突出显示的方法
  3. hibernate一对一外键单向关联
  4. #Pragma Pack(n)与内存分配 pragma pack(push,1)与#pragma pack(1)的区别
  5. js 节点 选中ztree_zTree使用
  6. android elf 加固_android so加固之section加密
  7. 详实!DevOps 最新现状研究报告解读 | 原力计划
  8. 健康窈窕美女第一课 减肥vs早餐四个关键问题。
  9. python爬虫淘宝评论_Python爬虫,抓取淘宝商品评论内容
  10. 服务器系统小米随身wifi,Mac OS10.13正常使用的小米随身WIFI无线驱动 | 陳松's 博客...
  11. 安装程序 Repack 攻略 之 CAB 篇
  12. 微信开发者工具登录二维码不显示
  13. 用Python+HTML做的点名器
  14. 闲聊flask web编程中的cookie
  15. 【bzoj4146】 [AMPPZ2014]Divisors
  16. Flask开发微电影网站(六)
  17. 常见排序算法(C语言实现)
  18. 03 数据分析之分布分析
  19. 机锋2012第一季度移动APP支付数据解析
  20. 你的电竞快感它的专属缔造 这款蓝牙音箱有型又有范儿

热门文章

  1. java postdelayed_Android开发使用Handler的PostDelayed方法实现图片轮播功能
  2. samba 实现不同操作系统之间的文件共享
  3. LeetCode 744. Find Smallest Letter Greater Than Target (时间复杂度O(n))
  4. SSH连接两台虚拟机、秘钥免密登录
  5. 使用代理下载android系统源码和SDK
  6. 从一百篇文章中总结出的需求分析四步法
  7. 浅谈C/C++中的typedef和#define
  8. Codeforces Round #506 (Div. 3) - E. Tree with Small Distances
  9. A-ID and password
  10. 2021华宁三五班高考成绩查询,2021娄底市地区高考成绩排名查询