User:LivingBot/WikibotDev
Appearance
<?php
class Wikibot {
//edits per minute
public $epm;
//details about the current edit
public $editdetails;
//wiki where bot works
public $wiki;
//max lag to server
public $max_lag;
public function __construct($username, $password, $wiki = 'en', $epm = 5, $lag = 5)//log in the wiki
{
if (!isset($username) || !isset($password)) {
die("\r\nError: configuration variables not set\r\n");
}
$this->wiki = $this->wiki($wiki);
//set edit per minute
$this->epm = 60 / $epm;
//set max lag to server
$this->max_lag = $lag;
$this->login($username, $password, $wiki);
}
private function login($username, $password, $wiki) {
$response = $this->postAPI($wiki, 'api.php', 'action=login&lgname=' . urlencode($username) . '&lgpassword=' . urlencode($password));
if ($response['login']['result'] != "Success") {
if (isset($response['login']['wait']) || (isset($response['error']['code']) && $response['error']['code'] == "maxlag")) {
echo "Forced by server to wait. Automatically trying again.";
sleep(10);
$this->login($username, $password, $wiki);
} else {
print_r($login);
die("Login failed: " . $response['login']['result'] . "\r\n");
}
}
}
public function get_page($page, $wiki = "")//get page's content
{
$response = $this->callAPI($wiki, 'api.php?action=query&prop=revisions&titles=' . urlencode($page) . '&rvprop=content');
if (is_array($response)) {
$array = $response['query']['pages'];
$array = array_shift($array);
$pageid = $array["pageid"];
return $response['query']['pages'][$pageid]['revisions'][0]["*"];
} else {
echo "Unknown get_page error.";
return false;
}
}
public function get_cats_of_page($page, $wiki = "")//get page's categories
{
$response = $this->callAPI($wiki, 'api.php?action=query&prop=categories&titles=' . urlencode($page));
foreach ($response['query']['pages'] as $key => $value) {
foreach ($value["categories"] as $key2 => $value2) {
$cats[] = $value2["title"];
}
}
return $cats;
}
public function category($category, $limit = 500, $start = "", $ns = "all", $wiki = "")//get all the pages of a category, NOT RECURSIVE
{
sleep(10);
$url = 'api.php?action=query&list=categorymembers&cmtitle=' . urlencode("Category:" . $category) . '&cmlimit=' . $limit;
if ($ns != "all") {
$url .= "&cmnamespace=" . $ns;
}
if ($start != "") {
$url .= "&cmcontinue=" . urlencode($start);
}
$result = $this->callAPI($wiki, $url);
$cm = $result["query"]["categorymembers"];
$pages = array();
for ($i = 0; $i < count($cm); $i++) {
$pages[] = $cm[$i]["title"];
}
$next = $result["query-continue"]["categorymembers"]["cmcontinue"];
if ($next != "") {
array_push($pages, $next);
}
return $pages;
}
public function create_page($page, $text, $summary, $minor, $bot, $wiki = "")//create a new page
{
$response = $this->callAPI($wiki, "api.php?action=query&prop=info|revisions&intoken=edit&titles=" . urlencode($page));
$this->editdetails = $response["query"]["pages"];
if (!isset($this->editdetails[-1])) {
echo "Page $page already exists. Call edit_page instead.\n";
return false;
}
if ($this->put_page($page, $text, $summary, $minor, $bot, $wiki)) {
return true;
} else {
echo "<-- Error with put_page called from edit_page.\n";
return false;
}
}
public function edit_page($page, $text, $summary, $minor = false, $bot = true, $wiki = "")//edit a page which already exists
{
$response = $this->callAPI($wiki, "api.php?action=query&prop=info|revisions&intoken=edit&titles=" . urlencode($page));
$this->editdetails = $response["query"]["pages"];
if (!isset($this->editdetails[-1])) {
echo "Page $page does not already exist. Call create_page instead.\n";
return false;
}
if ($this->put_page($page, $text, $summary, $minor, $bot, $wiki)) {
return true;
} else {
echo "<-- Error with put_page called from edit_page.\n";
return false;
}
}
private function put_page($name, $newtext, $summary, $minor = false, $bot = true, $wiki = "")//edit a page, regardless of whether it exists before or not
{
$newtext = urlencode($newtext);
$oldtext = urlencode($this->get_page($name, $wiki));
$summary = urlencode($summary);
if ($newtext == $oldtext) {
//the new content is the same, nothing changes
echo "Same content: " . $name . " wasn't edited.\n";
return false;
}
if ($newtext == "") {
//the new content is void, nothing changes
echo "Error: the content is void. " . $name . " wasn't edited\n";
return false;
}
foreach ($this->editdetails as $key => $value) {
$token = urlencode($value["edittoken"]);
$sts = $value["starttimestamp"];
if (isset($this->editdetails)) {
$ts = $sts;
$extra = "&createonly=yes";
} else {
$ts = $value["revisions"][0]["timestamp"];
$extra = "&nocreate=yes";
}
}
$post = "title=$name&action=edit&basetimestamp=$ts&starttimestamp=$sts&token=$token&summary=$summary$extra&text=$newtext";
if ($bot) {
$post .= "&bot=yes";
}
if ($minor) {
$post .= "&minor=yes";
} else {
$post .= "¬minor=yes";
}
$response = $this->postAPI($wiki, 'api.php', $post);
if ($response["edit"]["result"] == "Success") {
echo "Successfully edited " . $response["edit"]["title"] . ".";
sleep($epm);
return true;
} elseif (preg_match('/^Waiting for (.*) seconds lagged/', $result)) {
echo "Error: max lag hit, not posted\n";
return false;
} else {
echo "Error - " . $response["edit"]["result"] . " ";
return false;
}
}
private function wiki($wiki)//manager wiki different from default wiki
{
if ($wiki == "") {
//if not declarated put default wiki
return $this->wiki;
} elseif (strpos($wiki, "://") == false) {
//if is a mediawiki project the user write only code language
return "http://" . $wiki . ".wikipedia.org/w/";
}
//if it is a other wiki project
return $wiki;
}
private function callAPI($wiki, $url, $format = "php") {
$wiki = $this->wiki($wiki);
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_URL, ($wiki . $url . "&maxlag=" . $this->max_lag . "&format=$format"));
$response = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return unserialize($response);
}
private function postAPI($wiki, $url, $postdata = "") {
$wiki = $this->wiki($wiki);
$ch = curl_init();
$url = $wiki . $url;
if ($postdata !== "") {
$postdata .= "&";
}
$postdata .= "format=php&maxlag=" . $this->max_lag;
echo "Final postdata: $postdata";
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt($ch, CURLOPT_POSTFIELDS, $postdata);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/x-www-form-urlencoded;charset=UTF-8'));
curl_setopt($ch, CURLOPT_HEADER, false);
$response = curl_exec($ch);
if (curl_errno($ch)) {
return curl_error($ch);
}
curl_close($ch);
return unserialize($response);
}
}
//end class
?>