User:Botodo/Source

From Wikipedia, the free encyclopedia

<?php
# log in credentials should be included here
require_once('botodologin');
# Snoopy should be set so the host name is en.wikipedia.org.
require_once('Snoopy.class.php');
 
$bot = new Snoopy();
 
define("debugon", $_GET["debug"]);
define("editinterval", 60);
define("wikiroot", "http://en.wikipedia.org/w/index.php?");
 
function debug($b="Ping", $t="", $a="") {
        if (debugon){
                print "<br><b>$b</b> $t <a href='$a'>$a</a><br>";
        }
}
 
function content($title) {
        // Returns the raw wikitext, unless there's a bot prohibition, in which case it returns false.
        global $bot;
        $bot->fetchtext(wikiroot . "title=" . $title . "&action=raw");
        $rawtext = $bot->results;
        if (!preg_match("/{{nobots}}|{{bots|deny=[^}]*(" . USERNAME . "|all)[^}]*}}|{{bots|allow=none}}/", $rawtext)) return $rawtext;
        return false;
}
 
function countMainLinks($title) {
        // Counts the links to the mainpage
        global $bot;
        if(preg_match("/\w*:(.*)/", $title, $title)) $title = $title[1]; //Gets {{PAGENAME}}
 
        $url = wikiroot . "title=Special%3AWhatlinkshere&target=$title&limit=500&namespace=$namespace&from=$offset";
        $bot->fetchtext($url);
        debug("Just fetched:", '"What links here", URL:', $url);
        $response = explode("\n", $bot->results);
        return count($response) - 68;
}
function whatTranscludes($title, $namespace = false /* 0 = main */, $limit = 10000, $offset = 0) {
        // Returns an array of links to a specified page.
        global $bot;
        $url = wikiroot . "title=Special%3AWhatlinkshere&target=Template:" . urlencode($title) . "&limit=" . $limit . "&namespace=$namespace&from=$offset";
        $bot->fetchtext($url);
        debug("Just fetched:", '"What links here", URL:', $url);
        $response = $bot->results;
        if (preg_match_all("/(500\)|\n)([^\|]*)( \(transclusion\))? +\(links\)/U", $response, $links)) {
                debug("Number of results:", count($links[2]));
                return $links[2];
        }
        return false;
}
 
function nextTransclusion($title, $namespace = false /* 0 = main */) {
        // Returns an array of links to a specified page.
        global $bot;
        global $offset;
        $url = wikiroot . "title=Special%3AWhatlinkshere&target=Template:" . urlencode($title) . "&limit=1&namespace=$namespace&from=$offset";
        $bot->fetch($url);
        $page = $bot->results;
        preg_match("/from=(\d*)&amp;back=.*>next<\/a>/U", $page, $nextoffset); 
        preg_match("|/wiki/[^\$]*/wiki/([^\"]*)\"|Us", $page, $articlename); 
        debug("Just fetched:", '"What links here", Offset was ' . $nextoffset[1] . ', URL:', $url);
 
        $offset = $nextoffset[1];
        return $articlename[1];
        return false;
}
 
function logIn($username, $password) {
 
        global $bot;  
        $loginUrl = wikiroot . "title=Special:Userlogin&action=submitlogin&type=login";
        $submit_vars["wpName"] = $username;
        $submit_vars["wpPassword"] = $password;
        $submit_vars["wpRemember"] = 1;
        $submit_vars["wpLoginattempt"] = "Log+in";
 
        $bot->submit($loginUrl, $submit_vars);
        debug("Logging in:", "as " . $username . " at", $loginUrl);
        if (ereg("You have successfully signed in to Wikipedia", $bot->results)) return true;
        debug("Login failed!"); return false;
}
 
function write($page, $data, $editsummary = "Bot edit") {
 
        global $bot;
 
        //Load edit page so we can scrape starttimes
        $editUrl = wikiroot . "title=$page&action=edit";
 
        $bot->fetchform($editUrl);
        $form = $bot->results;
        preg_match_all("~name=\"(.*)\"~U", $form, $name);
        preg_match_all("~value=\"(.*)\"~U", $form, $value);
        for ($i= 15; $i>=0; $i--) $value[1][$i] = $value[1][$i-1]; //Aligns name and value; textarea and form name combine to knock them adrift.
 
        //Save the variable set on the edit page
        $page_vars = array_combine($name[1], $value[1]);
 
        //Set our post vars to the values of the inputs:
        $submit_vars["wpEdittime"] = $page_vars["wpEdittime"];
        $submit_vars["wpStarttime"] = $page_vars["wpStarttime"];
        $submit_vars["wpEditToken"] = $page_vars["wpEditToken"];
 
        // The less glamorous post vars also need setting:
        $submit_vars["wpScrollTop"] = "0";
        $submit_vars["wpSection"] = "";
        $submit_vars["wpTextbox1"] = $data;
        $submit_vars["wpSummary"] = $editsummary;
        $submit_vars["wpMinoredit"] = 1;
        $submit_vars["wpWatchthis"] = 0;
 
        // Set this var to determine the action - Save page!
        $submit_vars["wpSave"] = "Save+page";
 
        $submitUrl = wikiroot . "title=$page&action=submit";
        debug("Attempting to edit:", $page, $submitUrl);
        debug("with variables:", "Starttime: " . $submit_vars["wpStarttime"] . " -  Edit time:" . $submit_vars["wpEdittime"] . " - Edit token: " . $sumbit_vars["wpEditToken"]);
        $bot->submit($submitUrl, $submit_vars);
        debug("Edit made", "to $page"); 
}
 
print "<html><head><title>Botodo</title></head><body>";
debug("Welcome to BoToDo!", "Debug mode is <b>on</b>");
 
logIn(USERNAME, PASSWORD);
 
for ($i = 1; $i<10; $i++) {
        $starttime = time();
        $page = nextTransclusion("Todo", false);
        $nolinks = countMainLinks($page);
        print "Found <b>$nolinks</b> links regarding to do box at <a href='" . wikiroot . "title=$page'>$page</a>;\n";
        if ($nolinks < 3) $p = 9;
        else if ($nolinks < 6) $p=8;
        else if ($nolinks < 11) $p=7;
        else if ($nolinks < 21) $p=6;
        else if ($nolinks < 51) $p=5;
        else if ($nolinks < 101) $p=4;
        else if ($nolinks < 251) $p=3;
        else if ($nolinks < 501) $p=2;
        else $p=1;
        print "Assigning priority <b>$p</b>...\n\n";
        $bot->fetchtext(wikiroot . "title=$page&action=raw");
        $pagecode = $bot->results;
        write($page, preg_replace("~{{todo(\|small=[^\|\}]*)?(\|list=[^\|\}]*)?(\|\d)?}}~U", "{{todo$1$2|$p}}", $pagecode), "[[Category:To do, by priority|Categorising]] To Do box as priority $p");
        $endtime = time();
        $timetaken = $endtime - $starttime;
        print "  <em>Done</em> in ${timetaken}s.<br>\n\n";
        sleep(editinterval-$timetaken);
        print "<br>Catching my breath for " . editinterval-$timetaken." seconds...<br><br>";
}