用JavaScript擷取網頁中的js、css、Flash等檔案

來源:互聯網
上載者:User

作者:馬健
郵箱:stronghorse@tom.com
首頁:http://stronghorse.yeah.net
版本:1.01
初始發布日期:2005.08.29
最後更新日期:2005.09.28

目錄
一、前言
二、從E書或網頁中擷取檔案的一般步驟
三、從E書或網頁中擷取連結進來的css檔案
四、從E書或網頁中擷取連結進來的js檔案
五、從E書或網頁中擷取Flash檔案
六、從E書或網頁中擷取背景音樂檔案
七、從E書中擷取影像檔
八、進入frame頁面
九、其它問題

一、前言

最近我又聽到有人抱怨用miniKillEBook反編譯電子書,只能得到HTML網頁,得不到E書中的js、css、Flash、背景音樂等檔案。其實只要各位對JavaScript代碼有所瞭解,就算只用已經公開發布的CtrlN,要得到E書中的這些檔案也不是很難。

事先聲明:
1、下面所有方法均基於JavaScript,因此可能會給人繞圈子的感覺,效果也無法與直接調用IE非公開介面的IECracker、KillEBook相比。不過這樣正好平衡:對於有意通過反編譯學習他人做書經驗的好學者,用JavaScript本身就是一個練手的過程,而這種方法又很難用於批量反編譯,因此做書的人也不必產生過多的擔憂。殺雞取蛋的事俺是不做的,哈哈……
2、為了便於使用,下面給出的JavaScript寫得都很傻瓜,所有URL分析工作都交給程式碼完成,各位只要會按Ctrl+C、Ctrl+V鍵就好。但是自動化操作畢竟有其極限,對於大多數網頁來說用這些代碼應該可以搞定,但是如果碰到搞不定的網頁,還是要靠人工對HTML代碼進行分析。在分析時如果碰到加密網頁,可以用CtrlN的“HTML片段”功能,對加密HTML進行解碼。在原始碼中尋找連結時,可以用搜尋功能快速定位。
3、現在基於IE核心的電子書基本上通過自訂協議外掛程式實現,對JavaScript協議外掛程式的支援程度不一,因此如果代碼在某些電子書上出現錯誤,請不必奇怪。
4、除了用於反編譯E書,這些代碼在平時瀏覽正常網頁時也有用,如用來抓網頁中的Falsh檔案。
5、所有代碼均在Windows XP SP2下測試通過,其它環境我沒試,不過估計IE版本不能低於6.0。
6、所有代碼均為我的原創,個人可以免費使用,網站轉載、商業牟利請先獲得我的授權。

二、從E書或網頁中擷取檔案的一般步驟

從E書或普通網頁中擷取各種檔案的步驟基本相同,只是需要輸入的JavaScript代碼不同:

  1. 啟動CtrlN。這是為了防止電子書或網頁禁用快速鍵。如果你確認快速鍵沒有被禁,可以省略這一步,在第3步直接按Ctrl+N鍵。
  2. 開啟電子書或IE,進入引用了需要抓取的css、js、Flash等檔案的頁面。注意這裡必須是真正的頁面,不能是frame。後面會談到如何判斷frame及如何進入frame頁面。
  3. 將CtrlN的“快速鍵行為”設定為“彈出新視窗”,然後用滑鼠在欲抓取的網頁上點一下,再按下Ctrl+N鍵,彈出新的IE視窗,裡面顯示的內容與欲抓取的頁面內容相同,地址欄上顯示有頁面的URL。
  4. 在彈出的IE視窗中,根據需要將對應的JavaScript代碼(後面會給出)複製、粘貼到地址欄上,然後按斷行符號鍵即可。

對於IE 6,第一次運行JavaScript代碼可能會在地址欄下彈出一個黃條,提示這段代碼被阻止運行,點一下黃條,選擇“允許封鎖的內容”,然後再重複步驟3、4,即可看到結果。

三、從E書或網頁中擷取連結進來的css檔案

JavaScript本身提供了擷取外部css檔案內容的介面,因此在前述一般步驟的步驟4中,將下面內容複寫、粘貼到IE地址欄上,然後按斷行符號鍵即可看到內容:

javascript:str='';c=document.styleSheets;for(i=0;i<c.length;i++){o=c[i];if (o.href=='')continue;str+='========== ';str+=o.href;str+='<br><xmp>\n';str+=o.cssText;str+='</xmp><br><br>\n';};document.write(str);

如果當前HTML頁面沒有連結到外部css檔案,則步驟4完成後無反應或顯示一個空頁,這時可以檢查一下頁面的HTML原始碼進行確認。如果當前頁面連結了多個css檔案,所有css檔案內容都會顯示出來,格式經過IE排版後可能和原始css代碼不同,但是效果絕對相同。如果只顯示出css檔案的檔案名稱,下面無內容,則說明E書沒有把這個css打包進去。

對於某些電子書,也可以試試下面這段代碼:

javascript:str='<HTML><HEAD><BASE HREF="';str+=document.URL;str+='"></HEAD><BODY><br>\n';c=document.styleSheets;for(i=0;i<c.length;i++){o=c[i];if (o.src=='')continue;str+='<a href="';str+=o.href;str+='">';str+=o.href;str+='</a><br>\n';};str+='</BODY></HTML>';document.write(str);

這段代碼自動對網頁進行檢查,如果網頁中嵌入了css檔案,則自動顯示出css檔案的下載連結,否則顯示一個空頁或無反應。在連結上點滑鼠右鍵再選“目標另存新檔”菜單,即可將檔案儲存到硬碟上。如果不能儲存,可將js檔案的URL複製到地址欄上,然後按斷行符號試試。不過如果登錄機碼HKEY_CLASSES_ROOT\CSSfile\shell下面有open、edit等子項,則獲得的css代碼會直接在open或edit子項指定的程式中開啟而不是提示存檔。這種方法的適用範圍遠遠不如前面直接顯示的方法,不是所有電子書都能用的,但只要能用,得到的絕對是原汁原味的css代碼。

四、從E書或網頁中擷取連結進來的js檔案

JavaScript沒有提供擷取js檔案內容的介面,因此首先要對註冊表進行改造:運行regedit,定位到HKEY_CLASSES_ROOT\.js,在它下面增加兩個字串類型的值:
Content Type=application/x-javascript
PerceivedType=text
如果修改的時候不放心,可以參考HKEY_CLASSES_ROOT\.css的預設設定,它們只是Content Type的值不同。註冊表改造是一次性的工作,改完就不用再動。

在改造完成後,用CtrlN抓取js檔案的步驟與前述一般步驟相同,在步驟4中,將下面內容複寫、粘貼到地址欄上,然後按斷行符號鍵即可看到內容:

javascript:str='<HTML><HEAD><BASE HREF="';str+=document.URL;str+='"></HEAD><BODY><br>\n';c=document.scripts;for(i=0;i<c.length;i++){o=c[i];if (o.src=='')continue;str+='<a href="';str+=o.src;str+='">';str+=o.src;str+='</a><br>\n';};str+='</BODY></HTML>';document.write(str);

這段代碼自動對網頁進行檢查,如果網頁中嵌入了js檔案,則自動顯示出js檔案的下載連結,否則顯示一個空頁或無反應。在連結上點滑鼠右鍵再選“目標另存新檔”菜單,或直接點連結;即可將檔案儲存到硬碟上。如果不能儲存,請先確認是否已經按照上面說的方法對註冊表進行過設定;如果還不行,可以將js檔案的URL複製到地址欄上,然後按斷行符號試試。

比較怪異的是用eBook Workshop做的E書(頁面URL以ada99:開頭),在地址欄上敲入js檔案的URL然後斷行符號,會直接顯示出js檔案內容及其執行結果,需要點“查看->源檔案”菜單才可以獲得原始js檔案代碼。不過這種書一般都用unEbookWorkshop反編譯了吧?

五、從E書或網頁中擷取Flash檔案

對於Flash這種內嵌物件的檔案,直接下載就可以,因此在前述一般步驟的步驟4中,將下面內容複寫、粘貼到地址欄上,然後按斷行符號鍵即可看到內容:

javascript:str='<HTML><HEAD><BASE HREF="';str+=document.URL;str+='"></HEAD><BODY><br>\n';c=document.all;for(i=0;i<c.length;i++){o=c[i];if(o.tagName!="OBJECT")continue;sih=o.innerHTML;nd=document.createDocumentFragment();nd.appendChild(document.createElement('<bod></body>'));nd.firstChild.outerHTML=sih;no=document.createElement(nd.firstChild.outerHTML);document.body.appendChild(no);str+='<a href="';str+=no.src;str+='">';str+=no.src;str+='</a><br>\n';};str+='</BODY></HTML>';document.write(str);

這段代碼自動對網頁進行檢查,如果網頁中嵌入了Flash對象,則自動顯示出swf檔案的下載連結,否則顯示一個空頁或無反應。在連結上點滑鼠右鍵,選“目標另存新檔”,即可將檔案儲存到硬碟上。如果直接點選連結,則會顯示出Flash畫面。

我經常看到有人問:“怎樣抓取網頁上的漂亮Flash?”,其實答案就是這麼簡單,平時上網俺也經常用這段代碼抓Flash,不過需要注意:如果頁面鑲嵌在frame中,則需要突破frame進入真正的頁面中才能使用這段代碼。另外這段代碼使用了createDocumentFragment方法,只能在IE 6上運行。

現在還有一種很極端的電子書:整本書只有一個網頁,裡面嵌入了一個Flash檔案作為目錄,點擊Flash中的連結,則轉入其它Flash檔案,即真正的內容藏在一堆Flash檔案裡。對於這種電子書,用上面的代碼一次只能抓到一個Flash,需要逐步點進去才能抓全,有的甚至要用flasm反編譯出抓到的Flash檔案的運行指令碼,再從指令碼中找出它所連結的其它Flash檔案的檔案名稱(俺都是很卑鄙地直接搜尋.swf),然後將檔案名稱轉成絕對URL,即可產生下載連結。例如已知某Flash檔案的絕對URL為http://ebook/pic.swf,則用下面的代碼可以單獨下載此檔案:

javascript:document.write('<a href="http://ebook/pic.swf">右鍵另存新檔</a>');

這種方法每次都要改URL,當然比前面說的方法麻煩,但是有時候也只能用這種方法。順帶一提,flasm還真是個好東西,某些Flash檔案在指令碼中限制該檔案只能在網路上播放,不能從本地硬碟播放,也可以用它去除這種限制。

六、從E書或網頁中擷取背景音樂檔案

背景音樂檔案可以象Flash一樣直接下載,因此在前述一般步驟的步驟4中,將下面內容複寫、粘貼到地址欄上,然後按斷行符號鍵即可看到內容:

javascript:str='<HTML><HEAD><BASE HREF="';str+=document.URL;str+='"></HEAD><BODY><br>\n';c=document.all;for(i=0;i<c.length;i++){o=c[i];if(o.tagName!="BGSOUND")continue;str+='<a href="';str+=o.src;str+='">';str+=o.src;str+='</a><br>\n';};str+='</BODY></HTML>';document.write(str);

這段代碼自動對網頁進行檢查,如果嵌入了背景音樂,則自動顯示出背景音樂的下載連結,否則顯示一個空頁或無反應。在連結上點滑鼠右鍵,選“目標另存新檔”,即可將檔案儲存到硬碟上。

注意背景音樂一般隱藏在frame中(否則一換頁面音樂就被打斷了),如果彈出的頁麵包含frame,而不是真正包含背景音樂連結的頁面,就會抓不到。這時還需要按後面說的步驟進入frame中的頁面。

另外有些E書為了避免單調,會一次打包進去幾個midi檔案,每次啟動並執行時候隨機播放一個作為背景音樂。對於這樣的E書,用上面的代碼只能抓到當前背景音樂。如果想抓全部,只能自己對網頁原始碼進行分析,組合出全部背景音樂的URL,然後在地址欄上輸入產生下載連結的JavaScript代碼再斷行符號,一次下載一個。注意在下載連結上也只能點右鍵後選“目標另存新檔”,不能直接點連結。如果實在沒有本事對網頁原始碼進行分析,只能多運行幾回、多抓幾回了,正所謂“落後就要挨打”。樣本:已知某音樂檔案的絕對URL為http://ebook/1.mid,則產生下載連結的代碼為:
javascript:document.write('<a href="http://ebook/1.mid">右鍵另存新檔</a>');

七、從E書中擷取影像檔

在前述一般步驟的步驟4中,將下面內容複寫、粘貼到地址欄上,然後按斷行符號鍵即可看到內容:

javascript:z=1;strUrl='';str='';function getImg(){if(strUrl!=''){str+=(z++);str+='. <IMG SRC="';str+=strUrl;str+='"><br><br>\n';};};c=document.images;for(i=0;i<c.length;i++){o=c[i];strUrl=o.src;getImg();};strUrl=document.body.background;getImg();c=document.all;for(i=0;i<c.length;i++){o=c[i];if(o.tagName=='TABLE'||o.tagName=='TD'){strUrl=o.background;getImg();};if(o.tagName=='AREA'){strUrl=o.href;getImg();};};document.write(str);

上面這段代碼會把網頁中能夠找到的圖片全部順序顯示出來。如果覺得圖片太多看起來不方便,或有某些小圖片看不清,也可以用下面這段代碼顯示圖片連結,點選連結才顯示圖片:

javascript:z=1;strUrl='';str='';function getImg(){if(strUrl!=''){str+=(z++);str+='. <a href="';str+=strUrl;str+='">';str+=strUrl;str+='</a><br>\n';};};c=document.images;for(i=0;i<c.length;i++){o=c[i];strUrl=o.src;getImg();};strUrl=document.body.background;getImg();c=document.all;for(i=0;i<c.length;i++){o=c[i];if(o.tagName=='TABLE'||o.tagName=='TD'){strUrl=o.background;getImg();};if(o.tagName=='AREA'){strUrl=o.href;getImg();};};document.write(str);

由於代碼限制,隱藏在頁面js、css代碼中的圖片用上面的兩段代碼不能抓取,這時只能自己手工對HTML代碼進行分析,在地址欄上直接輸入圖片的絕對URL再斷行符號,也能顯示出圖片。

另外由於javascript協議外掛程式的能力限制,上面兩段代碼都沒有剔除重複的連結,所以如果用這兩段代碼去抓BBS頁面上的圖,看到一大堆相同的圖片時請不要詫異。

在圖片或連結顯示出來後,只有極少數E書中的圖片可以直接另存新檔原始格式,絕大多數只能擷取解碼成Bitmap後的圖片,方法為:在圖片(注意是圖片,不能是連結,連結必須點進去顯示出圖片)上點右鍵,選“圖片另存新檔”菜單,即可將圖片儲存成bmp檔案,檔案名稱預設是“無標題.bmp”,需要手工改名。如果URL中指定的檔案不是bmp,而是jpg、gif或png等,則還需要用ACDSee等軟體將儲存下來的bmp轉換成要求的格式。jpg還好說,gif、png的透明色需要手工處理,動畫gif乾脆就不要想了。

注意:如果只是對檔案進行改名,沒有對檔案格式進行轉換,在IE中將會顯示不出圖片。

平時上網的時候,也可以用上面的代碼抓取所瀏覽網頁的背景圖片,這個時候選“圖片另存新檔”,一般都能儲存成原始格式。

從上面的敘述可以看出,在不使用IE內部介面的情況下,抓取圖片可能是最麻煩,但效果又最差的一件苦差使。記得當年我就是因此一怒之下開始咬牙分析IE核心原始碼的,還好最後終於獲得了回報。不知道在看了上面的說明後,會不會有人血性大發,也走上當年我那條路?嘿嘿嘿……

八、進入frame頁面

上面給出的所有JavaScript代碼都是針對當前頁面的,也就是說,只有當前頁面中真的包含音樂檔案、Flash檔案,才能抓到所需的檔案。如果是frame,就必須進入frame中的頁面,才能抓取。

檢測當前頁面是否是frame,最簡單的辦法就是按前述一般步驟進行操作,然後在步驟4中,將下面內容複寫、粘貼到地址欄上,然後按斷行符號鍵:

javascript:str='<HTML><HEAD><BASE HREF="';str+=document.URL;str+='"></HEAD><BODY><br>\n';c=document.all;for(i=0;i<c.length;i++){o=c[i];if(o.tagName!='IFRAME'&&o.tagName!='FRAME')continue;str+=o.tagName;str+=' : <a href="';str+=o.src;str+='">';if(o.name=='')str+=o.src;else str+=o.name;str+='</a><br>\n';};str+='</BODY></HTML>';document.write(str);

這段代碼自動對網頁進行檢查,如果嵌入了frame(包括iframe),則自動顯示出frame中的頁面連結,否則顯示一個空頁或無反應。直接點選連結,即可進入相應的頁面。

為了保證通用性,上面的代碼只對第一層frame進行檢查,這對iframe來說問題不大,因為不會有幾個正常人會去玩嵌套iframe;但對於普通frame來說,嵌套的可能性還是很大的,而上面的代碼需要一層層點進去才能見到嵌套frame,未免有點麻煩。解決的辦法就是:如果用上面代碼顯示的全是FRAME,沒有IFRAME,則可以用下面的代碼顯示全部嵌套frame:

javascript:str='';function getFrame(c,i,j){for(i=0;i<c.length;i++){o=c[i];for(k=0;k<j;k++)str+=' ';str+='<a href="';str+=o.location;str+='">';if(o.name!='')str+=o.name;else str+=o.location;str+='</a><br>\n';no=o.document.frames;if(no.length>0)getFrame(no,0,j+1)};};getFrame(document.frames,0,0);document.write(str);

這段代碼自動對網頁進行檢查,顯示出嵌套frame中所有頁面的連結及嵌套關係,沒有frame則顯示一個空頁或無反應。直接點選連結,即可進入相應的頁面。注意如果頁面中含有iframe,則上面的代碼可能會出錯,所以才要先用第一段代碼檢查一下有沒有iframe。

如果網頁中採用了js代碼對frame進行檢測,導致網頁不能脫離frame運行,則為了獲得嵌入frame頁面中的內容,可以在用上面的代碼顯示出frame頁面連結後,直接在頁面連結上點右鍵選“目標另存新檔”,儲存出HTML代碼後再手工編輯或用TextForever等工具輔助編輯。

miniKillEBook v1.04以前的版本存在一個疏忽:我光想到處理FRAME,忘記處理IFRAME,因此在某些人中開始流傳這樣一種說法:將網頁嵌入IFRAME,即可避免被miniKillEBook反編譯。在v1.04出來之後,這種說法就真的只能成為傳說了。

九、其它問題

Q:如果按下Ctrl+N鍵後,彈出的IE視窗沒有菜單、地址欄,怎麼辦?
A:從CtrlN ver 1.03開始,提供一個可以開啟/關閉的“進階介面”,通過裡面的“Script命令”功能,可以直接將要執行的JavaScript程式碼推送到IE視窗中執行,不用再在地址欄輸入。

Q:如果E書起來後禁止了Windows的複製、粘貼功能,上面的js代碼好長,不想一個字元一個字元敲,怎麼辦?
A:從CtrlN ver 1.03開始,提供一個可以開啟/關閉的“進階介面”,通過裡面的“Script命令”功能,可以直接將要執行的JavaScript代碼或URL推送到IE視窗中執行,不用再在地址欄輸入。如果您寫了自己的JavaScript代碼,也可以將它加到CtrlN.spt檔案(純文字檔案)中,這樣以後可以在Script命令選擇視窗中直接選擇。

附錄 版本更新記錄

Version 1.01
按照CtrlN ver 1.03的新增功能,對文檔進行了修訂。

相關文章

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.