The London Perl and Raku Workshop takes place on 26th Oct 2024. If your company depends on Perl, please consider sponsoring and/or attending.

NAME

MediaWiki::API - Provides a Perl interface to the MediaWiki API (http://www.mediawiki.org/wiki/API)

VERSION

Version 0.05

SYNOPSIS

  use MediaWiki::API;

  my $mw = MediaWiki::API->new();
  $mw->{config}->{api_url} = 'http://en.wikipedia.org/w/api.php';

  # log in to the wiki
  $mw->login( { lgname => 'test', lgpassword => 'test' } );

  # get a list of articles in category
  my @articles = $mw->list ( { action => 'query',
    list => 'categorymembers',
    cmtitle => 'http://en.wikipedia.org/wiki/Category:Perl',
    aplimit=>'max' } );

  # user info
  my $userinfo = $mw->api( {
    action => 'query',
    meta => 'userinfo',
    uiprop => 'blockinfo|hasmsg|groups|rights|options|editcount|ratelimits' } );

    ...

FUNCTIONS

MediaWiki::API->new( [ $config_hash ] )

Returns a MediaWiki API object. You can pass a config as a hashref when calling new, or set the configuration later.

  my $mw = MediaWiki::API->new( { api_url => 'http://en.wikipedia.org/w/api.php' }  );

Configuration options are

  • api_url = 'path to mediawiki api.php';

  • on_error = function reference to call if an error occurs in the module.

An example for the on_error configuration could be something like:

  sub on_error {
    print "Error code: " . $mw->{error}->{code} . "\n";
    print $mw->{error}->{details}."\n";
    die;
  }

Errors are stored in $mw->error->{code} with more information in $mw->error->{details}. The error codes are as follows

  • ERR_NO_ERROR = 0 (No error)

  • ERR_CONFIG = 1 (An error with the configuration)

  • ERR_HTTP = 2 (An http related connection error)

  • ERR_API = 3 (An error returned by the MediaWiki API)

  • ERR_LOGIN = 4 (An error logging in to the MediaWiki)

  • ERR_EDIT = 5 (An error with an editing function)

  • ERR_PARAMS = 6 (An error with parameters passed to a helper function)

  • ERR_UPLOAD = 7 (An error with the file upload facility)

  • ERR_DOWNLOAD = 8 (An error with downloading a file)

MediaWiki::API->login( $query_hash )

Logs in to a MediaWiki. Parameters are those used by the MediaWiki API (http://www.mediawiki.org/wiki/API:Login). Returns a hash with some login details, or undef on login failure. Errors are stored in MediaWiki::API->{error}->{code} and MediaWiki::API->{error}->{details}

  my $mw = MediaWiki::API->new( { api_url => 'http://en.wikipedia.org/w/api.php' }  );

  #log in to the wiki
  $mw->login( {lgname => 'username', lgpassword => 'password' } );

MediaWiki::API->api( $query_hash )

Call the MediaWiki API interface. Parameters are passed as a hashref which are described on the MediaWiki API page (http://www.mediawiki.org/wiki/API). returns a hashref with the results of the call or undef on failure with the error code and details stored in MediaWiki::API->{error}->{code} and MediaWiki::API->{error}->{details}.

  # get the name of the site
  if ( my $ref = $mw->api( { action => 'query', meta => 'siteinfo' } ) ) {
    print $ref->{query}->{general}->{sitename};
  }

  # list of titles in different languages.
  my $titles = $mw->api( {
    action => 'query',
    titles => 'Albert Einstein',
    prop => 'langlinks' } )
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
  
  my @ll = @{ $titles->{query}->{pages}->{page}->{langlinks}->{ll} };

  foreach (@ll) {
    print "$_->{content}\n";
  }

MediaWiki::API->logout()

Log the current user out and clear associated cookies and edit tokens.

MediaWiki::API->edit( $query_hash )

A helper function for doing edits using the MediaWiki API. Parameters are passed as a hashref which are described on the MediaWiki API editing page (http://www.mediawiki.org/wiki/API:Changing_wiki_content). Note that you need $wgEnableWriteAPI = true in your LocalSettings.php to use these features.

Currently only

  • Create/Edit pages (Mediawiki >= 1.13 )

  • Move pages (Mediawiki >= 1.12 )

  • Rollback (Mediawiki >= 1.12 )

  • Delete pages (Mediawiki >= 1.12 )

are supported via this call. Use this call to edit pages without having to worry about getting an edit token from the API first. The function will cache edit tokens to speed up future edits (Except for rollback edits, which are not cachable).

Returns a hashref with the results of the call or undef on failure with the error code and details stored in MediaWiki::API->{error}->{code} and MediaWiki::API->{error}->{details}.

  # edit a page
  $mw->edit( {
    action => 'edit',
    title => 'Main Page',
    text => "hello world\n" } )
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

  # delete a page
  $mw->edit( {
    action => 'delete', title => 'DeleteMe' } ) 
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

  # move a page
  $mw->edit( {
    action => 'move', from => 'MoveMe', to => 'MoveMe2' } )
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

  # rollback a page edit
  $mw->edit( {
    action => 'rollback', title => 'Sandbox' } )
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

MediaWiki::API->get( $params_hash )

A helper function for getting the most recent page contents (and other metadata) for a page. It calls the lower level api function with a revisions query to get the most recent revision.

  # get some page contents
  my $page = $mw->get_page( { title => 'Main Page' } );
  # print page contents
  print $page->{'*'};

Returns a hashref with the following keys or undef on an error. If the page is missing then the returned hashref will contain only ns, title and a key called "missing".

  • '*' - contents of page

  • 'pageid' - page id of page

  • 'revid' - revision id of page

  • 'timestamp' - timestamp of revision

  • 'user' - user who made revision

  • 'title' - the title of the page

  • 'ns' - the namespace the page is in

  • 'size' - size of page in bytes

Full information about these can be read on (http://www.mediawiki.org/wiki/API:Query_-_Properties#revisions_.2F_rv)

MediaWiki::API->list( $query_hash, $options_hash )

A helper function for doing edits using the MediaWiki API. Parameters are passed as a hashref which are described on the MediaWiki API editing page (http://www.mediawiki.org/wiki/API:Query_-_Lists).

This function will return a reference to an array of hashes or undef on failure. It handles getting lists of data from the MediaWiki api, continuing the request with another connection if needed. The options_hash currently has two parameters:

  • max => value

  • hook => \&function_hook

The value of max specifies the maximum "queries" which will be used to pull data out. For example the default limit per query is 10 items, but this can be raised to 500 for normal users and higher for sysops and bots. If the limit is raised to 500 and max was set to 2, a maximum of 1000 results would be returned.

If you wish to process large lists, for example the articles in a large category, you can pass a hook function, which will be passed a reference to an array of results for each query connection.

  # process the first 400 articles in the main namespace in the category "Living people".
  # get 100 at a time, with a max of 4 and pass each 100 to our hook.
  $mw->list ( { action => 'query',
                list => 'categorymembers',
                cmtitle => 'Category:Living people',
                cmnamespace => 0,
                cmlimit=>'100' },
              { max => 4, hook => \&print_articles } )
  || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

  # print the name of each article
  sub print_articles {
    my ($ref) = @_;
    foreach (@$ref) {
      print "$_->{title}\n";
    }
  }

MediaWiki::API->upload( $params_hash )

A function to upload files to a MediaWiki. This function does not use the MediaWiki API currently as support for file uploading is not yet implemented. Instead it uploads using the Special:Upload page, and as such an additional configuration value is needed.

  my $mw = MediaWiki::API->new( {
   api_url => 'http://en.wikipedia.org/w/api.php' }  );
  # configure the special upload location.
  $mw->{config}->{upload_url} = 'http://en.wikipedia.org/wiki/Special:Upload';

The upload function is then called as follows

  # upload a file to MediaWiki
  open FILE, "myfile.jpg" or die $!;
  binmode FILE;
  my ($buffer, $data);
  while ( read(FILE, $buffer, 65536) )  {
    $data .= $buffer;
  }
  close(FILE);

  $mw->upload( { title => 'file.jpg',
                 summary => 'This is the summary to go on the Image:file.jpg page',
                 data => $data } ) || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

Error checking is limited. Also note that the module will force a file upload, ignoring any warning for file size or overwriting an old file.

MediaWiki::API->download( $params_hash )

A function to download images/files from a MediaWiki. A file url may need to be configured if the api returns a relative URL.

  my $mw = MediaWiki::API->new( {
    api_url => 'http://www.exotica.org.uk/mediawiki/api.php' }  );
  # configure the file url. Wikipedia doesn't need this but the ExoticA wiki does.
  $mw->{config}->{files_url} = 'http://www.exotica.org.uk';

The download function is then called as follows

  my $file = $mw->download( { title => 'Image:Mythic-Beasts_Logo.png'} )
    || die $mw->{error}->{code} . ': ' . $mw->{error}->{details};

If the file does not exist (on the wiki) an empty string is returned. If the file is unable to be downloaded undef is returned.

AUTHOR

Jools 'BuZz' Smyth, <buzz [at] exotica.org.uk>

BUGS

Please report any bugs or feature requests to bug-mediawiki-api at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MediaWiki-API. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

You can find documentation for this module with the perldoc command.

    perldoc MediaWiki::API

You can also look for information at:

ACKNOWLEDGEMENTS

  • Stuart 'Kyzer' Caie (kyzer [at] 4u.net) for UnExoticA perl code and support

  • Jason 'XtC' Skelly (xtc [at] amigaguide.org) for moral support

  • Jonas 'Spectral' Nyren (spectral [at] ludd.luth.se) for hints and tips!

  • Carl Beckhorn (cbeckhorn [at] fastmail.fm) for ideas and support

  • Edward Chernenko (edwardspec [at] gmail.com) for his earlier MediaWiki module

COPYRIGHT & LICENSE

Copyright 2008 Jools Smyth, all rights reserved.

This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.