Extension:AddPageService/AddPageService.php

<?php // Web service to add pages to the wiki. // Copyright (c) 2007, Benner Sistemas SA. // Homepage: http://www.mediawiki.org/wiki/Extension:AddPageService // Author: Fernando Correia // Version: 1.0.1

// Customization required: $wiki_root_url="http://server/wiki"; # Base URL of your wiki include "/php/Snoopy-1.2.3/Snoopy.class.php"; # Location of the Snoopy class $debug_file_name = "/temp/addpage_debug.txt"; $strict_title_rules = true; // End of customization section

require_once ('SOAP/Server.php'); require_once ('SOAP/Disco.php');

class AddPageService {   var $__dispatch_map = array;

function AddPageService {       // Define the signature of the dispatch map on the Web services method // Necessary for WSDL creation $this->__dispatch_map['addPage']=array (           'in'  => array                ( 'title'   => 'string', 'text'    => 'string', 'user'    => 'string', 'password' => 'string' ),           'out' => array('result' => 'string'),            ); }

function addPage($title, $text, $user, $password) {       // Validate parameters if (empty($title)) return "Title is required.";

if (empty($text)) return "Text is required.";

if (empty($user)) return "User is required.";

if (empty($password)) return "Password is required.";

// Fill web form $result=AddPageService::fillForm($title, $text, $user, $password); return $result; }

private static function fillForm($title, $text, $user, $password) {       global $wiki_root_url; global $debug_file_name; $login_url              =$wiki_root_url. "/index.php?title=Special:Userlogin&action=submitlogin"; # Set the username and password below: $login_vars['wpName']=$user; $login_vars['wpPassword']=$password; $login_vars['wpRemember']="0"; # Login to Wiki $snoopy                 =new Snoopy;

if (!$snoopy->submit($login_url, $login_vars)) return "Error submiting login form.";

if (strpos($snoopy->results, 'errorbox') !== false) { if (!empty($debug_file_name)) { $fp = fopen($debug_file_name, "w"); fwrite($fp, $editpage); fclose($fp); }                   return "Login error."; }

# Make safe title for URL $restricted_characters = array; $restricted_characters[] ='#'; $restricted_characters[] ='<'; $restricted_characters[] ='>'; $restricted_characters[] ='['; $restricted_characters[] =']'; $restricted_characters[] ='|'; $restricted_characters[] ='{'; $restricted_characters[] ='}'; global $strict_title_rules; if ($strict_title_rules) { $restricted_characters[] ='+'; $restricted_characters[] ='/'; $restricted_characters[] =':'; $restricted_characters[] ='?'; $restricted_characters[] ='%'; $restricted_characters[] ='`'; $restricted_characters[] =utf8_encode('–'); // n-dash, not hyphen $restricted_characters[] =utf8_encode('—'); // m-dash, not hyphen }       $title=str_replace($restricted_characters, ' ', $title); $safetitle=str_replace(" ", "_", trim($title));

# Submit to edit page for $title and get contents into $editpage $url     =$wiki_root_url. "/index.php?title=". $safetitle. "&action=edit";

if (!$snoopy->fetch($url)) return "Error fetching edit form.";

$editpage=$snoopy->results;

if (!empty($debug_file_name)) { $fp = fopen($debug_file_name, "w"); fwrite($fp, $editpage); fclose($fp); }

# Pick out Edit Token $ans    =preg_match('/.*value="(.*?)".*name="wpEditToken"/', $editpage, $matches);

if (empty($matches[1])) return "No edit token on the web form answer.";

$edit_token=$matches[1];

# Pick out Edit Time

$ans      =preg_match('/.*value="(.*?)".*name="wpEdittime"/', $editpage, $matches);

if (empty($matches[1])) return "No edit time on the web form answer.";

$edit_time                =$matches[1];

# Set Post Variables before submitting $text                     =trim($text); $submit_vars['wpTextbox1'] =$text; $submit_vars['wpSummary'] =""; $submit_vars['wpSection'] =""; $submit_vars['wpStarttime']=gmdate('YmdHis', time); $submit_vars['wpEdittime'] =$edit_time; $submit_vars['wpSave']    ="Save page"; $submit_vars['wpEditToken']=$edit_token;

# Submit or Post to create the page if (!$snoopy->submit($wiki_root_url. "/index.php?title=". $safetitle. "&action=submit", $submit_vars)) return "Error submiting filled form.";

if (strpos($snoopy->results, 'wpTextbox1') !== false) return "Error saving the web form.";

# report success return "OK"; }

static function main {       global $_SERVER, $HTTP_RAW_POST_DATA; $server   =new SOAP_Server; $webservice=new AddPageService; $server->addObjectMap($webservice, 'http://schemas.xmlsoap.org/soap/envelope/');

if (isset($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] == 'POST') {           $server->service($HTTP_RAW_POST_DATA); }       else {           $disco=new SOAP_DISCO_Server($server, 'AddPageService'); header ("Content-type: text/xml");

if (isset($_SERVER['QUERY_STRING']) && strcasecmp($_SERVER['QUERY_STRING'], 'wsdl') == 0) {               echo $disco->getWSDL; }           else {               echo $disco->getDISCO; }           }        }    }

AddPageService::main; ?>