web-dev-qa-db-ja.com

C#を使用してPhantomjsを実行し、Webページのスナップショットを取得します

Phantomjsを使用して自分のWebサイトのスナップショットを取得しようとしています。基本的に、これはユーザーが送信したコンテンツの「プレビュー画像」を作成するためのものです。

サーバーにphantomjsをインストールし、コマンドラインから適切なページに対して実行すると正常に機能することを確認しました。しかし、ウェブサイトから実行しようとすると、何も実行されないようです。コードが呼び出されていること、ファントムが実際に実行されていることを確認しました(プロセスを監視し、呼び出すとプロセスリストに表示されることを確認しました)。ただし、イメージは生成されていません。

なぜ画像が作成されないのかを理解するためにどこを見ればよいのかわかりません-何か提案はありますか?関連するコードブロックは次のとおりです。

string arguments = "/c rasterize.js http://www.mysite.com/viewcontent.aspx?id=123";
string imagefilename = @"C:\inetpub\vhosts\mysite.com\httpdocs\Uploads\img123.png";

Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.CreateNoWindow = false;
p.StartInfo.FileName = @"C:\phantomjs.exe";
p.StartInfo.Arguments = arguments + " " + imagefilename;

p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
17
Elie

Phantomjsが処理中にスローするエラーを確認します。 Process.StandardErrorから読み取ることができます。

var startInfo = new ProcessStartInfo();
//some other parameters here
...
startInfo.RedirectStandardError = true;
var p = new Process();
p.StartInfo = startInfo;
p.Start();
p.WaitForExit(timeToExit);
//Read the Error:
string error = p.StandardError.ReadToEnd();

それはあなたに何が起こったのかについての考えを与えるでしょう

9
Andrey Borisko

C#コードからphantomjsを実行する最も簡単な方法は、 NReco.PhantomJS のようなラッパーを使用することです。次の例は、rasterize.jsに使用する方法を示しています。

var phantomJS = new PhantomJS();
phantomJS.Run( "rasterize.js", new[] { "https://www.google.com", outFile} );

Wrapper APIには、stdoutとstderrのイベントがあります。また、C#ストリームからの入力を提供し、stdoutの結果をC#ストリームに読み込むこともできます。

7