问题 在Linux CLI中解释并执行任意Javascript


我一直在寻找方法来做一段时间,但还没有找到正确的方法来做到这一点。

任务: 从Linux命令行执行Javascript。

例如, 有二进制或其他什么将解释Javascript加载一些.js文件,然后打印一些变量的值。

更具体的例子: 我想在解释和执行Javascript之后获得此页面的最终版本 http://www.vureel.com/video/2809/American-Dad。如果您使用Firebug查看该页面,您将看到这个模糊的Javascript

<script language="JavaScript" type="text/javascript">/*<![CDATA[*/var a,s,n;function a8bcb4f34dfd6e81cfdb9c115d1671582(s){r="";for(i=0;i<s.length;i++){n=s.charCodeAt(i);if(n<128){n=n ... etc ...</script>

变成了一个很好的嵌入代码

<embed height="390" width="642" flashvars="file=http://vureel-cdn-2.vureel.com/leechingisillegal/537c69afbcaf4c7cf416f30077bbe9d1/4a29621d/here/2809.flv ...etc .../>

这只是一个例子,但希望你能看到我正在驾驶的东西。


13156
2018-06-05 18:30


起源

我认为您的问题应该重命名为“如何在JS执行后获取页面源”。我不认为如何用v8执行代码的描述会对你有所帮助,不是吗? - Martin Thoma


答案:


看看吧 犀牛 发动机(维基百科上的犀牛

以下是一些替代方案:


您可能还想看看 Node.js的


7
2018-06-05 18:54



Node.js是目前使用最广泛的这些选项。 - jnylen


您在两个不同的点上驾驶1)在浏览器外执行javascript 2)在网页上查看javascript的结果。

对于第一个问题,mozilla rhino是一个在java中运行的javascript解释器。您可以通过命令行执行javascript。

对于第二个问题,请查看Firebug中的dom选项卡,您可以在javascript运行后看到生成的文档元素。

或者您可以启用脚本调试,保存页面的本地副本并将其插入debug();声明。


3
2018-06-05 18:35



fyi - 最后一个音符是win / visual studio提示,你说你在Linux上,所以这可能不适用 - Tim Hoolihan
我正在研究Spidermonkey,因为有一个Perl lib可以与之交谈。据我所知,Rhino几乎是相同的东西,但对于Java而不是C. - Artem Russakovskii
对于第二个问题,您的解决方案与查看Firebug的输出一样好,但我需要能够在命令行上获取它,因此使用浏览器不是一种选择。 - Artem Russakovskii
我现在使用Spidermonkey在我的示例中成功运行了一些Javascript代码。再研究一下,看看如何将整个网站或js文件列表提供给它。 - Artem Russakovskii


我想你想在执行javascript时做一些抓取。 env.js描述于 http://ejohn.org/blog/bringing-the-browser-to-the-server/ 可能会有所帮助。我本来打算在我的某些工具上尝试它,但不能因为时间不足而无法使用特定于站点的脚本。


2
2018-06-05 18:51



很有意思。看起来非常非常好。 - Artem Russakovskii
如果你使用env.js,那么自博客中的版本以来,已经做了一些工作,以使其更好地匹配浏览器。代码是在 github.com/jeresig/env-js/tree/master。还有几个分支具有附加功能。 - Matthew Crumley


看一眼 http://phantomjs.org/

它是一个无头网络浏览器,因此,您可以构建dom并像在真实浏览器中那样操纵它。显然你可以导出结果。


2
2018-06-17 18:04





如果你喜欢Python,你可以抓住 ghost.py 来自GitHub,它允许您创建无头WebKit浏览器并从Python脚本中控制它。我已经通过IPython笔记本交互式地使用了它,并且开箱即用。我把它扩展到与BeautifulSoup合作,这很好。


0
2017-10-11 01:53