package MediaWiki; use strict; use warnings; use HTML::TreeBuilder; sub new { my ($class, $server, %properties)= @_; my $self= bless { server=> WebServer->new($server), url=> "/index.php", special=>"Special", %properties, }, $class; return $self; } sub post { my ($self, @params)= @_; $self->{server}->httppost($self->{url}, @params); } sub get { my ($self, @params)= @_; if (!$self->{loggedin}) { $self->login(); } $self->{server}->httpget($self->{url}, @params); } sub cachedget { my ($self, @params)= @_; my $filename= encodeurlasfile(@params); if (-e $filename) { return readfile($filename); } my $data= $self->get(@params); savefile($filename, $data); return $data; } sub DESTROY { my $self= shift; } ######################################################################## sub getwikisource { my ($self, $page)= @_; my $xml= $self->post( title=>"$self->{special}:Export", action=>'submit', pages=>$page, curonly=>'true', ); if ($xml =~ /]*>(.*?)<\/text>/s) { return $1; } die "could not find xml tag in\n$xml\n"; } sub getcategoryitems { my ($self, $page)= @_; my $html= $self->get( title=>$page, ); my $tree = HTML::TreeBuilder->new(); $tree->parse($html); $tree->eof(); my ($table)= $tree->look_down( "_tag"=>"table", ) or die "could not find category table for $page\n"; my @items; for $a ($table->look_down("_tag", "a")) { push @items, $a->as_text(); } return @items; } sub uploadfile { my ($self, $imgname, $imgdesc)= @_; $imgname =~ s/\\/\//g; ( my $imgdestname= $imgname ) =~ s/.*\///; my $answer= $self->post( { title=>"$self->{special}:Upload", }, wpUploadFile=>[$imgname], wpDestFile=>$imgdestname, wpUploadDescription=>$imgdesc, wpUpload=>"Upload file", wpIgnoreWarning=>'true', ); # if ($answer) { # print $answer->content; # } } sub logout { my $self= shift; my $answer= $self->get(title=>"$self->{special}:Userlogout"); $self->{loggedin}= 0; $self->{server}->clearcookies(); } sub login { my ($self, $username, $password)= @_; my $answer= $self->post( { action=>'submitlogin', title=>"$self->{special}:Userlogin" }, wpName => $username, wpPassword => $password, wpLoginattempt => 'Log in', ); $self->{loggedin}= 1; } # title=>'Template:UpcomingTable' # action=>'submit' # text wpSummary # flag wpMinoredit 1 # flag wpWatchthis # button wpSave Save page # button wpPreview Show preview # button wpDiff Show changes # hidden wpSection # hidden wpEdittime 20050730124636 # hidden wpEditToken cd44d6f6003e41d1d44b9a79266a846f # text wpTextbox1 sub geteditform { my ($self, $page, $section)= @_; my $answer= $self->get( action=>'edit', title=>$page, defined $section ? ( section=>$section ) : (), ); my $tree = HTML::TreeBuilder->new(); $tree->parse($answer); $tree->eof(); my ($formtag)= $tree->look_down( "_tag"=>"form", "name"=>"editform", ); my @inputelements= $formtag->look_down( "_tag"=>"input", sub { $_[0]->attr('type') ne 'submit' && $_[0]->attr('type') ne 'radio' } ); my @textelements= $formtag->look_down( "_tag"=>"textarea", ); my %form; # not handling radio buttons yet. for my $field (@inputelements) { $form{$field->attr('name')}= $field->attr('value') } for my $field (@textelements) { $form{$field->attr('name')}= $field->as_text; } return \%form; } sub saveeditform { my ($self, $page, $form)= @_; my $answer= $self->post( { action=>'submit', title=>$page, }, wpSave=>"Save page", %$form, ); } sub createpage { my ($self, $page, $content)= @_; my $f= $self->geteditform($page); if ($f->{wpTextbox1}) { print "----$page\n$f->{wpTextbox1}\n\n"; } $f->{wpTextbox1}= $content; print map { sprintf("%-20s= %s\n", $_, defined $f->{$_} ? "'$f->{$_}'":"") } keys %$f; $self->saveeditform($page, $f); } 1;