空間站

          北極心空

            BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks
          [聲明:僅供學習探討之用,對于使用本文代碼所造成之影響,本文作者不負任何法律和連帶責任]
          最近,看到qq上不少好友的頭像前都有個小火炬,自己也想要一個,遂行..
          結果發(fā)現(xiàn),需要登陸網(wǎng)頁 http://huoju.icoke.qq.com/ 去自己‘搶’火炬去,而且我試驗多次,也沒辦法搶到,只有靠‘機器’來搶了....
          言歸正傳,經(jīng)過分析,如果想搶到火炬,需要激發(fā)網(wǎng)頁上的‘立即爭奪’按鈕,獲取網(wǎng)頁代碼:

          ##按鈕部分代碼

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

          由此可知,如函數(shù)rob_torch()有關,下載此網(wǎng)頁相關的javascript(JS)代碼,找出rob_torch()函數(shù)如下所示:

          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這個函數(shù)調用,其中有兩個參數(shù),一個是原url地址,另一個是回調函數(shù)內容,我們先看到這個回調函數(shù)會調用url地址tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN=XXX其中XXX經(jīng)過后來分析,是一個號碼,火炬號碼$("rob").href = url;講網(wǎng)頁中的變量rob賦值為這個剛剛生成的url地址,然后由window.open()來調用這個鏈接,后來分析這個tencent協(xié)議需要調用一個qq客戶端程序,暫時不知,由這個客戶端程序去處理url地址請求。
          再返回來查看JsonLoad對象的load函數(shù),代碼如下:

          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();
                      };
                  }
              },
          .............

          這個,我們截取了一部分,其主要意思是根據(jù)情況,調用load的第二個參數(shù),回調函數(shù)。
          這樣,我們就知道了,我們只需要激發(fā)這個tencent的協(xié)議調用就可以激發(fā)按鈕事件了....
          現(xiàn)在的問題就是我們如何去獲得上文中的XXX,即火炬號碼,由上述代碼rob_torch()函數(shù)中的url = "tencent://LargeSizedActivity/?HandleID=3&PUIN=&TorchUIN="+numJson[1],我們發(fā)現(xiàn),這個XXX變量numjSon[1]同函數(shù)delay_refresh()中的arrDelay.delayqq的值是一樣的,所以我們就直接每次通過調用delay_refresh()函數(shù)來更新獲得當前放出來的火炬的延遲編號。

          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函數(shù)去刷新獲取當前釋放出來的火炬編號,一段時間只釋放一個編號,我們可以頻繁調用這個刷新函數(shù),然后在這個火炬被釋放的第一時間,獲取這個火炬的編號,然后調用tencent協(xié)議url請求去獲取獲取,這樣,一旦有火炬被釋放出來,就可以很快的去'搶',比自己用手去點要快多了,本代碼沒有考慮異常情況,而且實現(xiàn)也不是很完善....不想繼續(xù)完善了,因為本來是用于分析和學習,所以沒必要繼續(xù)了....
          經(jīng)過測試,機器就是比人快...哈哈,以下是python實現(xiàn)的而代碼,再次提醒,對于代碼造成的任何影響,本作者不附帶任何責任。

          import urllib,webbrowser,time
          import random
          import re

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

          #用于記錄原來的火炬編號,如果兩次獲取的火炬編號一致,則不激發(fā)獲取火炬的事件

          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])) #激發(fā)獲取火炬事件
              time.sleep(1) #stop 1 second

          posted on 2008-04-01 19:22 蘆葦 閱讀(441) 評論(0)  編輯  收藏 所屬分類: 其他
          主站蜘蛛池模板: 大余县| 通化县| 孝昌县| 衡山县| 镇巴县| 安福县| 常州市| 墨玉县| 江永县| 玉屏| 盘锦市| 噶尔县| 黔东| 锡林浩特市| 海城市| 合肥市| 庆元县| 苍南县| 鸡东县| 舒兰市| 峨山| 灵寿县| 武隆县| 庆云县| 苏尼特左旗| 根河市| 甘洛县| 涿州市| 乌鲁木齐县| 阳东县| 家居| 武冈市| 商洛市| 莆田市| 仪陇县| 大关县| 遵化市| 涞水县| 瓦房店市| 茶陵县| 健康|