Запуск Phantomjs с использованием С# для захвата моментального снимка веб-страницы

Я пытаюсь захватить снимки своего собственного сайта с помощью phantomjs - в основном, это создать "изображение предварительного просмотра" контента, представленного пользователем.

Я установил phantomjs на сервер и подтвердил, что выполнение его из командной строки на соответствующих страницах отлично работает. Однако, когда я пытаюсь запустить его с веб-сайта, он, похоже, ничего не делает. Я подтвердил, что код вызывается, что phantom фактически работает (я отслеживал процессы и вижу, что он появляется в списке процессов, когда я его вызываю), однако изображение не создается.

Я не уверен, где я должен искать, почему он не будет создавать изображения - любые предложения? Соответствующий блок кода ниже:

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();

Ответы

Ответ 1

Я проверяю ошибки, которые 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();

Это даст вам представление о том, что произошло

Ответ 2

Самый простой способ для выполнения phantomjs из кода С# - использовать обертку, например NReco.PhantomJS. Следующий пример иллюстрирует, как использовать его для rasterize.js:

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

API-интерфейс Wrapper имеет события для stdout и stderr; также он может предоставлять входные данные из С# Stream и считывать результат stdout в поток С#.