因为需要针对腾讯微博编写爬虫,所以第一步肯定要登陆到微博上.腾讯提供的api接口.无奈接口的显示条件太多.所以就想模拟用户的登陆来进入页面.过程还是蛮好玩的.腾讯在登陆过程中用了多次随机加密,,多次跳转.不过最终还是成功的进入了.
写下模拟登陆的过程…
第一次发帖.希望大家多多指教啊…

打开抓包工具,进入登陆页面. http://ui.ptlogin2.qq.com/login_weibo.html发现下载了

http://ui.ptlogin2.qq.com/login_t.js
http://xui.ptlogin2.qq.com/wb/qlogin_t.html?v=10060201
http://ui.ptlogin2.qq.com/js/v.js?r=0.42120279716782455
http://ui.ptlogin2.qq.com/clearcache.html
http://ui.ptlogin2.qq.com/login_weibo.html
http://imgcache.qq.com/ptlogin/ac/v6/js/qlogin_t.js?v=1.1
2秒后又请求了
http://ptlogin2.qq.com/check?uin=>账号<&appid=46000101&r=0.5011474802941705

不管html页面 只看js的话.

http://ui.ptlogin2.qq.com/login_t.js 返回的是一个js
http://imgcache.qq.com/ptlogin/ac/v6/js/qlogin_t.js?v=1.1 返回的是  ptuiV(10062901);
http://ptlogin2.qq.com/check?uin=>账号<&appid=46000101&r=0.5011474802941705
返回的是类似ptui_checkVC('0','!2HV');的信息


估计这三个地方比较重要..,而http://ptlogin2.qq.com/check?uin=>账号<&appid=46000101&r=0.5011474802941705为后请求 应该在js中有调用

搜索下js的源码.
 
var B="http://ptlogin2."+g_domain+"/check?uin="+C+"&appid="+D+"&r="+Math.random();

可得知.r为随机数.而appid为46000101,固定值.uin为账号.而返回的ptui_checkVC('0','!2HV');则是调用ptui_checkVC函数.进行分析.得知.
 
是将返回值复制给页面的一个id为verifyinput隐藏域.用来在提交登陆的时候传值.

登陆.抓包可得.请求方式为GET.完整的URL如下
http://ptlogin2.qq.com/login?u=>账号<&p=F444E63B35E61AD95EA590E0CE11234B&verifycode=!LTK&aid=46000101&u1=http%3A%2F%2Ft.qq.com&h=1&from_ui=1&fp=loginerroralert

通过页面源码可知.

U为用户名
P为密码.加密后
Verifycode为刚才获取的值
Aid为固定值
u1=http%3A%2F%2Ft.qq.com&h=1&from_ui=1&fp=loginerroralert未知,

再次抓包
http://ptlogin2.qq.com/login?u=>账号<&p=2A330E728720E2173197330E202A6642&verifycode=!K2O&aid=46000101&u1=http%3A%2F%2Ft.qq.com&h=1&from_ui=1&fp=loginerroralert

发现.
P 和Verifycode和上次不同.其他值不变.暂时不管.而Verifycode我们已经知道是怎么来的了重点关注P

分析页面源码,发现在登录时  实际上市调用了ptui_checkValidate这个函数而该函数又调用了ajax_Submit.这个函数.

if(E[A].name=="p"){
var F="";F+=E.verifycode.value;
F=F.toUpperCase();
B+=md5(md5_3(E.p.value)+F)
 

简单看下 可以得知p是由MD5_3的密码加密后再和验证串联后再次加密获得..继续跟进.
可以得知腾讯的加密方式还是很复杂的..共有
md5_3
md5
hex_md5
str_md5
core_md5
md5_cmn
md5_ff
md5_gg
md5_hh
md5_ii
safe_add
bit_rol
str2binl
binl2str
binl2hex
等函数.不用仔细看了 直接转成JAVA来测试一下吧.
返回 ptuiCB('0','0','http://t.qq.com','0','登录成功!');
返回登录成功.但是这时还不能进入个人的主页.而且看着还像是函数.难道还是再次执行.在js文件中查找 果然…
 
if(C!=""||D==0){
 var A=new Date();
 A.setHours(A.getHours()+24*30);
 document.cookie="ptui_loginuin2="+escape(f_u.value)+";expires ="+A.toGMTString()+";domain =ui.ptlogin2.qq.com";
 top.location.href=C;return 
}
 

 
发现为设置cookie.既然是设置cookie.我们就抓包来看
请求


登陆请求

Cookie: pt2gguin=o0>账号<; pgv_pvid=8173925820; pgv_flv=10.0; pgv_r_cookie=1162840646389; o_cookie=>账号<; ac=1,009,008; uin=o0>账号<; skey=@rAt7FjYfB; ptisp=ctc; pgv_info=ssid=s9544862000; ptcz=8212ca17ace4b736761ff883f0b20a6bf77dcdcc52fee257377f143723b3ce5c; ptui_qstatus=1; ptvfsession=71c028e3b65b11ea1c3be3c00c7f8e0b74d39b3e8b6ab5f9b21a6899c1bc979c54b80640181bb90170196609ba4f5382; ptuserinfo=e29982e58fb3e7bebd

 
登陆返回

Set-Cookie: pt2gguin=o0>账号<; EXPIRES=Fri, 02-Jan-2020 00:00:00 GMT; PATH=/; DOMAIN=qq.com;
Set-Cookie: uin=o0XXXXXXX; PATH=/; DOMAIN=qq.com;
Set-Cookie: skey=@rAt7FjYfB; PATH=/; DOMAIN=qq.com;
Set-Cookie: clientuin=; EXPIRES=Fri, 02-Jan-1970 00:00:00 GMT; PATH=/; DOMAIN=qq.com;
Set-Cookie: clientkey=; EXPIRES=Fri, 02-Jan-1970 00:00:00 GMT; PATH=/; DOMAIN=qq.com;
Set-Cookie: zzpaneluin=; EXPIRES=Fri, 02-Jan-1970 00:00:00 GMT; PATH=/; DOMAIN=qq.com;
Set-Cookie: zzpanelkey=; EXPIRES=Fri, 02-Jan-1970 00:00:00 GMT; PATH=/; DOMAIN=qq.com;
Set-Cookie: ptisp=ctc; PATH=/; DOMAIN=qq.com;
Set-Cookie: ptuserinfo=e29982e58fb3e7bebd; PATH=/; DOMAIN=ptlogin2.qq.com;

 

跳转请求
 
Cookie: uin=o0>账号<; skey=@rAt7FjYfB; ptisp=ctc; pgv_info=ssid=s3593389632; pt2gguin=o0XXXXXXX; mb_reg_from=8

有几个字段不一样.是从请求头中新返回的..设置进去..

..登陆成功,进入主页.至此 就通过程序模拟用户的登陆,并成功的绕做了腾讯的OAUTH验证..