NAME
MediaWiki::API - Provides a Perl interface to the MediaWiki API (http://www.mediawiki.org/wiki/API)
VERSION
Version 0.12
SYNOPSIS
This module provides an interface between Perl and the MediaWiki API (http://www.mediawiki.org/wiki/API) allowing creation of scripts to automate editing and extraction of data from MediaWiki driven sites like Wikipedia.
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 => 'username', lgpassword => 'password' } );
|| die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
# get a list of articles in category
my $articles = $mw->list ( {
action => 'query',
list => 'categorymembers',
cmtitle => 'Category:Perl',
cmlimit => 'max' } )
|| die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
# and print the article titles
foreach (@{$articles}) {
print "$_->{title}\n";
}
# get 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';
files_url = 'base url for files'; (needed if the api returns a relative URL for images like /images/a/picture.jpg)
upload_url = 'http://en.wikipedia.org/wiki/Special:Upload'; (path to the upload special page which is required if you want to upload images)
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' } )
|| die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
MediaWiki::API->api( $query_hash, $options_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}.
binmode STDOUT, ':utf8';
# get the name of the site
if ( my $ref = $mw->api( { action => 'query', meta => 'siteinfo' } ) ) {
print $ref->{query}->{general}->{sitename};
}
# list of titles for "Albert Einstein" in different languages.
my $titles = $mw->api( {
action => 'query',
titles => 'Albert Einstein',
prop => 'langlinks',
lllimit => 'max' } )
|| die $mw->{error}->{code} . ': ' . $mw->{error}->{details};
my ($pageid,$langlinks) = each ( %{ $titles->{query}->{pages} } );
foreach ( @{ $langlinks->{langlinks} } ) {
print "$_->{'*'}\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_page( $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.
binmode STDOUT, ':utf8';
# process the first 400 articles in the main namespace in the category "Surnames".
# 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:Surnames',
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:
RT: CPAN's request tracker
AnnoCPAN: Annotated CPAN documentation
CPAN Ratings
Search CPAN
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.