Discuz教程网

检测本机是否登录了指定QQ账号

[复制链接]
authicon dly 发表于 2012-8-30 09:46:56 | 显示全部楼层 |阅读模式
有时候做程序,喜欢把程序的注册与用户QQ号码绑定,程序仅允许登录成功了指定QQ账号时才可使用,
为了实现这个目的,有人用API取QQ窗口、QQ托盘图标上的QQ账号,
但是这个方法写起来比较麻烦,如果用户有意玩玩的话,也可以自己在你软件获取之前先用API修改你要获取的目标信息!
还有一种方法就是内存读取,当然要找到一个QQ登录成功后存放QQ号码的地址,基址肯定是不存在的,再加之QQ更新频繁,
所以内存读取的办法也不太好,

为了实现这个目的,还有一种办法那就是利用QQ网页自身的功能,这种方法既方便又准确,下面就来说下原理:

打开: http://xui.ptlogin2.qq.com/cgi-bin/qlogin
我们会发现这也页面会自动获取我们的已登录的QQ信息,并可以实现快速登录,分析之:
关键的东西:
<script src="http://imgcache.qq.com/ptlogin/ac/v5/js/xui.js?v=1.2"></script>
通过分析这个js,我们找到如下2个重要的函数:

function ptui_qInit()  这个函数的作用是初始化SSOAxCtrlForPTLogin.SSOForPTLogin2对象,创建一个ActiveXObject对象
hummer_loaduin()     这个函数就是真正的通过 SSOAxCtrlForPTLogin这个COM来获取已登录QQ信息的,
到此,我们试着自己用程序来调用 SSOAxCtrlForPTLogin的com对象,但是发现失败,原因下面说,

既然不能自己调用 SSOAxCtrlForPTLogin对象,那先试试将页面保存为本地在打开看看什么情况,结果如下:
“快速登录失败,请您返回重试或切换到普通登录模式。”
很明显, SSOAxCtrlForPTLogin对象是要判断当前url的,如果url不是来自以下域名的都不能初始化成功:
var site=["qq.com","paipai.com","tencent.com","soso.com","taotao.com","tenpay.com","foxmail.com","wenwen.com","3366.com","imqq.com"];

好了,既然不能自己用本地页面,也不能自己写程序调用它的COM,那我们就直接来访问它获取它页面上已经获取好的信息吧:
同时附上已经格式好了的  xui.js代码,有兴趣的可以看看

  1. xui.js


  2. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->STR_QLOGIN=1;STR_QLOGIN_OTHER_ERR=2;STR_QLOGIN_SELECT_TIP=3;STR_QLOGIN_NO_UIN=4;STR_QLOGIN_SELECT_OFFLINE=5;STR_QLOGINING=6;

  3. function ptui_mapStr(B){
  4.     for(i=0;i<B.length;i++)
  5.     {
  6.         var A=document.getElementById(B[i][1]);
  7.         if(A!=null)
  8.         {
  9.             if("A"==A.nodeName||"U"==A.nodeName||"OPTION"==A.nodeName||"LABEL"==A.nodeName||"P"==A.nodeName)
  10.             {
  11.                 if(A.innerHTML=="")
  12.                 {
  13.                     A.innerHTML=ptui_str(B[i][0])
  14.                 }
  15.             }
  16.             else
  17.             {
  18.                 if("INPUT"==A.nodeName)
  19.                 {
  20.                     if(A.value=="")
  21.                     {
  22.                         A.value=ptui_str(B[i][0])
  23.                     }
  24.                 }
  25.                 else
  26.                 {
  27.                     if("IMG"==A.nodeName)
  28.                     {
  29.                         A.alt=ptui_str(B[i][0])
  30.                     }
  31.                 }
  32.             }
  33.         }
  34.     }
  35. }

  36. function ptui_str(A){
  37.     A-=1;
  38.     if(A>=0&&A<g_strArray.length)
  39.     {return g_strArray[A]}
  40.     return""
  41. }

  42. var g_labelMap=new Array([STR_QLOGIN,"loginbtn"],[STR_QLOGIN_SELECT_TIP,"qlogin_select_tip"]);

  43. ptui_mapStr(g_labelMap);

  44. function getArgs(){
  45.     var B=new Object();
  46.     var F=location.href.substring(location.href.indexOf("/qlogin?")+8);
  47.     var E=F.split("&");
  48.     for(var C=0;C<E.length;C++)
  49.     {
  50.         var G=E[C].indexOf("=");
  51.         if(G==-1)
  52.         {
  53.             continue
  54.         }
  55.         var A=E[C].substring(0,G);
  56.         var D=E[C].substring(G+1);
  57.         D=decodeURIComponent(D);
  58.         B[A]=D
  59.     }
  60.     return B
  61. }

  62. var params=getArgs();
  63. var g_qtarget=params.qtarget;
  64. var g_domain=params.domain;
  65. var g_jumpname=params.jumpname;
  66. var g_param=params.param;
  67. var site=["qq.com","paipai.com","tencent.com","soso.com","taotao.com","tenpay.com","foxmail.com","wenwen.com","3366.com","imqq.com"];
  68. var flag=false;
  69. for(var i=0;i<site.length;i++)
  70. {
  71.     if(site[i]==g_domain)
  72.     {flag=true}
  73. }
  74. if(!flag)
  75. {
  76.     g_domain="qq.com"
  77. }
  78. var q_bInit=false;
  79. var q_hummerQtrl=null;
  80. var g_vOptData=null;
  81. var q_aUinList=new Array();

  82. function ptui_qInit(){
  83.     if(q_bInit)
  84.     {return }
  85.     q_bInit=true;
  86.     if(!window.ActiveXObject)
  87.     {return }
  88.     try{
  89.         q_hummerQtrl=new ActiveXObject("SSOAxCtrlForPTLogin.SSOForPTLogin2");
  90.         var A=q_hummerQtrl.CreateTXSSOData();
  91.         q_hummerQtrl.InitSSOFPTCtrl(0,A);
  92.         g_vOptData=q_hummerQtrl.CreateTXSSOData();
  93.         hummer_loaduin();
  94.         if(q_aUinList.length<=0)
  95.         {
  96.             msg(ptui_str(STR_QLOGIN_NO_UIN));
  97.             return false
  98.         }
  99.         else
  100.         {
  101.             if(ptui_buildUinList)
  102.             {ptui_buildUinList(q_aUinList)}
  103.         }
  104.         document.cookie="ptui_qstatus=2;domain=ptlogin2."+g_domain
  105.     }
  106.     catch(B)
  107.     {
  108.         q_hummerQtrl=null;
  109.         document.cookie="ptui_qstatus=3;domain=ptlogin2."+g_domain;
  110.         msg(ptui_str(STR_QLOGIN_OTHER_ERR));
  111.         ptui_reportAttr(89217,true)
  112.     }
  113. }

  114. function list(){
  115.     q_bInit=false;
  116.     ptui_qInit();
  117.     xui_report()
  118. }

  119. function ptui_buildUinList(){
  120.     var G="";
  121.     var E=document.getElementById("list_uin");
  122.     if(null==E)
  123.     {return }
  124.     var A=q_aUinList.length>5?5:q_aUinList.length;
  125.     for(var C=0;C<A;C++)
  126.     {
  127.         var F=q_aUinList[C];
  128.         var B="";
  129.         var D="";
  130.         if(q_aUinList.length==1)
  131.         {D='style="display:none;"'}
  132.         if(C==0)
  133.         {B="checked='checked'"}
  134.         G+="<li><input type='radio' name='q_uin' id='uin_"+F.uin+"' "+B+D+" /><span>"+F.nick.replace(/&/g,"&amp").replace(/</g,"&lt").replace(/>/g,"&gt")+"&nbsp;("+F.name+")</span></li>"
  135.     }
  136.     E.innerHTML=G
  137. }


  138. function onQloginSelect(){
  139.     for(var C=0;C<q_aUinList.length;C++)
  140.     {
  141.         var D=q_aUinList[C];
  142.         var B=document.getElementById("uin_"+D.uin);
  143.         if(B!=null)
  144.         {
  145.             if(B.checked)
  146.             {
  147.                 hummer_loaduin();
  148.                 var A=hummer_getUinObj(D.uin);
  149.                 if(A==null)
  150.                 {
  151.                     msg(ptui_str(STR_QLOGIN_SELECT_OFFLINE),true);
  152.                     return
  153.                 }
  154.                 document.getElementById("qlogin_loading").innerHTML='<img src="http://imgcache.qq.com/ptlogin/v4/style/0/images/load.gif" align="absmiddle" />'+ptui_str(STR_QLOGINING);
  155.                 document.getElementById("loginbtn").className="btn_gray";
  156.                 document.getElementById("loginbtn").style.color="gray";
  157.                 hummer_login(A,g_domain,g_jumpname,g_param)
  158.             }
  159.         }
  160.     }
  161. }



  162. function hummer_loaduin(){
  163.     q_aUinList.length=0;
  164.     var P=q_hummerQtrl.DoOperation(1,g_vOptData);
  165.     if(null==P)
  166.     {  return }
  167.     try{
  168.         var M=P.GetArray("PTALIST");
  169.         var T=M.GetSize();
  170.         var O="";
  171.         var F=document.getElementById("list_uin");
  172.         for(var U=0;U<T;U++)
  173.         {
  174.             var C=M.GetData(U);
  175.             var R=C.GetDWord("dwSSO_Account_dwAccountUin");
  176.             var G="";
  177.             var J=C.GetByte("cSSO_Account_cAccountType");
  178.             var S=R;
  179.             if(J==1)
  180.             {
  181.                 try{
  182.                     G=C.GetArray("SSO_Account_AccountValueList");
  183.                     S=G.GetStr(0)
  184.                 }
  185.                 catch(Q)
  186.                 {}
  187.             }
  188.             var K=0;
  189.             try{
  190.                 K=C.GetWord("wSSO_Account_wFaceIndex")
  191.             }
  192.             catch(Q)
  193.             {K=0}
  194.             var L="";
  195.             try{
  196.                 L=C.GetStr("strSSO_Account_strNickName")
  197.             }
  198.             catch(Q)
  199.             {L=""}
  200.             var D=C.GetBuf("bufGTKey_PTLOGIN");
  201.             var E=C.GetBuf("bufST_PTLOGIN");
  202.             var I="";
  203.             var A=E.GetSize();
  204.             for(var N=0;N<A;N++)
  205.             {
  206.                 var B=E.GetAt(N).toString("16");
  207.                 if(B.length==1)
  208.                 {B="0"+B}
  209.                 I+=B
  210.             }
  211.             var H={uin:R,name:S,type:J,face:K,nick:L,key:I};
  212.             q_aUinList[U]=H
  213.         }
  214.         switch(q_aUinList.length)
  215.         {
  216.             case 0:ptui_reportAttr(77430,false);break;
  217.             case 1:ptui_reportAttr(77431,false);break;
  218.             default:ptui_reportAttr(77432,false)
  219.         }
  220.     }
  221.     catch(Q){}
  222. }


  223. function hummer_getUinObj(B){
  224.     for(var A=0;A<q_aUinList.length;A++)
  225.     {
  226.         var C=q_aUinList[A];
  227.         if(C.uin==B)
  228.         {return C}
  229.     }
  230.     return null
  231. }


  232. function unloadpage(){
  233.     document.domain=g_domain;
  234.     try{
  235.         parent.document.body.onbeforeunload=function(){};
  236.         parent.document.body.onunload=function(){};
  237.         for(var A=0;A<parent.parent.frames.length;A++)
  238.         {
  239.             parent.parent.frames[A].onunload=function(){};
  240.             parent.parent.frames[A].onbeforeunload=function(){}
  241.         }
  242.         if(parent.parent!=top)
  243.         {
  244.             for(var A=0;A<parent.parent.parent.frames.length;A++)
  245.             {
  246.                 parent.parent.parent.frames[A].onunload=function(){};
  247.                 parent.parent.parent.frames[A].onbeforeunload=function(){}
  248.             }
  249.         }
  250.     }
  251.     catch(B){}
  252. }


  253. function hummer_login(E,D,A,F){
  254.     if(A=="")
  255.     {A="jump"}
  256.     var C="http://ptlogin2."+D+"/"+A+"?clientuin="+E.uin+"&clientkey="+E.key+"&keyindex=9";
  257.     if(F!=null&&F!="")
  258.     {
  259.         var B=decodeURIComponent(F);
  260.         if(B.indexOf("#")>-1)
  261.         {
  262.             B=B.replace(/#/g,"%23")
  263.         }
  264.         C+=("&"+B)
  265.     }
  266.     switch(parseInt(g_qtarget))
  267.     {
  268.         case 0:unloadpage();parent.location.href=C;break;
  269.         case 1:top.location.href=C;break;
  270.         case 2:unloadpage();parent.parent.location.href=C;break;
  271.         default:top.location.href=C
  272.     }
  273. }


  274. function msg(A){
  275.     try{
  276.         var C=document.getElementById("qlogin_loading");
  277.         if((C.style.display!="none")&&(document.getElementById("qlogin").style.display!="none"))
  278.         {
  279.             C.innerHTML='<span style="color:#cc0000;">'+A+"</span>";C.style.display=""
  280.         }
  281.     }
  282.     catch(B){}
  283. }

  284. function xui_report(B){
  285.     if(Math.random()>0.001)
  286.     {return }
  287.     var A=new Date();
  288.     var C=location.hash.substr(1,location.hash.length);
  289.     url="http://isdspeed.qq.com/cgi-bin/r.cgi?flag1=6000&flag2=1&flag3=2&1="+(A-C)+"&2="+(A-time1);
  290.     imgTime=new Image();
  291.     imgTime.src=url
  292. }

  293. function ptui_reportAttr(C,B){
  294.     if((B==false)&&(Math.random()>0.001))
  295.     {return }
  296.     url="http://ui.ptlogin2."+g_domain+"/cgi-bin/report?id="+C;
  297.     var A=new Image();
  298.     A.src=url
  299. }

  300. list();/*  |xGv00|0d5165981e8a571e21b5c15cc81a9130 */
复制代码
接着我们来直接实现程序吧,代码如下
  1. CheckLoginedQQ


  2. Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->using System;
  3. using System.Windows.Forms;
  4. namespace CheckLoginedQQ
  5. {
  6. public class Checker
  7. {

  8. public Checker()
  9. {

  10. }
  11. private HtmlDocument Document;
  12. /// <summary>
  13. /// 初始化
  14. /// </summary>
  15. /// <returns></returns>
  16. public bool Initialize()
  17. {
  18. WebBrowser browser = new WebBrowser();
  19. browser.Url = new Uri("http://xui.ptlogin2.qq.com/cgi-bin/qlogin");
  20. while (browser.ReadyState!=WebBrowserReadyState.Complete)
  21. {
  22. Application.DoEvents();
  23. }
  24. if (browser.Document.Url.AbsoluteUri == "http://xui.ptlogin2.qq.com/cgi-bin/qlogin")
  25. {
  26. Document = browser.Document;
  27. return true;
  28. }
  29. return false;
  30. }
  31. /// <summary>
  32. /// 检测登陆账号
  33. /// </summary>
  34. /// <param name="uin"></param>
  35. /// <returns></returns>
  36. public bool QQisLogined(string uin)
  37. {
  38. HtmlElementCollection elements=Document.GetElementsByTagName("input");
  39. foreach(HtmlElement element in elements)
  40. {
  41. string type = element.GetAttribute("type");
  42. if (type != "radio")
  43. continue;
  44. string name = element.GetAttribute("name");
  45. if (name != "q_uin")
  46. continue;
  47. string id = element.GetAttribute("id");
  48. if (id == "uin_" + uin)
  49. {
  50. return true;
  51. }
  52. }
  53. return false;
  54. }
  55. }
  56. }
复制代码

首先用Webbrowser控件访问,http://xui.ptlogin2.qq.com/cgi-bin/qlogin
通过ReadState属性判断页面是否加载完成
通过Document.url判断加载时候为http://xui.ptlogin2.qq.com/cgi-bin/qlogin页面
然后返回真或假

Initialize() == true 之后通过Webbrowser.Document来获取页面上的QQ信息,具体实现看代码!

好了,基本就是这样了,不过要注意的一点是Webbrowser是不能跨线程实例化的,因为他是一个基于COM的控件,所以必须使用 [STAThread] 管理线程
使用示例如下:
  1. [STAThread]
  2.         static void Main(string[] args)
  3.         {


  4.             CheckLoginedQQ.Checker checker = new CheckLoginedQQ.Checker();
  5.             if (checker.Initialize())
  6.             {
  7.                 if(checker.QQisLogined("110001"));
  8.                   C**ole.Write("Logined");
  9.                else
  10.                    C**ole.Write("Not Logined");
  11.              }
  12.              else
  13.             {
  14.                    C**ole.Write("un Initialize");  
  15.              }
  16.         }

复制代码

from:http://www.cnblogs.com/cxwx/archive/2010/07/01/1768957.html

WEB检测QQ登录状态机制分析
https://www.discuz.1314study.com/thread-76644-1-1.html

腾讯互动服务-生成临时会话
https://www.discuz.1314study.com/thread-76639-1-1.html



上一篇:WEB检测QQ登录状态机制分析
下一篇:[1314]Discuz X 贴内用户名长度控制插件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

1314学习网 ( 浙ICP备10214163号 )

GMT+8, 2024-4-26 03:25

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表