转载:http://www.liyongyue.com/?p=103

前段时间朋友需要实现新浪微博爬虫,我也顺便研究了一下新浪微博的模拟登录过程。下面就简单的描述一下吧。

其实开始朋友说起让我一块看看这个模拟登录时我是拒绝的,因为你不能说让我做,我马上就去做,第一我要看一下,因为我不愿意看完之后加一些特技上去,程序“咣”一下,很快、很流畅,这样观众出来一定会骂我,因为没有这么简单的程序,就证明上面的效果是假的。后来我也经过证实这个确实可以实现,我看了大概一天左右,感觉还不错,后来我在弄得时候也要求不要加特技,我写出来是这个样子,你们写出来也会是这个样子!-。-

首先先说明一点,新浪微博出于用户的安全考虑,当用户在设置的安全地点之外登录时,必须要输入验证码,因为个人还没有能力自动识别验证码,所以我只能先在新浪微博帐号中把当前城市添加进安全地点了。但是,令我纳闷的是当我添加进安全地点之后还是发现要输入验证码!!!偶然看到新浪微博的安全提示,为什么我一会在安徽登录一会又在浙江登录? 突然明白了。。我用的宽带不知道房东从哪里接的。。。应该是代理运营商的,所以没有办法,只能用了一个代理。。。

好了,闲篇扯多了,下面进入正题。

要实现模拟登录的功能,首先必须要分析在登录过程中浏览器做了哪些事情,我用的是firefox浏览器中的firebug插件来分析的。
HTTPS登录:
1.向”https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=时间戳”发送Post请求,参数为
cdult:3
su:用户名的base64编码
sr:系统分辨率
sp:用户密码
domain:sina.com.cn 新浪的域名
encoding:utf-8 编码方式
entry:sso 入口方式
from:null
gateway:1 按名称理解为网关
pagerefer:”” 从哪个页面跳转过去的
prelt:0 prelogin获取的时间,https方式不会进行prelogin操作,所以为0
savestate:30 登录页面中是否选择了保存密码
useticket:0
vsnf:0
returntype:text 返回类型
service:sso
2.依次访问post之后服务器返回的内容中的三个crossdomainlist中的三个URL,会获取相应的cookie
3.访问weibo.com,登录成功

分析过程:
1:清空浏览器cache,打开Firebug,打开登录页面http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)
2.切换到到firebug中的网络一栏,把保持设为选中状态,如果不选,当页面跳转时候,以前的网络请求会不再显示
3.输入用户名密码,选中安全登录以https方式登录
4.在firebug中的网络栏,点击清空,这样是为了清空之前所有的网络请求的记录,因为我们只关心点击登录的时候浏览器发送了哪些HTTP请求
5.点击登录,我们可以看到在登陆过程中浏览器发送了哪些网络请求
post https://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)&_=1429864538934
(1)参数我们之前已经介绍了,它的返回内容为:
{“retcode”:”0″,”uid”:”这里是你的微博ID”,”nick”:”这里是你的微博名称”,”crossDomainUrlList”:[“https:\/\/passport.weibo.com\/wbsso\/login?ticket=ST-MjQzODcyMDczNA%3D%3D-1429864544-gz-2D235951962A80917C9791C58AD868A5&ssosavestate=1461400544″,”https:\/\/crosdom.weicaifu.com\/sso\/crosdom?action=login&savestate=1461400544″,”http:\/\/passport.weibo.cn\/sso\/crossdomain?action=login&savestate=1″]}
crossdomainUrlList为服务器告诉你下面你要去什么地方访问一下
(2)访问这三个url,在这三次请求的响应头里面都有set-cookie,这是我们登录所需要的cookie
登录成功!

其中的Post请求,分析步骤为:
1.首先也是加载http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.4.15)
2.打开firebug,找到脚本栏,脚本栏有两个选择栏,一是“所有”可以选择显示静态脚本或者动态脚本,在它旁边就是选择脚本文件了,我们选择signin.php?entry=sso ,这是登录页面中的脚本,我们可以找到login(),这是负责登录的函数,在这个函数下断点
3.在页面上输入用户名密码,然后点击登录按钮,程序会在断点停下,然后单步运行就好了。。。有兴趣的可以分析一下

PS:注意,当单步进入到ssologin.js后,你会发现所有的js代码都是在一行中,没有换行,这是服务器把代码进行压缩了,减少传输浪费,我们可以点击脚本栏的{}符号,浏览器会自动帮我们把程序换行…

http登录后面有时间的话会进行分析,与HTTPS的不同是,它会先进行prelogin、获取到rsa加密的key之后,对密码进行rsa加密,然后向页面post请求,具体的分析方法跟https类似

如有引用请注明引用地址:http://www.liyongyue.com/新浪微博模拟登录-https方式/