User:HBC AIV helperbot/source/mwAPI.pm

This source is released under GFDL.

This file should be saved as mwAPI.pm.

package mwAPI;
use     strict;
use     HTTP::Request;
use     HTTP::Request::Common;
use     LWP::UserAgent;
use     XML::Simple;
use     URI::Escape;
use     Data::Dumper;
use     version; our $VERSION = version->declare("v1.0.3");                                                           

sub new {
  shift;
  my $self = {};
  bless $self;
  $self->{ua} = new LWP::UserAgent;
  $self->{ua}->default_headers->push_header('Accept-Encoding' => 'gzip');
  $self->{ua}->cookie_jar({});
  return $self;
}

sub ua { $_[0]->{ua}; }

sub login {
  my $self = shift;
  my( $username, $password ) = @_;
  $self->{username} ||= $username;
  $self->{password} ||= $password;
  my $data = $self->api2data( 'login', [lgname => $self->{username}, lgpassword => $self->{password}] );
  my $token = $data->{login}{token};
  my $data = $self->api2data( 'login', [lgname => $self->{username}, lgpassword => $self->{password}, lgtoken => $token] );
  my $self->{'logged_in'} = ($data->{login}{result} eq 'Success');
}

sub check_login {
  my $self = shift;;  
  my $html = $self->ua->get("https://en.wikipedia.org/wiki/User:HBC_AIV_helperbot/blank")->decoded_content();
  if ($html =~ m|\"wgUserName\":null|) { delete $self->{'logged_in'}; return 0 }
  return 1;
}

sub get {
  my $self = shift;
  my $page = shift;
  my $data = $self->api2data( 'query', [ meta => 'tokens', prop => 'revisions', rvprop => 'content|timestamp', titles => $page ] );
  my $content = $data->{query}{pages}{page}{revisions}{rev}{content};
  my $edit_token = $data->{query}{tokens}{csrftoken};
  return ( wantarray ) ? ( $content, $data ) : $content;
}

sub put {
  my $self    = shift;
  my $page    = shift;
  my $summary = shift;
  my $content = shift;
  my $minor   = shift;
  my $read    = shift;
  my $bot     = shift;
  my $post = [
    assert        => 'bot',
    title         => $page,
    summary       => $summary || 'Missing edit summary, this is a bug',
    text          => $content, 
    bot           => 1,
    basetimestamp => $read->{query}{pages}{page}{revisions}{rev}{timestamp},
    token         => $read->{query}{tokens}{csrftoken},
  ];
  push( @{ $post }, 'minor', 1 ) if ( $minor );
  my $data = $self->api2data( 'edit', $post );
  if( $data->{error}{code} eq 'assertbotfailed' ) {
    my $data = $self->login();
  }
  return $data;
}

sub api2data {
  my $self = shift;
  my $action = shift;
  my $post = shift;
  print Dumper { $action => $post } if $ENV{DEBUG} > 1;
  my $xml = $self->ua->request(POST 'https://en.wikipedia.org/w/api.php?action='.$action.'&format=xml', $post)->decoded_content();
  eval{$xml = XMLin($xml)};
  if ($@) {
    warn $@;
    return;
  }
  print Dumper { $action => $xml } if $ENV{DEBUG};
  return $xml;
}

1;