我正在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程序一起打包。
答案 0 :(得分:5)
PhantomJS有一个交互式版本,您可以通过stdin传递代码,但是有一个bug(版本1.9.x和2.0.0),因此没有页面可以打开,这使得它实际上无法使用。
没有办法将脚本传递给PhantomJS进行解释。您需要至少有一个文件。你可以
创建随可执行文件一起提供的模板文件,并使用该文件和其他(URL)参数调用PhantomJS或
你生成文件进入一些临时目录,让PhantomJS使用它。
如果您有理由相信可以利用写入时间与使用时间漏洞,那么您应该使用变体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文件目录,运行它,然后删除它。