Basicamente, o que você precisa para passar um pedaço de dados estruturados de Perl para PhantomJS e deixá-lo fazer seu trabalho.
Para conseguir isso, você serializa os dados que gostaria de usar no trabalho PhantomJS por meio da biblioteca JSON e os passa para um script phantomjs predefinido.
Em primeiro lugar, você prepara um pequeno modelo JS para fazer seu trabalho no lado do PhantomJS:
/*
A (JavaScript) template for the PhantomJS job.
It assumes the inputData variable is defined above
*/
console.log("[PhantomJS] Here I shall do something useful with the following data:");
console.log(inputData);
console.log("[PhantomJS]");
/*
Capture Screenshots of the page(s)
https://github.com/ariya/phantomjs/wiki/Screen-Capture
Capture network traffic of the page(s)
https://github.com/ariya/phantomjs/wiki/Network-Monitoring
Whatever useful you can find at the official wiki
https://github.com/ariya/phantomjs/wiki/_pages
*/
phantom.exit();
E então você o executa a partir do seu programa Perl com o PhantomJS. Algo assim:
#!/usr/bin/env perl
use strict;
use warnings;
use File::Temp 'tempfile';
use JSON;
my $script_content = join '', <DATA>;
run_phantom(["http://google.com", "http://twitter.com"]);
# or ...
run_phantom({foo => "bar"});
sub run_phantom {
my $data = shift;
my $phantomjs = $ENV{PHANTOMJS} || 'phantomjs';
# Generate temporary script file
my $tempfile = File::Temp->new(
TEMPLATE => "phantomjs-script-XXXXXX",
SUFFIX => '.js',
# You might want to turn this off
# for debugging purposes
CLEANUP => 1
);
print $tempfile "var inputData = " . encode_json($data) . ";n";
print $tempfile $script_content;
close $tempfile;
# Run it
system($phantomjs, $tempfile);
if ($?) {
my $exitcode = $? >> 8;
die
"-- PhantomJS exited with code $exitcoden";
}
print "-- PhantomJS succeededn";
}
print "-- Successn";
__DATA__
/*
A (JavaScript) template for the PhantomJS job.
It assumes the inputData variable is defined above
*/
console.log("[PhantomJS] Here I shall do something useful with the following data:");
console.log(inputData);
console.log("[PhantomJS]");
/*
Capture Screenshots of the page(s)
https://github.com/ariya/phantomjs/wiki/Screen-Capture
Capture network traffic of the page(s)
https://github.com/ariya/phantomjs/wiki/Network-Monitoring
Whatever useful you can find at the official wiki
https://github.com/ariya/phantomjs/wiki/_pages
*/
phantom.exit();
Apenas certifique-se de que o phantomjs
binário esteja em seu caminho ou seja definido pela variável de ambiente ‘PHANTOMJS’.
E ele simplesmente funciona, sem compilar toda a ligação com o código-fonte do PhantomJS e assim por diante.
Na maioria dos casos, o que você precisa é processar uma lista de <algo> e obter uma lista apropriada de resultados. Seja o que for: capturas de tela, monitoramento de tráfego, procura de estruturas externas, despejando dados ou executando seus testes automatizados com um conjunto específico de dados. Se quiser usar o PhantomJS do Perl, você já tem uma lista de itens para processar.
Então a ideia é passar todos esses dados para o terreno JS e processar com todos os recursos que o PhantomJS oferece.
Claro, em alguns casos raros você realmente precisa acessar diretamente a API PhantomJS de seu programa devido a questões de desempenho. Mas esta é uma história diferente.
Links para a documentação de todos os itens acima:
PhantomJS:
https://github.com/ariya/phantomjs/wiki
https://github.com/ariya/phantomjs/wiki/Screen-Capture
https://github.com/ariya/phantomjs/wiki/Network-Monitoring
Biblioteca Perl JSON:
https://metacpan.org/module/JSON
Função ‘system ()’ Perl:
http://perldoc.perl.org/functions/system.html