一個簡單有用的JavaScript CRACK程式的解決技術關鍵點

來源:互聯網
上載者:User
一個簡單有用的JavaScript CRACK程式的解決技術關鍵點(轉載請註明來自“碧海情天-趙亮”的部落格 blog.csdn.net/theforever)

 

  背景:涉及稍微敏感的問題,不便細說來龍,只能詳講去脈。現狀就是,有一個外部網站,在其首頁裡有部分新資源的展示(資源種類暫且也可以抽象化概括),可以通過搜尋方塊或者欄目列表來得到更多或更準確的資源清單,點擊資源會出現資源資訊頁,在資訊頁裡選擇觀看,才會出現資源的播放顯示頁。

  現在的問題是:在找到資源清單後,需要開啟兩個頁面才能看到資源。同時,由於這個網站的設計問題,播放顯示頁存在很多問題,效果非常不能令人滿意,所以更希望在專門的播放器裡進行播放,或者記下資源地址以後直接播放。因此,如何來簡化操作並得到資源的真正播放地址,就是本JS CRACK程式的目的。
  當然,標題所說的“有用”並非僅指這樣一種具體的用途,大家可以在其它方面進行借鑒(雖然標題有個CRACK,但不希望被人誤解為不良用途,事實上CRACK一詞長期地被大量人所誤讀)。同時,解決表面化問題之後的隱藏問題(這個是在大多數開發中都會出現的情況)的更有用的知識還在後面。

 

  解決的思路:由於網站是動態指令碼設計,依賴於節目ID作為傳參,因此在首頁新資源清單和搜尋列表及欄目列表中都可以通過右擊資源後按T鍵(即複製捷徑)來取得資源資訊頁地址,其中就包含著資源的ID。於是,實際播放頁的地址也就可以得出了,這樣就可以越過資源資訊頁這個環節。而在播放頁中,雖然網站採用了一點保密的措施,但實際上除了唬唬外行和菜鳥,可以說是完全無用的,只要當作能從一個全域變數中得到就可以了(所以說,我一直講,與其把精力用在這種不必要的事情上,還不如用在讓網站更受人喜歡上面,這樣,別人也完全不用因為感覺不便而來作這類事情。一句話,與人為善,人自善之)。

  實際解決中的重點問題:

  就象標題說的,看似“簡單”,一般JS入門(還有Regex,雖然不是必須的,但會讓你更省力)就大概可以解決了。但促使本文出現的一個原因,是將會碰到的一個問題。這個問題是由於採取的解決方式導致的。
  簡單來說,解決方式至少有兩個:一是利用AJAX直接在當前頁嵌入xmlhttp對象向播放頁背景程式發出請求,取回返回資訊,從中找到實際的資源地址。二是直接開一個新視窗調用播放頁,得到其中的資源地址。因為使用規格要求不高,而後者控制邏輯比較簡單,代碼量也少得多,所以選擇了後者。
  不管用哪種方式,首先都必須得到資源的ID,這也有至少兩種情況要處理:一是已經通過複製捷徑將含有資源ID的地址串拷貝到粘貼板中,二是使用者已經點擊到資源的資訊頁查看資源資訊以決定是否得到此資源地址,此時就無須再次複製地址,而是應該通過地址欄的URL自動取得資源的ID,當然,這也不是必須,只是為方便使用者。
  為了突出本文重點,這些細節可以略過(包括用正則對不同地址串形式下的資源ID的提取)。如果不具備解決這些問題的知識,那下面將要講的本文重點就沒有意義了。所以請自行補充知識。如果你認為我前面說的這些統統是浪費篇幅的廢話,還不如直接把全部代碼亮出來,那隻能說明你並不是一個真正適合搞技術的人,或者說你的層次還完全不足以閱讀本文。
  書接上節,由於採用了新開視窗的方式,一般形式化的代碼如下:
  window.open('網站/播放頁?'+資源ID,'_blank');
  然後,怎麼得到那個資源的真正地址呢?假定它就存放在一個全域變數link裡,也就是說,怎麼得到這個全域變數link?假設只是最簡單的alert一下:
  alert(link);
  不可以。因為這取得的是本頁面的全域變數,而不是新視窗頁面的。
  w=window.open('網站/播放頁?'+資源ID,'_blank');
  alert(w.link);
  表面看,這樣是可以的。但實際上仍然得不到。因為——太快了,window.open只是發出請求,本地新開視窗+發出請求+網路傳輸時間+網站響應請求進行處理後返回頁面+網路傳輸時間+本地載入返回頁面進行解析,這些都需要時間,所以立即alert是得不到結果的。
  w=window.open('網站/播放頁?'+資源ID,'_blank');
  w.onload=function(){alert(w.link);}
  這樣就可以了。但可能由於不穩定的網路情況,開始這樣寫時由於遲遲沒反映,所以導致我寫了下面更為複雜的語句:
  w=window.open('網站/播放頁?'+資源ID,'_blank');
  w.onload=(function(w){setTimeout(function(){if(w.link)prompt('資源地址如下,請複製',w.link);},2000);})(w);
  這樣是在頁面載入後再延時執行,有充分的反映時間。雖然理論上並不必要,而且應該是增加了等待的時間,但奇怪的是,促使我開始這樣用的時候,卻是因為每次這樣用總是比上面不加延時那樣還要快地得到結果,甚至在目前也一樣。大概,我的老本子在本地載入後的處理用時本來就和延時所用的時間差不多甚至還要多——果真這樣的確很可怕。事實上,處理其它網站時,有的還是挺快的,也就是說,這個播放頁面裡的內容的確很不友好,含有太多垃圾廣告之類的東西,經過廣告自動過濾系統的時間有點長,而且頁面的設計安排也有缺陷,導致載入處理速度自然性地有點慢,或者說,這也是設計上出於某種不友好動機的一個故意安排。
  回頭歸納本文的技術重點,就是在開啟新視窗並要取得或設定其中的對象時,要記得加上window範圍限定符。這其實是JS的一個基礎知識,只是很多人因為平時大量寫頁內JS,需要時反而容易想不起這一點,所以有必要提一下。而且要注意,應在window.onload中(這裡的變形是“window物件變數.onload”)寫擷取的語句。另外,我後面提到的不必要的複雜寫法,如果你沒見過,建議尋找相關文法資料好好學習一下,因為對一次性的調用,會大量採用匿名函數,很多初學者都會碰到並學會,但有時需要對匿名函數進行傳參,就不會寫了。這種寫法就象是英語學習中為數不多的主要句型之一一樣重要,必須掌握。

作者:趙亮

背景:多年的軟體和網站雙料開發經曆。曆任從程式員到進階程式員、系統分析設計師、技術經理/總監,技術合伙人。雖然從技術到管理過渡,精力自然有所轉移,但閑暇仍喜歡小弄刀槍。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.