将完整代码传递给phantomjs

时间:2015-05-28 19:36:24

标签: go phantomjs exec

我正在Go中编写服务,我使用phantomJS从给定的URL生成图像。在我的Go程序中,我使用Exec启动了phantomJS二进制文件。这工作正常,但现在我正在寻找一种方法来传递完整的代码,以及运行二进制文件的调用。我的代码如下:

var args = require('system').args;
var webPage = require('webpage');
var page = webPage.create();

page.viewportSize = {
    width: 1920,
    height: 1080
};

page.open("http://www.url2fetch.com", function (status) {
  var base64 = page.renderBase64('PNG');
  console.log(base64);
  phantom.exit();
});

这永远不会改变。除了获取的网址:)。所以我的具体问题是:是否可以启动phantomJS并将上面的代码作为参数传递,以便可以通过一次调用执行。原因是:我不想将phantomjs脚本与我的Go程序一起打包。

3 个答案:

答案 0 :(得分:5)

PhantomJS有一个交互式版本,您可以通过stdin传递代码,但是有一个bug(版本1.9.x和2.0.0),因此没有页面可以打开,这使得它实际上无法使用。

没有办法将脚本传递给PhantomJS进行解释。您需要至少有一个文件。你可以

  1. 创建随可执行文件一起提供的模板文件,并使用该文件和其他(URL)参数调用PhantomJS或

  2. 你生成文件进入一些临时目录,让PhantomJS使用它。

  3. 如果您有理由相信可以利用写入时间与使用时间漏洞,那么您应该使用变体1。

    要完成第一个案例,您可以在PhantomJS中使用system.args来读取传递的命令行选项,例如URL。

答案 1 :(得分:1)

如果您使用的是Linux,则可以将此代码放在PhantomJS脚本的开头。

#!/usr/bin/env phantomjs

这意味着,当调用此文件时,它就像终端调用它一样。

$ phantomjs script.js args

答案 2 :(得分:-2)

phantomjs的互动版本为completely screwed as of writing

由于这个原因,如果您不想在项目中添加额外的文件,最简洁的方法(如果您只是分发脚本而不是目录包)是在temp中生成一个随机命名的js文件目录,运行它,然后删除它。