<?php
/**
* mwAPI class
**
* Class to hold methods re: Mediawiki API
*
* This class has several dependencies/assumptions
* * PHP libcurl module is enabled
* * script has read/write privileges in the folder where it is run.
* (allowing it to store cookies)
* * mwApiXmlParse class (in mwApiXmlParse.php)
**
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the Free
* Software Foundation; either version 2 of the License, or (at your option)
* any later version.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
* more details.
*
* You should have received a copy of the GNU General Public License along with
* this program; if not, write to the Free Software Foundation, Inc., 59 Temple
* Place - Suite 330, Boston, MA 02111-1307, USA.
* http://www.gnu.org/copyleft/gpl.html
**
* @author Amgine <amgine.saewyc@gmail.com>
* @copyright 2009, 2010 by Amgine <amgine.saewyc@gmail.com>
*/
class mwAPI{
/**
* @var string qualified domain/path to api
**/
protected $address = '';
/**
* @var array Cookie management/storage
**/
public $cookieJar = array();
/**
* @var string cURL handle
**/
private $ch = '';
/**
* @var string Contents of the output buffer from cURL action.
**
* WARNING: this buffer is over-written with every execCurl.
**/
public $curlBuffer = '';
/**
* @var string xml parser reference
**/
public $xml_parser = '';
/**
* @var object mwApiXmlItem
*/
public $item = array();
/**
* @var $editToken string url-encoded edit token
**/
public $editToken = '';
/**
* __construct method
**
* The construction method is called when the class is instantiated.
**
* @param $mwUser string Mediawiki username
* @param $mwPass string Mediawiki user password
* @param $site string qualified url/path to api.php
**/
function __construct( $mwUser, $mwPass, $mwSite ){
// Insure mwApiXmlParse is available
require_once( 'mwApiXmlParse.php' );
// $mwSite should be validated here.
// it *must* be in the form http://domain.com/path/, including
// the trailing /.
$this->ch = curl_init( $mwSite );
$this->mwLogin( $mwUser, $mwPass );
}
/**
* __destruct method
**
* To insure resources are released.
**/
function __destruct(){
curl_close( $this->ch );
xml_parser_free( $this->xml_parser );
}
/**
* doParse method
**
* doParse processes the curlBuffer as an xml format string
*
* WARNING: the length of the xml which can be managed is limited to the
* length of a PHP string -
*/
private function doParse(){
if( strlen( $this->mwXmlFunctions->allElements ) ){
$this->mwXmlFunctions->allElements = '';
}
$this->xml_parser = xml_parser_create();
xml_set_object( $this->xml_parser, $this->mwXmlFunctions );
xml_set_element_handler( $this->xml_parser, 'startElement', 'endElement' );
xml_parser_set_option( $this->xml_parser, XML_OPTION_CASE_FOLDING, false );
if (!xml_parse( $this->xml_parser, $this->curlBuffer, true ) ) {
die( sprintf(
"XML error: %s at line %d",
xml_error_string( xml_get_error_code( $this->xml_parser ) ),
xml_get_current_line_number( $this->xml_parser )
) );
}
}
/**
* execCurl method
**
* Executes a curl instance after turning off buffers, retrieves
* buffer into $this->curlBuffer, and returns result of execution
* as value.
*
* Examples of use:
* $val = execCurl();
**
* @return bool Return value of curl_exec();
**/
public function execCurl( $postvars ){
$this->setCurlOpts( $postvars );
$this->curlBuffer = curl_exec( $this->ch );
return $this->curlBuffer;
}
/**
* getEditToken method
**
* getEditToken queries the MediaWiki API for an edit token, as per
* http://www.mediawiki.org/wiki/API:Edit_-_Create%26Edit_pages#Token
**/
function getEditToken(){
$postvars = array(
'action' => 'query',
'prop' => 'info|revisions',
'intoken' => 'edit',
'titles' => 'Main Page',
'format' => 'xml',
);
$val = $this->execCurl( $postvars );
if( false != strlen( $val ) ){
// Parse xml? grab cookies?
$this->doParse();
$this->editToken = $this->mwXmlFunctions->item->edittoken;
return $this->editToken;
}else{
return false;
}
}
/**
* getQuery method
**
* Retrieve and parse a query action
**
* @param $query array Query parameters, as described at
* http://www.mediawiki.org/wiki/API:Query
**/
public function getQuery( $query ){
if( false != isset( $query['titles'] ) || false != isset( $query['pageids'] ) || false != isset( $query['revids']) ){
$postvars = array();
foreach( $edit AS $key => $val ){
$postvars[$key] = $val;
}
// set after the foreach to insure the correct token, format
$postvars['action'] = 'query';
$postvars['token'] = $this->editToken;
$postvars['format'] = 'xml';
$val = $this->execCurl( $postvars );
$this->doParse();
return $val;
}
}
/**
* mwLogin method
**
* Establishes connection/session with mwAPI server
**
* @param $mwUser string Mediawiki account name
* @param $mwPass string Mediawiki account password
* @param $mwSite string Qualified url/path
**/
private function mwLogin( $mwUser, $mwPass ){
$postvars = array(
'action' => 'login',
'lgname' => $mwUser,
'lgpassword' => $mwPass,
'format' => 'xml',
);
$val = $this->execCurl( $postvars );
if( false != strlen( $val ) ){
// Parse xml? grab cookies?
$this->mwXmlFunctions = new mwApiXmlParse;
$this->doParse();
}
}
/**
* mwLogout method
**
* Get a logout from the MediaWiki API, destroying the login token
*/
private function mwLogout(){
$postvars = array(
'action' => 'logout',
'format' => 'xml',
);
$val = $this->execCurl( $postvars );
$this->doParse();
}
/**
* setCurlOpts method
**
* Set the usual cURL options, plus postvars if passed.
**
* @param $postvars array variable number of POST variables
* for API.
**/
public function setCurlOpts( $postvars ){
if( is_array( $postvars) ){
// FINDOUT: do we need to urlencode these?
curl_setopt( $this->ch, CURLOPT_POST, true );
curl_setopt( $this->ch, CURLOPT_POSTFIELDS, $postvars );
}
curl_setopt( $this->ch, CURLOPT_COOKIESESSION, true );
curl_setopt( $this->ch, CURLOPT_COOKIEJAR, 'cookies.txt' );
curl_setopt( $this->ch, CURLOPT_RETURNTRANSFER, true );
}
/**
* setEdit method
**
* Send an edit to the API after simple validation.
* title required Page title
* text required Raw wiki syntax
*
**
* @param $edit array An array of edit parameters, described above.
* @return bool false = error returned from API
**/
public function setEdit( $edit ){
$val = false;
// Check that at least page title, page content, and edit token are set.
if( false != strlen( $edit['title'] ) && false != strlen( $edit['text'] ) && false != strlen( $this->editToken ) ){
$postvars = array();
foreach( $edit AS $key => $val ){
$postvars[$key] = $val;
}
// set after the foreach to insure the correct token, format
$postvars['action'] = 'edit';
$postvars['token'] = $this->editToken;
$postvars['format'] = 'xml';
$val = $this->execCurl( $postvars );
$this->doParse();
return $val;
}
}
}