尝试用Rhino编写js shell代码

Rhino是一个开源的JavaScript实现,它完全使用Java语言开发,可以用于嵌入到Java应用程序中以向终端用户提供脚本功能。

根据官方网站 ( http://www.mozilla.org/rhino/ ) ,有下面的特征

  • 实现所有 JavaScript 1.6 特性
  • 脚本化java环境
  • 提供一个执行javascript脚本的shell环境
  • 一个javascript编译器可以使js文件转化为java类
  • 一个javascript调试器

其实N年之前就听说过它了,只是一直没有想起来要应用,昨天突然遇到一个问题,用其他语言不太方便解决,就是要在服务器端模拟网页内的JS运行,来获取一定的信息(提供给爬虫用),所以突然想到这个东东,试了一下下,还蛮有趣的,下面是一些记录:

这里主要用到 它的shell环境

在ubuntu 里面

apt-get install rhino

后,可以用 rhino命令直接运行 rhino shell

rhino本身提供了一些可以功我们使用的容器对象和方法,比如 print 就是将字符串输出到标准输出上…

rhino -e ‘ [ javascript code] ‘ 可以用来直接执行一段javascript代码,比如:

rainx@RainX:/tmp$ rhino -e ‘print("Hello, RainX!");’
Hello, RainX!

又比如一个实际的例子,针对 56.com 的视频结果页面id获取,我们可以进行测试一下, 如下面的地址:

http://www.56.com/u93/v_MzM3NzcwMzQ.html

检查它的 “更多分享代码“ 连接 : http://www.56.com/u93/share.php?id=33777034&p=1 里面的33777034就是视频的id,但是我们并不能直接通过源代码取到这个信息,因为这个链接是在js里面生成的,所以如果我们是后台的程序去读取的话,比如一个爬虫,就不能完整的进入并爬取这个地址,要解决这个问题,我们可以用rhino来实现对这类js的解释执行,得到id (当然如果在前端,直接用firebug更方便一些), 具体的方法我就不将了,可以看下面我简单提取的一段js代码,当然,是可以用rhino执行的

结果如下

rainx@RainX:/tmp$ rhino -f 56page.js
{‘id’ : ’33777034′, ‘exercise’ : ‘n’, ‘space_taxis’ : , ‘user_id’ : ‘liankky’, ‘indexGood’ : ‘n’, ‘public’ : ‘y’, ‘downFlv’ : ‘n’, ‘bookup’ : ‘n’, ‘chk_yn’ : ‘y’, ‘author’ : ‘n’, ‘box’ : ‘save’, ‘from’ : ‘u’, ‘filesize’ : ’3509157′, ‘totaltime’ : ’115000′, ‘save_time’ : ’1209399959′, ‘send_time’ : ’0′, ‘public_time’ : ’0′, ‘img_host’ : ‘v138.56.com’, ‘URL_host’ : ‘c37.5q6.com’, ‘URL_pURL’ : ’18′, ‘URL_sURL’ : ’3′, ‘URL_URLid’ : ‘sc_mp4_120939995949′, ‘effectID’ : ’0′, ‘times’ : ’0′, ‘score’ : ’0′, ‘md5file’ : ’21a41589e372b5524031d35533cdbec4′, ‘score_count’ : ’1′, ‘pct’ : ‘u’, ‘EnId’ : ‘MzM3NzcwMzQ’, ‘channel’ : [’1′]}

解析上面的json就可以取到可爱的id了…

56page.js 代码链接

Comments are closed.