####
use strict;
use WWW::Mechanize;
use XML::SAX;
use CmdHandler;
if(!@ARGV){
print "Need to pass a input file name";
}
my $agent = WWW::Mechanize->new;
my $parser = XML::SAX::ParserFactory->parser(
Handler => CmdHandler->new($agent)
);
$parser->parse_uri($ARGV[0]);
exit(0);
##
##
package CmdHandler;
use strict;
use base qw(XML::SAX::Base);
sub new{
my $class = shift;
my $self = $class->SUPER::new();
$self->_init(@_);
return $self;
}
sub _init{
my ($self,$agent) = @_;
$self->{agent} = $agent;
}
sub start_element{
my ($self,$el) = @_;
my $name = $el->{Name};
print "Processing start_element:$name\n";
return if $name eq "mechanize";
# put all attributes in a hash, is there a better way?
my %params = ();
foreach my $k (values %{$el->{Attributes}}){
$params{$k->{Name}}=$k->{Value};
}
# well, some ugly hardcoded if-else, a better way?
if($name eq "get"){
$self->{agent}->get($params{url});
}elsif($name eq 'submit'){
$self->{agent}->submit(form_name=>$params{form_name},
button=>$params{button},
fields=>\%params);
}elsif($name eq 'back'){
$self->{agent}->back();
}elsif($name eq 'follow_link'){
$self->{agent}->follow_link(n => $params{n},
text=>$params{text},
url_regex=>$params{url_regex});
}else{
print "Hey, don't know what you mean, may be in next version.\n";
}
# may be we want to print out to a file?
my $file = $params{output};
if($file){
if($file eq "stdout"){
print $self->{agent}->content();
}elsif($file eq "none"){
}else{
open(OUTPUT, ">$file") or warn "Can't open $file for writing\n";
print OUTPUT $self->{agent}->content();
close(OUTPUT);
}
}
return $self->SUPER::start_element($el);
}
1;