利用JavaScript提取网页与电子书中的CSS、JS、Flash及媒体资源
本文介绍如何使用JavaScript代码在IE浏览器中提取网页或电子书中的CSS、JS、Flash、背景音乐及图片文件。通过特定的脚本注入地址栏,可自动解析并生成资源下载链接,适用于学习网页制作或提取本地E-book资源。
作者:马健
邮箱: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源码,无法获取嵌入的JavaScript、CSS、Flash动画及背景音乐等资源。实际上,只要掌握基本的JavaScript知识,即便仅使用已公开的CtrlN工具,提取这些资源也并非难事。
声明如下: 1、本文所述方法均基于JavaScript实现,因此操作略显繁琐,效果不如直接调用IE非公开接口的工具(如IECracker、KillEBook)直接。但这种平衡具有意义:对于希望通过反编译学习制作技巧的爱好者,使用JavaScript本身就是一种很好的实践;同时,由于该方法难以用于大规模批量反编译,电子书制作者无需过度担忧。我不会做这种杀鸡取蛋的事。 2、为便于操作,提供的JavaScript代码力求简单,URL分析由代码自动完成,用户只需掌握复制粘贴即可。但自动化存在局限,多数网页可成功处理,若遇特殊情况,仍需人工分析HTML源码。若遇到加密网页,可利用CtrlN的“HTML片段”功能进行解码。查找链接时,可使用搜索功能快速定位。 3、目前基于IE内核的电子书多通过自定义协议插件实现,各插件对JavaScript的支持程度不一,若代码在特定电子书上出错,属正常现象。 4、除反编译电子书外,这些代码在浏览普通网页时同样有用,例如抓取网页中的Flash文件。 5、所有代码均在Windows XP SP2环境下测试通过,其他环境未作测试,但推测IE版本不低于6.0即可运行。 6、所有代码均为原创,个人可免费使用。网站转载或商业牟利需事先获得授权。
获取文件的一般步骤
二、从E书或网页中获取文件的一般步骤
从电子书或普通网页中提取各类文件的步骤基本一致,区别仅在于需要输入的JavaScript代码不同:
- 按下 Ctrl+N。此举旨在规避电子书或网页对快捷键的屏蔽限制。若确认快捷键未被禁用,可跳过此步,于第3步直接执行 Ctrl+N 操作。
- 打开电子书或IE浏览器,进入包含需抓取资源(如CSS、JS、Flash等)的页面。注意:此处必须进入真正的页面,而非Frame框架。后续章节将介绍如何判断及进入Frame页面。
- 将CtrlN的“快捷键行为”设置为“弹出新窗口”。随后,用鼠标点击欲抓取的网页任意位置,再按下Ctrl+N键。此时将弹出一个新的IE窗口,其内容与原页面相同,地址栏显示该页面的URL。
- 在弹出的IE窗口中,根据需求将对应的JavaScript代码(后文提供)复制并粘贴至地址栏,按回车键执行。
对于IE 6,首次运行JavaScript代码时,地址栏下方可能会弹出黄色警告条,提示代码被阻止。点击该黄条,选择“允许阻止的内容”,然后重复步骤3和4,即可看到结果。
获取CSS文件
三、从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打包进去。
对于某些电子书,也可尝试以下代码:
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代码将直接在指定程序中打开而非提示存盘。此方法适用范围不如直接显示法广,并非所有电子书均适用,但只要能用,获取的必是原汁原味的CSS代码。
获取JS文件
四、从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制作的电子书(页面URL以ada99:开头),在地址栏输入JS文件URL后按回车,会直接显示JS文件内容及其执行结果,需点击“查看->源文件”菜单方可获得原始JS代码。不过此类电子书通常已使用unEbookWorkshop进行反编译。
获取Flash文件
五、从E书或网页中获取Flash文件
对于Flash这类嵌入对象文件,可直接下载。因此,在执行一般步骤的第4步时,将以下代码复制并粘贴至IE地址栏,按回车即可看到内容:
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步时,将以下代码复制并粘贴至IE地址栏,按回车即可看到内容:
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中的页面。
另外,部分电子书为避免单调,会打包多个MIDI文件,每次运行时随机选择一个作为背景音乐。对此类电子书,使用上述代码仅能抓取当前背景音乐。若想抓取全部,需自行分析网页源代码,组合出所有背景音乐的URL,然后在地址栏输入生成下载链接的JavaScript代码后回车,一次下载一个。注意在下载链接上只能点右键后选“目标另存为”,不能直接点击链接。若实在无法分析网页源代码,只能多运行几次、多抓几次,正所谓“落后就要挨打”。示例:已知某音乐文件的绝对URL为http://ebook/1.mid,则生成下载链接的代码为: javascript:document.write('<a href="http://ebook/1.mid">右键另存为</a>');
获取图像文件
七、从E书中获取图像文件
在执行一般步骤的第4步时,将以下代码复制并粘贴至IE地址栏,按回车即可看到内容:
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页面图片,看到大量相同图片时请勿诧异。
在图片或链接显示出来后,仅极少数电子书中的图片可直接另存为原始格式,绝大多数只能获取解码为Bitmap后的图片。方法为:在图片上(注意是图片,非链接,链接需点进去显示图片)点击鼠标右键,选择“图片另存为”菜单,即可将图片保存为BMP文件,文件名默认为“无标题.bmp”,需手工改名。若URL指定的文件非BMP,而是JPG、GIF或PNG等,则还需使用ACDSee等软件将保存下来的BMP转换为所需格式。JPG尚可处理,GIF、PNG的透明色需手工处理,动画GIF则无需考虑。
注意:若仅对文件改名而未进行格式转换,在IE中将无法显示图片。
平时上网时,也可用上述代码抓取所浏览网页的背景图片,此时选“图片另存为”,一般均可保存为原始格式。
从上述叙述可见,在不使用IE内部接口的情况下,抓取图片可能是最繁琐但效果最差的苦差事。记得当年我因此一怒之下开始咬牙分析IE内核源代码,幸好最终获得回报。不知看完上述说明后,是否有人血性大发,也走上我当年的路?嘿嘿嘿……
进入Frame页面
八、进入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发布后,此说法仅能成为传说。
其它问题
九、其它问题
问:若按下Ctrl+N键后,弹出的IE窗口没有菜单、地址栏,怎么办? 答:从CtrlN ver 1.03开始,提供一个可打开/关闭的“高级界面”,通过其中的“Script命令”功能,可直接将欲执行的JavaScript代码推送到IE窗口中执行,无需在地址栏输入。
问:若E书启动后禁止Windows的复制、粘贴功能,上述JS代码过长,不想逐字符敲击,怎么办? 答:从CtrlN ver 1.03开始,提供一个可打开/关闭的“高级界面”,通过其中的“Script命令”功能,可直接将欲执行的JavaScript代码或URL推送到IE窗口中执行,无需在地址栏输入。若编写了自己的JavaScript代码,也可将其添加至CtrlN.spt文件(纯文本文件)中,以便日后在Script命令选择窗口中直接选择。
附录 版本更新记录
Version 1.01 按照CtrlN ver 1.03的新增功能,对文档进行了修订。
AOS.js 动画不触发怎么办?排查 DOM 加载与移动端兼容问题
2026-11-05 17:02:26
sigma.js 怎么实现节点点击、拖拽与悬停提示交互
2026-11-05 15:03:27
Matter.js 与 PixiJS/Three.js 集成:分离物理计算与渲染
2026-11-05 13:43:48
主流JS弹幕库选型指南:Danmaku.js等库的功能与体积对比
2026-11-05 09:28:19
JavaScript点击事件监听与交互效果实例
2026-11-05 09:10:19
