`
wsql
  • 浏览: 11758537 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
文章分类
社区版块
存档分类
最新评论

一个简单有用的JavaScript CRACK程序的解决技术关键点

 
阅读更多

一个简单有用的JavaScript CRACK程序的解决技术关键点

(转载请注明来自“碧海情天-赵亮”的博客 blog.csdn.net/theforever)

  背景:涉及稍微敏感的问题,不便细说来龙,只能详讲去脉。现状就是,有一个外部网站,在其首页里有部分新资源的展示(资源种类暂且也可以抽象化概括),可以通过搜索框或者栏目列表来得到更多或更准确的资源列表,点击资源会出现资源信息页,在信息页里选择观看,才会出现资源的播放显示页。

  现在的问题是:在找到资源列表后,需要打开两个页面才能看到资源。同时,由于这个网站的设计问题,播放显示页存在很多问题,效果非常不能令人满意,所以更希望在专门的播放器里进行播放,或者记下资源地址以后直接播放。因此,如何来简化操作并得到资源的真正播放地址,就是本JS CRACK程序的目的。
  当然,标题所说的“有用”并非仅指这样一种具体的用途,大家可以在其它方面进行借鉴(虽然标题有个CRACK,但不希望被人误解为不良用途,事实上CRACK一词长期地被大量人所误读)。同时,解决表面化问题之后的隐藏问题(这个是在大多数开发中都会出现的情况)的更有用的知识还在后面。

  解决的思路:由于网站是动态脚本设计,依赖于节目ID作为传参,因此在首页新资源列表和搜索列表及栏目列表中都可以通过右击资源后按T键(即复制快捷方式)来取得资源信息页地址,其中就包含着资源的ID。于是,实际播放页的地址也就可以得出了,这样就可以越过资源信息页这个环节。而在播放页中,虽然网站采用了一点保密的措施,但实际上除了唬唬外行和菜鸟,可以说是完全无用的,只要当作能从一个全局变量中得到就可以了(所以说,我一直讲,与其把精力用在这种不必要的事情上,还不如用在让网站更受人喜欢上面,这样,别人也完全不用因为感觉不便而来作这类事情。一句话,与人为善,人自善之)。

  实际解决中的重点问题:

  就象标题说的,看似“简单”,一般JS入门(还有正则表达式,虽然不是必须的,但会让你更省力)就大概可以解决了。但促使本文出现的一个原因,是将会碰到的一个问题。这个问题是由于采取的解决方式导致的。
  简单来说,解决方式至少有两个:一是利用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”)写获取的语句。另外,我后面提到的不必要的复杂写法,如果你没见过,建议查找相关语法资料好好学习一下,因为对一次性的调用,会大量采用匿名函数,很多初学者都会碰到并学会,但有时需要对匿名函数进行传参,就不会写了。这种写法就象是英语学习中为数不多的主要句型之一一样重要,必须掌握。

作者:赵亮

背景:多年的软件和网站双料开发经历。历任从程序员到高级程序员、系统分析设计师、技术经理/总监,技术合伙人。虽然从技术到管理过渡,精力自然有所转移,但闲暇仍喜欢小弄刀枪。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics