注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

@fc_lamp

关注Web应用解决方案MySql/PHP/Python一盏名为"飞川"的灯~

 
 
 

日志

 
 

简单说说QQ是如何实现快速登录的?(application/nptxsso)  

2013-11-28 17:29:56|  分类: Web技术-应用研究 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 简单说说QQ是如何实现快速登录的?(application/nptxsso) - fc_lamp - @fc_lamp
一 准备
  在开始之前我们先要谈谈浏览器如何启动应用程序的,也就是 MIME(多用途互联网邮件扩展类型) 。MIME是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动使用指定应用程序(插件)来打开。
不过,不同浏览器对这些插件对象的处理的方式不一样:像IE浏览器使用ActiveX控件,而firefox、chrome等使用Netscape方式的插件。
对于Netscape浏览器(chrome、firefox) 我们可以使用javascript的 navigator 或 Plugin 对象的 mimeTypes 数组来访问这些插件对象:

navigator.mimeTypes["application/x-shockwave-flash"].type //值为 application/x-shockwave-flash

(参:http://www.itlearner.com/code/js_ref/brow2.htm)

navigator.mimeTypes 可以打印出浏览器支持的所有插件,下图是正则QQ快速登录的插件:

简单说说QQ是如何实现快速登录的?(application/nptxsso) - fc_lamp - @fc_lamp
 


如果是IE,我们使用ActiveX控件,使用:

newObj = new ActiveXObject( servername.typename[, location])
ActiveXObject 对象语法有这些部分:其中newObj是必选项。要赋值为 ActiveXObject 的变量名。
servername是必选项。提供该对象的应用程序的名称。
typename是必选项。要创建的对象的类型或类。
location是可选项。创建该对象的网络服务器的名称。
切记:ActiveX是微软的东西,故而这玩意儿只有IE才支持!

(参:http://www.jsann.com/post/activexobject_in_javascript.html)

QQ的ActiveX控件DLL文件在:

简单说说QQ是如何实现快速登录的?(application/nptxsso) - fc_lamp - @fc_lamp
 



三 代码
 最核心的检测代码在这里 http://imgcache.qq.com/ptlogin/ver/10053/js/xui.js?v=10007  ,我们从中解出最核心的function:
(注以下:只copy了几处最核心的代码块)


var pt = {
ishttps: false,
low_login: 0,
keyindex: 9,
init: function() {
pt.ishttps = /^https/.test(window.location);
if (navigator.mimeTypes["application/nptxsso"]) {//使用embed标签创建插件对象(firefox等)
var B = document.createElement("embed");
B.type = "application/nptxsso";
B.style.width = "0px";
B.style.height = "0px";
document.body.appendChild(B);
pt.sso = B
}
},
};
pt.init();


function ptui_qInit() {
if (window.ActiveXObject) { //使用ActiveXObject 控件对象 (IE)
q_hummerQtrl = new ActiveXObject("SSOAxCtrlForPTLogin.SSOForPTLogin2");
var A = q_hummerQtrl.CreateTXSSOData();
q_hummerQtrl.InitSSOFPTCtrl(0, A);
g_vOptData = q_hummerQtrl.CreateTXSSOData()
} else {}
hummer_loaduin();
}

function hummer_loaduin() {
q_aUinList.length = 0;
if (window.ActiveXObject) { //如果IE浏览器,则使用ActiveX
var Y = q_hummerQtrl.DoOperation(1, g_vOptData);
if (null == Y) {
return
}
try {
var T = Y.GetArray("PTALIST");
var c = T.GetSize();
var X = "";
var H = $("list_uin");
for (var d = 0; d < c; d++) {
var E = T.GetData(d);
var a = E.GetDWord("dwSSO_Account_dwAccountUin");
var J = "";
var O = E.GetByte("cSSO_Account_cAccountType");
var b = a;
if (O == 1) {
try {
J = E.GetArray("SSO_Account_AccountValueList");
b = J.GetStr(0)
} catch (Z) {}
}
var Q = 0;
try {
Q = E.GetWord("wSSO_Account_wFaceIndex")
} catch (Z) {
Q = 0
}
var S = "";
try {
S = E.GetStr("strSSO_Account_strNickName")
} catch (Z) {
S = ""
}
var F = E.GetBuf("bufGTKey_PTLOGIN");
var G = E.GetBuf("bufST_PTLOGIN");
var N = "";
var A = G.GetSize();
for (var W = 0; W < A; W++) {
var B = G.GetAt(W).toString("16");
if (B.length == 1) {
B = "0" + B
}
N += B
}
var M = {
uin: a,
name: b,
type: O,
face: Q,
nick: S,
key: N
};
q_aUinList[d] = M
}
} catch (Z) {}
} else {

//如果是非IE
try {

var M = pt.sso;
var L = M.InitPVA();
if (L != false) {
var I = M.GetPVACount();
for (var W = 0; W < I; W++) {
var C = M.GetUin(W);//QQ号
var D = M.GetAccountName(W);//账号
var K = M.GetFaceIndex(W);
var U = M.GetNickname(W);//昵称
var P = M.GetGender(W);
var V = M.GetUinFlag(W);
var f = M.GetGTKey(W);
var R = M.GetST(W);
q_aUinList[W] = {
uin: C,
name: D,
type: 0,
face: K,
nick: U,
key: R
}
}
if (typeof(M.GetKeyIndex) == "function") {
pt.keyindex = M.GetKeyIndex()
}
}
} catch (Z) {}
}
switch (q_aUinList.length) {

}
}

  评论这张
 
阅读(1223)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017