将完整代码传递给 phantomjs

Pass complete code to phantomjs

我正在用 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();
});

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

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

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

  1. 创建一个与可执行文件一起发布的模板文件,并使用该文件和附加的 (URL) 参数或

  2. 调用 PhantomJS
  3. 你从某个临时目录生成文件并让 PhantomJS 使用它。

如果您有理由相信写入时间与使用时间漏洞会被利用,那么您应该选择变体 1。

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

如果你使用Linux,你可以把这段代码放在PhantomJS脚本的开头。

#!/usr/bin/env phantomjs

也就是说,这个文件被调用时,就像是被终端调用一样。

$ phantomjs script.js args

phantomjs的交互版本是completely screwed as of writing

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