空间站

北极心空

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
[声明:仅供学习探讨之用,对于使用本文代码所造成之影响,本文作者不负任何法律和连带责任]
最近,看到qq上不少好友的头像前都有个小火炬,自己也想要一个,遂行..
结果发现,需要登陆网页 http://huoju.icoke.qq.com/ 去自己‘抢’火炬去,而且我试验多次,也没办法抢到,只有靠‘机器’来抢了....
言归正传,经过分析,如果想抢到火炬,需要激发网页上的‘立即争夺’按钮,获取网页代码:

##按钮部分代码

<tr>
<td height="67" align="center"><a id="rob" href="#" onclick="return rob_torch();"> ... </td>
</tr>

由此可知,如函数rob_torch()有关,下载此网页相关的javascript(JS)代码,找出rob_torch()函数如下所示:

function rob_torch()
{
    if (Cookie.getCookie("tobtorchcookie") == null)
    {
        var ntime = new Date();
        var stime = new Date(ntime.getYear(), ntime.getMonth(), ntime.getDate(), ntime.getHours(), ntime.getMinutes(), ntime.getSeconds()+25);
        Cookie.setCookie("tobtorchcookie", "ok", stime);
    }
    else
    {
        alert("抱歉,您的操作过于频繁,请于25秒后重试。");
        return false;
    }
    if (arrDelay.num == 0)
    {
        alert("目前没有活动资格可供争夺,请耐心等候!");
        return false;
    }
    var vers = getQQVersion();
    if (vers == -1)
    {
        return false;
    }
    if (vers < 1777 || vers >= 2007)
    {
        alert("您当前的版本不支持活动资格争夺,请到http://im.qq.com下载安装官方2007II正式版或2008贺岁版QQ客户端。");
        return false;
    }        
    JsonLoader.load('http://app.icoke.qq.com/icoke/torchdelay.php?'+Math.random(),function()
        {
            if (typeof(numJson) != undefined)
            {
                var url = "tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN="+numJson[1];
                $("rob").href = url;
                window.open(url, "robtorchiframe", "location=no");
                return true;
            }
            else
            {
                ;
            }
    });
    return false;
}

其中大部分都是验证,不是很重要,我们注意到JsonLoader.load这个函数调用,其中有两个参数,一个是原url地址,另一个是回调函数内容,我们先看到这个回调函数会调用url地址tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN=XXX其中XXX经过后来分析,是一个号码,火炬号码$("rob").href = url;讲网页中的变量rob赋值为这个刚刚生成的url地址,然后由window.open()来调用这个链接,后来分析这个tencent协议需要调用一个qq客户端程序,暂时不知,由这个客户端程序去处理url地址请求。
再返回来查看JsonLoad对象的load函数,代码如下:

var JsonLoader = {
    load: function(sUrl, fCallback)
    {
        var _script = document.createElement("script");
        _script.setAttribute("type", "text/javascript");
        _script.setAttribute("src", sUrl);
        document.getElementsByTagName("head")[0].appendChild(_script);
        if (!!document.all)
        {
            _script.onreadystatechange = function()
            {
                if (this.readyState=="loaded" || this.readyState=="complete")
                {
                    fCallback();
                }
            };
        }
        else
        {
            _script.onload = function()
            {
                fCallback();
            };
        }
    },
.............

这个,我们截取了一部分,其主要意思是根据情况,调用load的第二个参数,回调函数。
这样,我们就知道了,我们只需要激发这个tencent的协议调用就可以激发按钮事件了....
现在的问题就是我们如何去获得上文中的XXX,即火炬号码,由上述代码rob_torch()函数中的url = "tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN="+numJson[1],我们发现,这个XXX变量numjSon[1]同函数delay_refresh()中的arrDelay.delayqq的值是一样的,所以我们就直接每次通过调用delay_refresh()函数来更新获得当前放出来的火炬的延迟编号。

function delay_refresh()
{
    var url = 'http://huoju.icoke.qq.com/huojuicoke/datajs/torch_delay2.js?'+Math.random();
    AsynLoader.load(url,
             {
                method:'get',
                onSuccess: function(xmlHttp)
                {
                    arrDelay = eval("(" + xmlHttp.responseText + ")");
                    $("torch_num").innerHTML = arrDelay.num;
                    if ($("torch_total") != null)
                    {
                        $("torch_total").innerHTML = formatNum(arrDelay.total_count);
                    }
                    var url = "tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN="+arrDelay.delayqq;
                    $("rob").href = url;
                },
                onFailure: function()
                { }
    });

后面进一步分析得知,此页面每隔一定时间调用这个fresh函数去刷新获取当前释放出来的火炬编号,一段时间只释放一个编号,我们可以频繁调用这个刷新函数,然后在这个火炬被释放的第一时间,获取这个火炬的编号,然后调用tencent协议url请求去获取获取,这样,一旦有火炬被释放出来,就可以很快的去'抢',比自己用手去点要快多了,本代码没有考虑异常情况,而且实现也不是很完善....不想继续完善了,因为本来是用于分析和学习,所以没必要继续了....
经过测试,机器就是比人快...哈哈,以下是python实现的而代码,再次提醒,对于代码造成的任何影响,本作者不附带任何责任。

import urllib,webbrowser,time
import random
import re

regx = re.compile('\"[0-9]*\"') #分析获取火炬编号的模式

#用于记录原来的火炬编号,如果两次获取的火炬编号一致,则不激发获取火炬的事件

old=''

num=999 #试验999次

fresh_url='http://huoju.icoke.qq.com/huojuicoke/datajs/torch_delay2.js?'

get_url='tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN='

while num-- <= 0:
    net=urllib.urlopen(fresh_url) #刷新释放的火炬
    data=net.read()
    m_list=re.findall(regx,data) #获取火炬编号
    if old != m_list[0]:
        webbrowser.open(get_url + str(m_list[0])) #激发获取火炬事件
    time.sleep(1) #stop 1 second

posted on 2008-04-01 19:22 芦苇 阅读(413) 评论(0)  编辑  收藏 所属分类: 其他

只有注册用户登录后才能发表评论。


网站导航: