User:MPUploadBot/Source
The following is automatically generated by X!'s adminbot.
Bot Hierarchy
- bot.php
- bot2.php
- functions.php
- classes.php
- adminpass.php
- nickpass.php
- Images/
- tmp/
Source code
bot.php
|
|---|
<?php
/* Copyright (C) 2008 Soxred93 - http://en.wikipedia.org/wiki/User:X!
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
include( "./functions.php" );
initialize();
checkEnable();
postSource();
purgeCache();
deleteImages();
process('Wikipedia:Main Page/Tomorrow');
process('Main Page');
echo "DONE!!!\n";
?>
|
bot2.php
|
|---|
<?php
/* Copyright (C) 2008 Soxred93 - http://en.wikipedia.org/wiki/User:X!
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., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
include( "./functions.php" );
initialize();
checkEnable();
purgeCache();
//Get to the RC feed
while(1) {
$feed = fsockopen('irc.wikimedia.org',6667,$ircerrno,$ircerrstr,30);
if (!$feed) {
sleep(10);
$feed = fsockopen('irc.wikimedia.org',6667,$ircerrno,$ircerrstr,30);
if (!$feed) die($feederrstr.' ('.$feederrno.')');
}
$feedchannel = '#en.wikipedia';
fwrite($feed,'USER SoxAdminBot "1" "1" :SoxBot Wikipedia Bot.'."\n");
fwrite($feed,'NICK SoxAdminBot'."\n");
while (!feof($feed)) {
$rawline = fgets($feed,1024);
$line = str_replace(array("\n","\r","\002"),'',$rawline);
$line = preg_replace('/\003(\d\d?(,\d\d?)?)?/','',$line);
//echo 'FEED: '.$line."\n";
if (!$line) { fclose($feed); break; }
$linea= explode(' ',$line,4);
if (strtolower($linea[0]) == 'ping') {
fwrite($feed,'PONG '.$linea[1]."\n");
} elseif (($linea[1] == '376') or ($linea[1] == '422')) {
fwrite($feed,'JOIN '.$feedchannel."\n");
} elseif ((strtolower($linea[1]) == 'privmsg') and (strtolower($linea[2]) == strtolower($feedchannel))) {
$message = substr($linea[3],1);
if (preg_match('/^\[\[((Talk|User|Wikipedia|Image|File|MediaWiki|Template|Help|Category|Portal|Special)(( |_)talk)?:)?([^\x5d]*)\]\] (\S*) (http:\/\/en\.wikipedia\.org\/w\/index\.php\?diff=(\d*)&oldid=(\d*)|http:\/\/en\.wikipedia\.org\/wiki\/\S+)? \* ([^*]*) \* (\(([^)]*)\))? (.*)$/S',$message,$m)) {
$messagereceived = microtime(1);
$change['namespace'] = $m[1];
$change['title'] = $m[5];
$change['flags'] = $m[6];
$change['url'] = $m[7];
$change['revid'] = $m[8];
$change['old_revid'] = $m[9];
$change['user'] = $m[10];
$change['length'] = $m[12];
$change['comment'] = $m[13];
//echo $change['namespace'];
if ($change['namespace'] == 'Wikipedia:' || $change['namespace'] == 'Template:') {
echo $change['title']."\n";
if ($change['title'] == 'Today\'s featured article/'.date('F j, Y') ||
$change['title'] == 'Did you know' ||
$change['title'] == 'In the news' ||
$change['title'] == 'Selected anniversaries'.date('F j') ||
$change['title'] == 'POTD protected/'.date('Y-m-d') ) {
process($change['namespace'].$change['title']);
}
}
elseif ($change['namespace'] == 'User' && $change['title'] == 'MPUploadBot/Run' ) {
checkEnable();
}
}
}
}
}
?>
|
functions.php
|
|---|
<?php
include('./classes.php');
//Setup the classes
$http = new http;
$wpapi = new wikipediaapi;
$wpq = new wikipediaquery;
$wpi = new wikipediaindex;
$user = 'MPUploadBot';
function initialize() {
global $wpapi, $user;
include( './adminpass.php' );//Password
echo "Logging in...\n";
$wpapi->login( $user,$pass );//Login
unset( $pass ); //Security reasons
return $user;
}
function checkEnable() {
global $wpq, $user;
echo "\nChecking if bot is enabled...\n";
$run = $wpq->getpage( 'User:'.$user.'/Run' );
if ( !preg_match( '/(yes|enable|true)/iS',$run ) ) {
irc("!admin@commons - X!'s adminbot is disabled. Please make sure all images on the Main Page are protected.", '#wikimedia-commons');
irc("!admin - X!'s adminbot is disabled. Please make sure all images on the Main Page are protected.", '#wikipedia-en-admins');
irc("!admin - X!'s adminbot is disabled. Please make sure all images on the Main Page are protected.", '#wikipedia-en-alerts');
die( "Bot Disabled\n" );
}
unset( $run );
return true;
}
function postSource() {
//Post the source code
global $wpi, $user;
echo "\nPosting source code...\n";
$wpi->forcepost('User:'.$user.'/Source',
"The following is automatically generated by [[User:X!|]]'s adminbot.\n\n" .
"==Bot Hierarchy==\n*bot.php\n*bot2.php\n*functions.php\n*classes.php\n*adminpass.php\n*nickpass.php\n*Images/\n*tmp/\n\n" .
"==Source code==\n" .
"{{collapse top|bot.php}}\n<pre>".htmlentities(file_get_contents('./bot.php'))."</pre>\n{{collapse bottom}}\n" .
"{{collapse top|bot2.php}}\n<pre>".htmlentities(file_get_contents('./bot2.php'))."</pre>\n{{collapse bottom}}\n" .
"{{collapse top|functions.php}}\n<pre>".htmlentities(file_get_contents('./functions.php'))."</pre>\n{{collapse bottom}}\n" .
"{{collapse top|classes.php}}\n<pre>".htmlentities(file_get_contents('./classes.php'))."</pre>\n{{collapse bottom}}" ,
'Automated source upload.');
}
function purgeCache() {
global $http;
echo "\nPurging cache...\n";
$check = $http->get( 'http://en.wikipedia.org/w/api.php?action=purge&titles=Main_Page&format=php' );
$check = unserialize( $check );
//print_r($check);
if ( !isset( $check['purge'][0]['purged'] ) ) {
print_r($check);
die( "An error occured while logging in.\n" );
}
else {
echo "Sucessfully purged cache.\n";
}
}
function deleteImages() {
global $http, $wpapi, $wpq, $wpi;
echo "\nFinding images not used anymore...\n";
$currlist = file('./images.txt');
sleep(3);
$currlist2 = array();
foreach ($currlist as $li) {
if (preg_match('/\w/', $li)) {
$currlist2[] = $li;
}
}
//print_r($currlist2);
if ($currlist2[0] != '' && isset($currlist2[0])) {
foreach($currlist2 as $key => $image) {
$currlist2[$key] = str_replace("\n", "", $image);
}
echo "\nImages are: ".implode(', ', $currlist2)."\n";
foreach( $currlist2 as $image ) {
if ($image == '') { continue; }
$titles = array();
$continue = null;
$iu = imageusage($image,$continue);
foreach ($iu as $data) { $titles[] = $data['title']; }
while (isset($iu[4999])) {
$iu = imageusage($image,$continue);
foreach ($iu as $data) { $titles[] = $data['title']; }
}
//print_r($titles);
sleep(3);
if (!in_array('Main Page', $titles) && !in_array('Wikipedia:Main Page/Tomorrow', $titles)) {
//Let's delete it!
if ( $wpq->getpageid( $image ) === -1 ) {
echo "\nAlready deleted...\n";
remtext($image);
continue;
}
$list = getTemplates($image);
echo "\nTemplates are: ".implode(', ', $list)."\n";
//print_r($list);
if (in_array('Template:C-uploaded', $list)) {
echo "\nDeleting $image...\n";
$r = $wpi->delete($image, 'BOT EDIT: No longer on Main Page');
if (!isset($r['delete']['title']) && !isset($r['delete']['reason'])) {
print_r($r);
die('Error when deleting.');
}
else {
$wpi->unprotect($image, 'BOT EDIT: No need for protection.');
}
if (is_file('/Images/'.$image)) {
unlink('/Images/'.$image);//Remove the local copy, to save space
}
sleep(3);
if (delrevs($image) === true) {
echo "\nRestoring $image...\n";
undelete($image);
}
remtext($image);
}
}
}
}
}
function remtext($image) {
$file = file('./images.txt');
echo "Removing $image from images.txt.\n";
//print_r($file);
foreach ($file as $key => $value) {
if ($value == $image || $value == '' || $value == "\n") {
unset($file[$key]);
}
}
//print_r($file);
file_put_contents('./images.txt', '');
foreach ($file as $line) {
file_put_contents('./images.txt', $line."\n");
}
}
function isUploadedLocally( $image ) {
global $http, $wpq;
$x = $http->get('http://en.wikipedia.org/w/api.php?action=query&prop=revisions&titles='.urlencode($page).'&rvlimit=1&rvprop=timestamp&format=php');
$x = unserialize($x);
if ($x['query']['pages'][$wpq->getpageid($page)]['imagerepository'] != 'local') {
return false;
}
else {
return true;
}
}
function process($title = 'Wikipedia:Main Page/Tomorrow') {
global $wpq, $wpapi, $wpi, $http;
$list = exclude(getImages( $title ));
print_r($list);
foreach( $list as $image ) {
$image = "Image:".$image;
$imagepage = false;
if ( $wpq->getpageid( $image ) !== -1 ) {
if (isUploadedLocally($image)) {
echo "\nExists locally...\n";continue;
}
else {
$imagepage = true;
}
}
if ( checkEdit( $image ) === false ) { echo "\nEdited in last 24 hours...\n";continue; }
if ( fullprotect( $image ) === true ) { echo "\nProtected locally on Commons...\n";continue; }
echo "\nGetting url of $image...\n";
$url = getUrl( $image );
echo "\nDownloading $image...\n";
downloadImage( $url, './Images/'.$image );
$text = $http->get( 'http://commons.wikimedia.org/w/api.php?action=query&prop=revisions&format=php&titles='.urlencode($image).'&rvprop=content' );
$text = unserialize( $text );
$text = $text['query']['pages'];
foreach ($text as $key => $data) {
$text2 = $data['revisions'][0]['*'];
}
if (preg_match('/\{\{En main page\}\}/i', $text2)) { echo "\nProtected locally on Commons...\n";continue; }
$text2 = str_ireplace("[[", "[[commons:", $text2);//Replace wikilinks with interwiki links
$text = "{{C-uploaded}}\n\n".$text2;
echo "\nUploading $image...\n";
$image2 = explode(':', $image);
if ( in_array( $image, file( './images.txt' ) ) ) { echo "\nHmm, why isn't it uploaded yet?\n"; }
$wpi->upload($image2[1], './Images/'.$image, $text);
if ($imagepage == true) {
$wpi->post($image, $text, 'BOT EDIT: Adding summary from Commons.');
}
$wpi->protect($image, 'BOT EDIT: Protecting image on Main Page.');
if (is_file('/Images/'.$image)) {
unlink('/Images/'.$image);//Remove the local copy, to save space
}
file_put_contents('./images.txt', file_get_contents('./images.txt').$image."\n");//Add it to the list of protected images
sleep(3);
}
}
//Checks to see if it was edited in the last 10 minutes
function checkEdit($image) {
echo "\nChecking if $image was edited in the last 24 hours...\n";
if (lastedit($image) > strtotime('-24 hours')) {
irc("!admin@commons - Please protect [[$image]], as it is on the Main Page.", '#wikimedia-commons');
irc("!admin - Please upload [[$image]] from Commons, as it is on the Main Page.", '#wikipedia-en-admins');
irc("!admin - Please upload [[$image]] from Commons, as it is on the Main Page.", '#wikipedia-en-alerts');
return false;
}
else {
return true;
}
}
function lastEdit($page) {
echo "\nFinding last edit to $page...\n";
//Returns the timestamp of the last edit to $page
global $http, $wpapi, $wpq;
$x = $http->get('http://commons.wikimedia.org/w/api.php?action=query&prop=revisions&titles='.urlencode($page).'&rvlimit=1&rvprop=timestamp&format=php');
$x = unserialize($x);
$timestamp = $x['query']['pages'][$wpq->getpageid($page)]['revisions'][0]['timestamp'];
return strtotime($timestamp);
}
function downloadImage($url,$local) {
//Downloads the image to upload
$out = fopen($local, 'w');
$ch = curl_init();
curl_setopt($ch, CURLOPT_FILE, $out);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_exec($ch);
curl_close($ch);
}
function getUrl($image) {
//Returns the url of the Commons image
global $http, $wpapi, $wpq;
$x = $http->get('http://commons.wikimedia.org/w/api.php?action=query&titles='.urlencode($image).'&prop=imageinfo&iiprop=url&iilimit=1&format=php');
$x = unserialize($x);
$file = $x['query']['pages'];
foreach ($file as $img) {
$file = $img['imageinfo'][0]['url'];
}
if (!$file) {
die('Image not found');
}
return $file;
}
function imageusage($image, &$continue = null) {
//Returns an array with all pages that use $image
global $http, $wpapi, $wpq;
echo "Getting image usage...\n";
if ($continue != null) {
$append = '&iucontinue='.urlencode($continue);
} else {
$append = '';
}
$x = $http->get($wpapi->apiurl.'?action=query&list=imageusage&iutitle='.urlencode($image).'&format=php&iulimit=5000'.$append);
$x = unserialize($x);
$continue = $x['query-continue']['imageusage']['iucontinue'];
return $x['query']['imageusage'];
}
function getImages($page) {
//Returns an array with all the images on $page
echo "Getting images on $page...\n";
global $http, $wpapi, $wpq;
$x = $http->get($wpapi->apiurl.'?action=query&titles='.urlencode($page).'&prop=images&imlimit=500&format=php');
$x = unserialize($x);
$id = $wpq->getpageid($page);
foreach ($x['query']['pages'][$id]['images'] as $links) {
$images[] = str_replace('Image:','',$links['title']);
}
return $images;
}
function getTemplates($page) {
//Returns an array with all the templates on $page
echo "Getting templates...\n";
global $http, $wpapi, $wpq;
$x = $http->get($wpapi->apiurl.'?action=query&titles='.urlencode($page).'&prop=templates&tllimit=500&format=php');
$x = unserialize($x);
foreach ($x['query']['pages'][$wpq->getpageid($page)]['templates'] as $links) {
$templates[] = $links['title'];
}
return $templates;
}
function irc($message,$channel) {
include('nickpass.php');
$nick = 'SoxBotNotifier';
$socket = fsockopen("irc.freenode.net", 6667, $en, $es, 30);
if (!$socket) {
echo 'Error: '.$es.' ('.$en.')'."\n";
return false;
}
fwrite($socket, 'USER '.$nick.' "toolserver.org" "Main Page" :'.$nick."\n");
fwrite($socket, 'NICK '.$nick."\n");
fwrite($socket, 'PASS '.$nickpass."\n");
while (!feof($socket)) {
$data = str_replace(array("\r","\n"),'',fgets($socket,512));
$darr = explode(' ',$data);
echo $data."\n";
if (strtolower($darr[0]) == 'ping') {
fwrite($socket, 'PONG '.$darr[1]."\n");
} elseif (($darr[1] == '376') or ($darr[1] == '422')) {
fwrite($socket, 'JOIN '.$channel."\n");
} elseif ((strtolower($darr[1]) == 'mode') and ((($darr[2]{0} == ':')?substr($darr[2],1):$darr[2]) == '+v') and (strtolower(($darr[3]{0} == ':')?substr($darr[3],1):$darr[3]) == strtolower($nick))) {
fwrite($socket, 'PRIVMSG '.$channel.' :'.$message."\n");
fwrite($socket, 'QUIT :No longer needed.'."\n");
fclose($socket);
}
}
return true;
}
function exclude($list) {
//Returns $list excluding anything listed on the exclude list
global $http, $wpapi, $wpq, $user;
$x = $wpq->getpage('User:'.$user.'/Exclude List.js'); //Get the exclude list
$exclude = explode(chr(10), $x);
foreach ($exclude as $e) { //Parse it
if (!preg_match('/^#/',$e)) {
$exclude_list[] = $e;
}
}
foreach ($list as $l) {
$add = true;
foreach ($exclude_list as $e) {
if ($e == $l) {
$add = false;
break;
}
}
if ($add) {
$cleaned_list[] = $l;
}
}
return $cleaned_list;
}
function fullprotect($page) {
//returns true if the page is full protected
global $wpapi, $http, $wpq;
$x = $http->get('http://commons.wikimedia.org/w/api.php?action=query&titles='.urlencode($page).'&prop=info&inprop=protection&format=php');
$x = unserialize($x);
//print_r($x);
foreach( $x['query']['pages'] as $y) {
if ($y['protection'][0]['level'] == 'sysop') {
return true;
}
else {
return false;
}
}
}
function delrevs($page) {
global $wpapi, $http, $wpq, $user;
$x = $http->get('http://en.wikipedia.org/w/api.php?action=query&list=deletedrevs&titles='.urlencode($page).'&format=php');
$x = unserialize($x);
if (count($x['query']['deletedrevs'][0]['revisions']) > 2 ) {
foreach($x['query']['deletedrevs'][0]['revisions'] as $rev) {
if ($rev['user'] != $user) {
return true;
}
}
return false;
}
else {
return false;
}
}
function undelete($page) {
global $wpapi, $http, $wpq, $user, $user;
$x = $http->get('http://en.wikipedia.org/w/api.php?action=query&list=deletedrevs&drprop=token|user&titles='.urlencode($page).'&format=php');
$x = unserialize($x);
$token = htmlspecialchars($x['query']['deletedrevs'][0]['token']);
$post = array();
$users = $x['query']['deletedrevs'][0]['revisions'];
$timestamps = array();
foreach($users as $rev) {
echo $rev['user'];
if ($rev['user'] != $user) {
$timestamps[] = $rev['timestamp'];
}
}
if (!isset($timestamps[0])) {
return false;
}
print_r($timestamps);
$post['token'] = $token;
$post['reason'] = 'BOT EDIT: Restoring Wikipedia specific edits.';
$post['timestamps'] = implode("|", $timestamps);
$http->post('http://en.wikipedia.org/w/api.php?action=undelete&title='.urlencode($page).'&format=php',$post);
}
?>
|
classes.php
|
|---|
<?PHP
class http {
private $ch;
private $uid;
public $postfollowredirs;
public $getfollowredirs;
function data_encode ($data, $keyprefix = "", $keypostfix = "") {
assert( is_array($data) );
$vars=null;
foreach($data as $key=>$value) {
if(is_array($value)) $vars .= $this->data_encode($value, $keyprefix.$key.$keypostfix.urlencode("["), urlencode("]"));
else $vars .= $keyprefix.$key.$keypostfix."=".urlencode($value)."&";
}
return $vars;
}
function __construct () {
$this->ch = curl_init();
$this->uid = dechex(rand(0,99999999));
curl_setopt($this->ch,CURLOPT_COOKIEJAR,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_COOKIEFILE,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_MAXCONNECTS,100);
curl_setopt($this->ch,CURLOPT_CLOSEPOLICY,CURLCLOSEPOLICY_LEAST_RECENTLY_USED);
$this->postfollowredirs = 0;
$this->getfollowredirs = 1;
}
function post ($url,$data) {
// echo 'POST: '.$url."\n";
$time = microtime(1);
curl_setopt($this->ch,CURLOPT_URL,$url);
curl_setopt($this->ch,CURLOPT_COOKIEJAR,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_COOKIEFILE,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->postfollowredirs);
curl_setopt($this->ch,CURLOPT_MAXREDIRS,10);
curl_setopt($this->ch,CURLOPT_HEADER,0);
curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($this->ch,CURLOPT_TIMEOUT,30);
curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($this->ch,CURLOPT_POST,1);
// curl_setopt($this->ch,CURLOPT_POSTFIELDS, substr($this->data_encode($data), 0, -1) );
curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data);
$data = curl_exec($this->ch);
//var_dump($data);
//echo 'POST: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n";
return $data;
}
function get ($url) {
//echo 'GET: '.$url."\n";
$time = microtime(1);
curl_setopt($this->ch,CURLOPT_URL,$url);
curl_setopt($this->ch,CURLOPT_COOKIEJAR,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_COOKIEFILE,'./tmp/cookies.dat');
curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->getfollowredirs);
curl_setopt($this->ch,CURLOPT_MAXREDIRS,10);
curl_setopt($this->ch,CURLOPT_HEADER,0);
curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($this->ch,CURLOPT_TIMEOUT,30);
curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($this->ch,CURLOPT_HTTPGET,1);
$data = curl_exec($this->ch);
//var_dump($data);
//echo 'GET: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n";
return $data;
}
function __destruct () {
curl_close($this->ch);
//@unlink('/tmp/cluewikibot.cookies.dat');
}
}
class wikipediaquery {
private $http;
private $api;
public $queryurl = 'http://en.wikipedia.org/w/query.php'; //Obsolete, but kept for compatibility purposes.
function __construct () {
global $__wp__http;
if (!isset($__wp__http)) {
$__wp__http = new http;
}
$this->http = &$__wp__http;
$this->api = new wikipediaapi;
}
private function checkurl() {
$this->api->apiurl = str_replace('query.php','api.php',$this->queryurl);
}
function getpage ($page) {
$this->checkurl();
// $ret = unserialize($this->http->get($this->queryurl.'?what=content&format=php&titles='.urlencode($page)));
// foreach ($ret['pages'] as $page) {
// return $page['content']['*'];
// }
$ret = $this->api->revisions($page,1,'older',true,null,true,false,false,false);
return $ret[0]['*'];
}
function getpageid ($page) {
$this->checkurl();
// $ret = unserialize($this->http->get($this->queryurl.'?what=content&format=php&titles='.urlencode($page)));
// foreach ($ret['pages'] as $page) {
// return $page['id'];
// }
$ret = $this->api->revisions($page,1,'older',false,null,true,false,false,false);
return $ret['pageid'];
}
function contribcount ($user) {
$this->checkurl();
// $ret = unserialize($this->http->get($this->queryurl.'?what=contribcounter&format=php&titles=User:'.urlencode($user)));
// foreach ($ret['pages'] as $page) {
// return $page['contribcounter']['count'];
// }
$ret = $this->api->users($user,1,null,true);
if ($ret !== false) return $ret[0]['editcount'];
return false;
}
}
class wikipediaapi {
private $http;
public $apiurl = 'http://en.wikipedia.org/w/api.php';
function __construct () {
global $__wp__http;
if (!isset($__wp__http)) {
$__wp__http = new http;
}
$this->http = &$__wp__http;
}
function login ($user,$pass) {
$data = $this->http->post($this->apiurl.'?action=login&format=php',array('lgname' => $user, 'lgpassword' => $pass));
//print_r(unserialize($data));
// if ($data) echo $data."\n\n";
}
function getedittoken () {
$x = $this->http->get($this->apiurl.'?action=query&format=php&prop=info&intoken=edit&titles=Main%20Page');
$x = unserialize($x);
foreach ($x['query']['pages'] as $y) {
return $y['edittoken'];
}
}
function recentchanges ($count = 10,$namespace = null,$dir = 'older',$ts = null) {
$append = '';
if ($ts !== null) { $append .= '&rcstart='.urlencode($ts); }
$append .= '&rcdir='.urlencode($dir);
if ($namespace !== null) { $append .= '&rcnamespace='.urlencode($namespace); }
$x = $this->http->get($this->apiurl.'?action=query&list=recentchanges&rcprop=user|comment|flags|timestamp|title|ids|sizes&format=php&rclimit='.$count.$append);
$x = unserialize($x);
return $x['query']['recentchanges'];
}
function search ($search,$limit = 10,$offset = 0,$namespace = 0,$what = 'text',$redirs = false) {
$append = '';
if ($limit != null) $append .= '&srlimit='.urlencode($limit);
if ($offset != null) $append .= '&sroffset='.urlencode($offset);
if ($namespace != null) $append .= '&srnamespace='.urlencode($namespace);
if ($what != null) $append .= '&srwhat='.urlencode($what);
if ($redirs == true) $append .= '&srredirects=1';
else $append .= '&srredirects=0';
$x = $this->http->get($this->apiurl.'?action=query&list=search&format=php&srsearch='.urlencode($search).$append);
$x = unserialize($x);
return $x['query']['search'];
}
function logs ($user = null,$title = null,$limit = 50,$type = null,$start = null,$end = null,$dir = 'older') {
$append = '';
if ($user != null) $append.= '&leuser='.urlencode($user);
if ($title != null) $append.= '&letitle='.urlencode($title);
if ($limit != null) $append.= '&lelimit='.urlencode($limit);
if ($type != null) $append.= '&letype='.urlencode($type);
if ($start != null) $append.= '&lestart='.urlencode($start);
if ($end != null) $append.= '&leend='.urlencode($end);
if ($dir != null) $append.= '&ledir='.urlencode($dir);
$x = $this->http->get($this->apiurl.'?action=query&format=php&list=logevents&leprop=ids|title|type|user|timestamp|comment|details'.$append);
$x = unserialize($x);
return $x['query']['logevents'];
}
function usercontribs ($user,$count = 50,&$continue = null,$dir = 'older') {
if ($continue != null) {
$append = '&ucstart='.urlencode($continue);
} else {
$append = '';
}
$x = $this->http->get($this->apiurl.'?action=query&format=php&list=usercontribs&ucuser='.urlencode($user).'&uclimit='.urlencode($count).'&ucdir='.urlencode($dir).$append);
$x = unserialize($x);
$continue = $x['query-continue']['usercontribs']['ucstart'];
return $x['query']['usercontribs'];
}
function revisions ($page,$count = 1,$dir = 'older',$content = false,$revid = null,$wait = true,$getrbtok = false,$dieonerror = true,$redirects = false) {
$x = $this->http->get($this->apiurl.'?action=query&prop=revisions&titles='.urlencode($page).'&rvlimit='.urlencode($count).'&rvprop=timestamp|ids|user|comment'.(($content)?'|content':'').'&format=php&meta=userinfo&rvdir='.urlencode($dir).(($revid !== null)?'&rvstartid='.urlencode($revid):'').(($getrbtok == true)?'&rvtoken=rollback':'').(($redirects == true)?'&redirects':''));
$x = unserialize($x);
if ($revid !== null) {
$found = false;
if (!isset($x['query']['pages']) or !is_array($x['query']['pages'])) {
if ($dieonerror == true) die('No such page.'."\n");
else return false;
}
foreach ($x['query']['pages'] as $data) {
if (!isset($data['revisions']) or !is_array($data['revisions'])) {
if ($dieonerror == true) die('No such page.'."\n");
else return false;
}
foreach ($data['revisions'] as $data2) if ($data2['revid'] == $revid) $found = true;
unset($data,$data2);
break;
}
if ($found == false) {
if ($wait == true) {
sleep(1);
return $this->revisions($page,$count,$dir,$content,$revid,false,$getrbtok,$dieonerror);
} else {
if ($dieonerror == true) die('Revision error.'."\n");
}
}
}
foreach ($x['query']['pages'] as $key => $data) {
$data['revisions']['ns'] = $data['ns'];
$data['revisions']['title'] = $data['title'];
$data['revisions']['currentuser'] = $x['query']['userinfo']['name'];
// $data['revisions']['currentuser'] = $x['query']['userinfo']['currentuser']['name'];
$data['revisions']['continue'] = $x['query-continue']['revisions']['rvstartid'];
$data['revisions']['pageid'] = $key;
return $data['revisions'];
}
}
function users ($start = null,$limit = 1,$group = null,$reqirestart = false,&$continue = null) {
$append = '';
if ($start != null) $append .= '&aufrom='.urlencode($start);
if ($group != null) $append .= '&augroup='.urlencode($group);
$x = $this->http->get($this->apiurl.'?action=query&list=allusers&format=php&auprop=blockinfo|editcount|registration|groups&aulimit='.urlencode($limit).$append);
$x = unserialize($x);
$continue = $x['query-continue']['allusers']['aufrom'];
if (($requirestart == true) and ($x['query']['allusers'][0]['name'] != $start)) return false;
return $x['query']['allusers'];
}
function categorymembers ($category,$count = 500,&$continue = null) {
if ($continue != null) {
$append = '&cmcontinue='.urlencode($continue);
} else {
$append = '';
}
$category = 'Category:'.str_ireplace('category:','',$category);
$x = $this->http->get($this->apiurl.'?action=query&list=categorymembers&cmtitle='.urlencode($category).'&format=php&cmlimit='.$count.$append);
$x = unserialize($x);
$continue = $x['query-continue']['categorymembers']['cmcontinue'];
return $x['query']['categorymembers'];
}
function listcategories (&$start = null,$limit = 50,$dir = 'ascending',$prefix = null) {
$append = '';
if ($start != null) $append .= '&acfrom='.urlencode($start);
if ($limit != null) $append .= '&aclimit='.urlencode($limit);
if ($dir != null) $append .= '&acdir='.urlencode($dir);
if ($prefix != null) $append .= '&acprefix='.urlencode($prefix);
$x = $this->http->get($this->apiurl.'?action=query&list=allcategories&acprop=size&format=php'.$append);
$x = unserialize($x);
$start = $x['query-continue']['allcategories']['acfrom'];
return $x['query']['allcategories'];
}
function backlinks ($page,$count = 500,&$continue = null,$filter = null) {
if ($continue != null) {
$append = '&blcontinue='.urlencode($continue);
} else {
$append = '';
}
if ($filter != null) {
$append .= '&blfilterredir='.urlencode($filter);
}
$x = $this->http->get($this->apiurl.'?action=query&list=backlinks&bltitle='.urlencode($page).'&format=php&bllimit='.$count.$append);
$x = unserialize($x);
$continue = $x['query-continue']['backlinks']['blcontinue'];
return $x['query']['backlinks'];
}
function embeddedin ($page,$count = 500,&$continue = null) {
if ($continue != null) {
$append = '&eicontinue='.urlencode($continue);
} else {
$append = '';
}
$x = $this->http->get($this->apiurl.'?action=query&list=embeddedin&eititle='.urlencode($page).'&format=php&eilimit='.$count.$append);
$x = unserialize($x);
$continue = $x['query-continue']['embeddedin']['eicontinue'];
return $x['query']['embeddedin'];
}
function listprefix ($prefix,$namespace = 0,$count = 500,&$continue = null) {
$append = '&apnamespace='.urlencode($namespace);
if ($continue != null) {
$append .= '&apfrom='.urlencode($continue);
}
$x = $this->http->get($this->apiurl.'?action=query&list=allpages&apprefix='.urlencode($prefix).'&format=php&aplimit='.$count.$append);
$x = unserialize($x);
$continue = $x['query-continue']['allpages']['apfrom'];
return $x['query']['allpages'];
}
}
class wikipediaindex {
private $http;
public $indexurl = 'http://en.wikipedia.org/w/index.php';
private $postinterval = 0;
private $lastpost;
private $edittoken;
function __construct () {
global $__wp__http;
if (!isset($__wp__http)) {
$__wp__http = new http;
}
$this->http = &$__wp__http;
}
function post ($page,$data,$summery = '',$minor = false,$rv = null,$bot = true) {
global $user;
global $maxlag;
global $irc;
global $irctechchannel;
global $run;
global $maxlagkeepgoing;
$wpq = new wikipediaquery; $wpq->queryurl = str_replace('index.php','query.php',$this->indexurl);
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
if ($rv == null) $rv = $wpapi->revisions($page,1,'older',true);
if (!$rv[0]['*']) $rv[0]['*'] = $wpq->getpage($page);
//Fake the edit form.
$now = gmdate('YmdHis', time());
$token = htmlspecialchars($this->edittoken);
$tmp = date_parse($rv[0]['timestamp']);
$edittime = gmdate('YmdHis', gmmktime($tmp['hour'],$tmp['minute'],$tmp['second'],$tmp['month'],$tmp['day'],$tmp['year']));
$html = "<input type='hidden' value=\"{$now}\" name=\"wpStarttime\" />\n";
$html.= "<input type='hidden' value=\"{$edittime}\" name=\"wpEdittime\" />\n";
$html.= "<input type='hidden' value=\"{$token}\" name=\"wpEditToken\" />\n";
$html.= '<input name="wpAutoSummary" type="hidden" value="'.md5('').'" />'."\n";
if (preg_match('/'.preg_quote('{{nobots}}','/').'/iS',$rv[0]['*'])) { return false; } /* Honor the bots flags */
if (preg_match('/'.preg_quote('{{bots|allow=none}}','/').'/iS',$rv[0]['*'])) { return false; }
if (preg_match('/'.preg_quote('{{bots|deny=all}}','/').'/iS',$rv[0]['*'])) { return false; }
if (preg_match('/'.preg_quote('{{bots|deny=','/').'(.*)'.preg_quote('}}','/').'/iS',$rv[0]['*'],$m)) { if (in_array(explode(',',$m[1]),$user)) { return false; } } /* /Honor the bots flags */
if (!preg_match('/'.preg_quote($user,'/').'/iS',$rv['currentuser'])) { return false; } /* We need to be logged in */
// if (preg_match('/'.preg_quote('You have new messages','/').'/iS',$rv[0]['*'])) { return false; } /* Check talk page */
if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run')))) { return false; } /* Check /Run page */
$x = $this->forcepost($page,$data,$summery,$minor,$html,$maxlag,$maxlagkeepgoing,$bot); /* Go ahead and post. */
$this->lastpost = time();
return $x;
}
function forcepost ($page,$data,$summery = '',$minor = false,$edithtml = null,$maxlag = null,$mlkg = null,$bot = true) {
$post['wpSection'] = '';
$post['wpScrolltop'] = '';
if ($minor == true) { $post['wpMinoredit'] = 1; }
$post['wpTextbox1'] = $data;
$post['wpSummary'] = $summery;
if ($edithtml == null) {
$html = $this->http->get($this->indexurl.'?title='.urlencode($page).'&action=edit');
} else {
$html = $edithtml;
}
preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpStarttime\" /\>|U',$html,$m);
$post['wpStarttime'] = $m[1];
preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEdittime\" /\>|U',$html,$m);
$post['wpEdittime'] = $m[1];
preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEditToken\" /\>|U',$html,$m);
$post['wpEditToken'] = $m[1];
preg_match('|\<input name\=\"wpAutoSummary\" type\=\"hidden\" value\=\"(.*)\" /\>|U',$html,$m);
$post['wpAutoSummary'] = $m[1];
if ($maxlag != null) {
$x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&maxlag='.urlencode($maxlag).'&bot='.(($bot == true)?'1':'0'),$post);
if (preg_match('/Waiting for ([^ ]*): ([0-9.-]+) seconds lagged/S',$x,$lagged)) {
global $irc;
if (is_resource($irc)) {
global $irctechchannel;
foreach(explode(',',$irctechchannel) as $y) {
fwrite($irc,'PRIVMSG '.$y.' :'.$lagged[1].' is lagged out by '.$lagged[2].' seconds. ('.$lagged[0].')'."\n");
}
}
sleep(10);
if ($mlkg != true) { return false; }
else { $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); }
}
return $x;
} else {
return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post);
}
}
function diff ($title,$oldid,$id,$wait = true) {
$deleted = '';
$added = '';
$html = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=render&diff='.urlencode($id).'&oldid='.urlencode($oldid).'&diffonly=1');
if (preg_match_all('/\&\;(oldid\=|undo=)(\d*)\\\'\>(Revision as of|undo)/USs', $html, $m, PREG_SET_ORDER)) {
//print_r($m);
if ((($oldid != $m[0][2]) and (is_numeric($oldid))) or (($id != $m[1][2]) and (is_numeric($id)))) {
if ($wait == true) {
sleep(1);
return $this->diff($title,$oldid,$id,false);
} else {
die('Revision error.'."\n");
}
}
}
if (preg_match_all('/\<td class\=(\"|\\\')diff-addedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) {
//print_r($m);
foreach ($m as $x) {
$added .= htmlspecialchars_decode(strip_tags($x[2]))."\n";
}
}
if (preg_match_all('/\<td class\=(\"|\\\')diff-deletedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) {
//print_r($m);
foreach ($m as $x) {
$deleted .= htmlspecialchars_decode(strip_tags($x[2]))."\n";
}
}
//echo $added."\n".$deleted."\n";
if (preg_match('/action\=rollback\&\;from\=.*\&\;token\=(.*)\"/US', $html, $m)) {
$rbtoken = $m[1];
$rbtoken = urldecode($rbtoken);
// echo 'rbtoken: '.$rbtoken.' -- '; print_r($m); echo "\n\n";
return array($added,$deleted,$rbtoken);
}
return array($added,$deleted);
}
function rollback ($title,$user,$reason = null,$token = null,$bot = true) {
if (($token == null) or (!$token)) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
$token = $wpapi->revisions($title,1,'older',false,null,true,true);
if ($token[0]['user'] == $user) {
echo 'Token: '; print_r($token); echo "\n\n";
$token = $token[0]['rollbacktoken'];
} else {
return false;
}
}
$x = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=rollback&from='.urlencode($user).'&token='.urlencode($token).(($reason != null)?'&summary='.urlencode($reason):'').'&bot='.(($bot == true)?'1':'0'));
echo 'Rollback return: '.$x."\n";
if (!preg_match('/action complete/iS',$x)) return false;
return $x;
}
function move ($old,$new,$reason) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'wpOldTitle' => $old,
'wpNewTitle' => $new,
'wpReason' => $reason,
'wpWatch' => '0',
'wpEditToken' => $token,
'wpMove' => 'Move page'
);
return $this->http->post($this->indexurl.'?title=Special:Movepage&action=submit',$post);
}
function upload ($page,$file,$desc) {
$post = array
(
'wpUploadFile' => '@'.$file,
'wpSourceType' => 'file',
'wpDestFile' => $page,
'wpUploadDescription' => $desc,
'wpLicense' => '',
'wpWatchthis' => '0',
'wpIgnoreWarning' => '1',
'wpUpload' => 'Upload file'
);
return $this->http->post($this->indexurl.'?title=Special:Upload&action=submit',$post);
}
function hasemail ($user) {
$tmp = $this->http->get($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user));
if (stripos($tmp,"No e-mail address") !== false) return false;
return true;
}
function email ($user,$subject,$body) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$post = array
(
'wpSubject' => $subject,
'wpText' => $body,
'wpCCMe' => 0,
'wpSend' => 'Send',
'wpEditToken' => $this->edittoken
);
return $this->http->post($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user).'&action=submit',$post);
}
function delete ($page,$reason=null) {
$wpapi = new wikipediaapi;
$wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array('title' => $page,'token' => $token,'reason' => $reason);
$x = $this->http->post( $wpapi->apiurl.'?action=delete&format=php',$post );
return unserialize($x);
}
function unprotect ($page,$reason=null) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'mwProtect-reason' => $reason,
'mwProtectWatch' => '0',
'mwProtect-cascade' => '0',
'mwProtect-expiry-edit' => '',
'mwProtect-expiry-move' => '',
'mw-Protect-submit' => 'Confirm',
'wpEditToken' => $token,
'mwProtect-level-edit' => '',
'mwProtect-level-move' => ''
);
return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=unprotect',$post);
}
function protect ($page,$reason=null,$edit='sysop',$move='sysop',$editexpire='infinite',$moveexpire='infinite') {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'mwProtect-reason' => $reason,
'mwProtectWatch' => '0',
'mwProtect-cascade' => '0',
'mwProtect-expiry-edit' => $editexpire,
'mwProtect-expiry-move' => $moveexpire,
'mw-Protect-submit' => 'Confirm',
'wpEditToken' => $token,
'mwProtect-level-edit' => $edit,
'mwProtect-level-move' => $move
);
return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=protect',$post);
}
function salt ($page,$reason=null,$create='sysop',$expire='infinite') {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'mwProtect-reason' => $reason,
'mwProtectWatch' => '0',
'mwProtect-expiry' => $expire,
'mw-Protect-submit' => 'Confirm',
'wpEditToken' => $token,
'mwProtect-level-create' => $create
);
return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=protect',$post);
}
function block ($user,$expire='infinite',$reason='[[WP:Vandalism|Vandalism]]',$anon=1,$account=1,$autoblock=1,$emailban=0) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'wpBlockAddress' => $user,
'wpBlockReason' => $reason,
'wpAnonOnly' => $anon,
'wpBlockOther' => $expire,
'wpBlock' => 'Block',
'wpEditToken' => $token,
'wpCreateAccount' => $account,
'wpEnableAutoblock' => $autoblock,
'wpEmailBan' => $emailban,
'wpWatchUser' => 0,
);
return $this->http->post($this->indexurl.'?title=Special:BlockIP&action=submit',$post);
}
function unblock ($user,$reason=null) {
$wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl);
if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken();
$token = htmlspecialchars($this->edittoken);
$post = array
(
'wpUnblockAddress' => $user,
'wpUnblockReason' => $reason,
'wpBlock' => 'Unblock',
'wpEditToken' => $token
);
return $this->http->post($this->indexurl.'?title=Special:IPBlockList&action=submit',$post);
}
}
?>
|
Content Disclaimer
Informasi ini disarikan dari Wikipedia dan disajikan kembali untuk tujuan edukasi. Konten tersedia di bawah lisensi CC BY-SA 3.0. Kami tidak bertanggung jawab atas ketidakakuratan data yang bersumber dari kontribusi publik tersebut.
- The information displayed on this website is sourced in part or in whole from Wikipedia and has been adapted for the purpose of restating it. We strive to provide accurate and relevant information, however:
- There is no guarantee of absolute accuracy. Wikipedia is an open, collaborative project that can be edited by anyone, so information is subject to change.
- It is not intended to constitute professional advice. The content displayed is for informational and educational purposes only. For important decisions (e.g., medical, legal, or financial), please consult a professional.
- Content copyright. Wikipedia is licensed under the Creative Commons Attribution-ShareAlike License (CC BY-SA). This means that content may be reused with appropriate attribution and shared under a similar license.
- Responsible use. Any risk arising from the use of information from this website is entirely the responsibility of the user.