检测本机是否登录了指定QQ账号
作者:admin 日期:2010-07-02
From:原文地址
有时候做程序,喜欢把程序的注册与用户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代码,有兴趣的可以看看
xui.js:下载下载
接着我们来直接实现程序吧,代码如下:
using System;
using System.Windows.Forms;
namespace CheckLoginedQQ
{
public class Checker
{
public Checker()
{
}
private HtmlDocument Document;
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public bool Initialize()
{
WebBrowser browser = new WebBrowser();
browser.Url = new Uri("http://xui.ptlogin2.qq.com/cgi-bin/qlogin");
while (browser.ReadyState!=WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
if (browser.Document.Url.AbsoluteUri == "http://xui.ptlogin2.qq.com/cgi-bin/qlogin")
{
Document = browser.Document;
return true;
}
return false;
}
/// <summary>
/// 检测登陆账号
/// </summary>
/// <param name="uin"></param>
/// <returns></returns>
public bool QQisLogined(string uin)
{
HtmlElementCollection elements=Document.GetElementsByTagName("input");
foreach(HtmlElement element in elements)
{
string type = element.GetAttribute("type");
if (type != "radio")
continue;
string name = element.GetAttribute("name");
if (name != "q_uin")
continue;
string id = element.GetAttribute("id");
if (id == "uin_" + uin)
{
return true;
}
}
return false;
}
}
}
首先用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] 管理线程
使用示例如下:
[STAThread]
static void Main(string[] args)
{
CheckLoginedQQ.Checker checker = new CheckLoginedQQ.Checker();
if (checker.Initialize())
{
if(checker.QQisLogined("110001"));
Console.Write("Logined");
else
Console.Write("Not Logined");
}
else
{
Console.Write("un Initialize");
}
}
有时候做程序,喜欢把程序的注册与用户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代码,有兴趣的可以看看
xui.js:下载下载
接着我们来直接实现程序吧,代码如下:
复制内容到剪贴板
程序代码
程序代码using System;
using System.Windows.Forms;
namespace CheckLoginedQQ
{
public class Checker
{
public Checker()
{
}
private HtmlDocument Document;
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public bool Initialize()
{
WebBrowser browser = new WebBrowser();
browser.Url = new Uri("http://xui.ptlogin2.qq.com/cgi-bin/qlogin");
while (browser.ReadyState!=WebBrowserReadyState.Complete)
{
Application.DoEvents();
}
if (browser.Document.Url.AbsoluteUri == "http://xui.ptlogin2.qq.com/cgi-bin/qlogin")
{
Document = browser.Document;
return true;
}
return false;
}
/// <summary>
/// 检测登陆账号
/// </summary>
/// <param name="uin"></param>
/// <returns></returns>
public bool QQisLogined(string uin)
{
HtmlElementCollection elements=Document.GetElementsByTagName("input");
foreach(HtmlElement element in elements)
{
string type = element.GetAttribute("type");
if (type != "radio")
continue;
string name = element.GetAttribute("name");
if (name != "q_uin")
continue;
string id = element.GetAttribute("id");
if (id == "uin_" + uin)
{
return true;
}
}
return false;
}
}
}
首先用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] 管理线程
使用示例如下:
[STAThread]
static void Main(string[] args)
{
CheckLoginedQQ.Checker checker = new CheckLoginedQQ.Checker();
if (checker.Initialize())
{
if(checker.QQisLogined("110001"));
Console.Write("Logined");
else
Console.Write("Not Logined");
}
else
{
Console.Write("un Initialize");
}
}
评论: 0 | 引用: 0 | 查看次数: 320
发表评论
上一篇
下一篇


文章来自:
Tags:
相关日志:
