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

17

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

Я установил 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();
    
задан Elie 27.12.2012 в 04:07
источник
  • Вы проверили, какой результат на самом деле? Есть хороший шанс, что при запуске у него не будет достаточно привилегий для сохранения в нужном месте ... Подумайте о том, как списать текущую учетную запись пользователя из сценария Phantom (не уверен, как это сделать) или посмотреть, в какой учетной записи она работает. –  Alexei Levenkov 27.12.2012 в 09:45
  • Он работает как общая учетная запись .NET - так же, как когда пользователь пытается загрузить изображение (и я сохраняю сгенерированное изображение в тот же каталог, поэтому он должен иметь доступ на запись к этому каталогу). –  Elie 27.12.2012 в 16:44
  • Начните сначала с чего-то простого, например. Скрипт PhantomJS для отображения «Hello world». Посмотрите, правильно ли оно выводит сообщение. –  Ariya Hidayat 30.12.2012 в 18:10
  • Если запуск простого сценария занимает много времени, на Windows может возникнуть проблема с прокси-сервером (см. код.google.com/p/phantomjs/issues/detail?id=580). Попробуйте добавить аргумент командной строки --proxy-type = none, чтобы обойти прокси-сервер. –  Ariya Hidayat 30.12.2012 в 18:13
  • спасибо. Закончилось использование другой системы очистки, которая также занимает некоторое время, но была в состоянии отлаживать лучше - это была некоторая ошибка доступа к файлу, но phantomjs не давала мне достаточной информации. –  Elie 31.12.2012 в 16:03
Показать остальные комментарии

2 ответа

9

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

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

    
ответ дан Andrey Borisko 28.04.2013 в 10:00
7

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

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

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

ответ дан Vitaliy Fedorchenko 05.04.2015 в 14:15
  • Для тех, кто использует этот метод, ссылка на rasterize.js: github.com/ariya/phantomjs/blob/master/examples/rasterize.js –  idok 12.05.2015 в 22:09