Index: trunk/extensions/RPED/RPEDFileReader.php |
— | — | @@ -1,65 +0,0 @@ |
2 | | -<?php |
3 | | -# RPEDFileReader.php by Tisane, http://www.mediawiki.org/wiki/User:Tisane |
4 | | -# |
5 | | -# This script is free software that is available under the terms of the Creative Commons |
6 | | -# Attribution-ShareAlike 3.0 license and the current version of the GNU General Public License. |
7 | | -# |
8 | | -# The purpose of this script is to read a text file (specifically, the list of page titles from |
9 | | -# Wikipedia's data dump) and add each page title to a database table. |
10 | | - |
11 | | -include 'wikibot.classes.php'; /* The wikipedia classes. */ |
12 | | -include 'RPED.config.php'; /* This file is very simple, but it contains sensitive information, we just define $user, $ircserver, $ircport, $ircchannel, $pass, $owner, and $status. */ |
13 | | - |
14 | | -$wpapi = new wikipediaapi; |
15 | | -$wpq = new wikipediaquery; |
16 | | -$wpi = new wikipediaindex; |
17 | | -if ($wpapi->login($user,$pass)!='true'){ |
18 | | - die(); |
19 | | -} |
20 | | - |
21 | | -$searching=false; |
22 | | - |
23 | | -if (isset($argv[1]) && $argv[1]!=''){ |
24 | | - $searching=true; |
25 | | -} |
26 | | - |
27 | | -$handle = @fopen("enwiki-20100312-all-titles-in-ns0", "r"); |
28 | | -$lineNumber=0; |
29 | | -$line=""; |
30 | | - |
31 | | -if ($handle) { |
32 | | - # Launch daemon! |
33 | | - $pid = pcntl_fork(); // fork |
34 | | - if ($pid < 0) |
35 | | - exit; |
36 | | - else if ($pid) // parent |
37 | | - exit; |
38 | | - else { // child |
39 | | - |
40 | | - $sid = posix_setsid(); |
41 | | - |
42 | | - if ($sid < 0) |
43 | | - exit; |
44 | | - |
45 | | - while (!feof($handle)) { |
46 | | - $buffer = fgets($handle, 4096); |
47 | | - $buffer=str_replace("\n","",$buffer); |
48 | | - if ($searching==true){ |
49 | | - if ($buffer==$argv[1]){ |
50 | | - $searching=false; |
51 | | - } |
52 | | - } else { |
53 | | - $buffer=urlencode ( $buffer ); |
54 | | - if ($line!=""){ |
55 | | - $line.="|"; |
56 | | - } |
57 | | - if (strlen($line)+strlen($buffer)>200){ |
58 | | - $wpapi->rpedInsert($line); |
59 | | - $line=""; |
60 | | - } |
61 | | - $line.=$buffer; |
62 | | - } |
63 | | - } |
64 | | - fclose($handle); |
65 | | - } |
66 | | -} |
\ No newline at end of file |
Index: trunk/extensions/RPED/RPEDIRCBot.php |
— | — | @@ -1,93 +0,0 @@ |
2 | | -<?php |
3 | | -# RPEDIRC.php by Tisane, http://www.mediawiki.org/wiki/User:Tisane |
4 | | -# |
5 | | -# This script is free software that is available under the terms of the Creative Commons |
6 | | -# Attribution 3.0 license and the current version of the GNU General Public License. |
7 | | -# |
8 | | -# The purpose of this script is to get the titles of all new, deleted and restored |
9 | | -# pages from #en.wikipedia and add/delete them from the rped_table. |
10 | | - |
11 | | -ini_set('include_path', ini_get('include_path').':..'); |
12 | | - |
13 | | -// Include Class |
14 | | -error_reporting(E_ALL); |
15 | | - |
16 | | -include 'wikibot.classes.php'; /* The wikipedia classes. */ |
17 | | -include 'RPED.config.php'; /* This file is very simple, but it contains sensitive information, we just define $user, $ircserver, $ircport, $ircchannel, $pass, $owner, and $status. */ |
18 | | - |
19 | | -$wpapi = new wikipediaapi; |
20 | | -$wpq = new wikipediaquery; |
21 | | -$wpi = new wikipediaindex; |
22 | | -if ($wpapi->login($user,$pass)!='true'){ |
23 | | - die(); |
24 | | -} |
25 | | - |
26 | | -$readbuffer=""; |
27 | | -$startSep="[["; |
28 | | -$endSep="]]"; |
29 | | - |
30 | | - |
31 | | -// open a socket connection to the IRC server |
32 | | -$fp = fsockopen($host, $port, $erno, $errstr, 30); |
33 | | - |
34 | | -// print the error if there is no connection |
35 | | -if (!$fp) { |
36 | | - echo $errstr." (".$errno.")<br />\n"; |
37 | | -} else { |
38 | | - // write data through the socket to join the channel |
39 | | - fwrite($fp, "NICK ".$nick."\r\n"); |
40 | | - fwrite($fp, "USER ".$ident." ".$host." bla :".$realname."\r\n"); |
41 | | - fwrite($fp, "JOIN :".$chan."\r\n"); |
42 | | - |
43 | | - # Launch daemon! |
44 | | - $pid = pcntl_fork(); // fork |
45 | | - if ($pid < 0) |
46 | | - exit; |
47 | | - else if ($pid) // parent |
48 | | - exit; |
49 | | - else { // child |
50 | | - |
51 | | - $sid = posix_setsid(); |
52 | | - |
53 | | - if ($sid < 0) |
54 | | - exit; |
55 | | - |
56 | | - while (!feof($fp)) { |
57 | | - |
58 | | - $line = fgets($fp, 512); |
59 | | - $pingLine = explode(' ', $line); |
60 | | - if(strtolower($pingLine[0]) == 'ping'){ |
61 | | - $response="PONG ".$pingLine[1]."\n"; |
62 | | - fwrite($fp, "PONG ".$response); |
63 | | - } |
64 | | - usleep(10); |
65 | | - $startPos=strpos($line,$startSep); |
66 | | - $endPos=strpos($line,$endSep); |
67 | | - $subLine=substr($line,$startPos+5,$endPos-$startPos-8); |
68 | | - if ($subLine=="Special:Log/delete"){ |
69 | | - $delstartPos=strpos($line,$startSep,$endPos); |
70 | | - $delendPos=strpos($line,$endSep,$endPos+1); |
71 | | - $delLine=substr($line,$delstartPos+5,$delendPos-$delstartPos-8); |
72 | | - $action=substr($line,$delstartPos-9,7); |
73 | | - if ($action=="deleted"){ |
74 | | - $wpapi->rpedDelete($delLine); |
75 | | - } else { |
76 | | - $wpapi->rpedInsert($delLine); |
77 | | - } |
78 | | - } |
79 | | - if ($subLine=="Special:Log/move"){ |
80 | | - $delstartPos=strpos($line,$startSep,$endPos); |
81 | | - $delendPos=strpos($line,$endSep,$endPos+1); |
82 | | - $delstartPos=strpos($line,$startSep,$delstartPos+1); |
83 | | - $delendPos=strpos($line,$endSep,$delendPos+1); |
84 | | - $delLine=substr($line,$delstartPos+2,$delendPos-$delstartPos-2); |
85 | | - $wpapi->rpedInsert($delLine); |
86 | | - } |
87 | | - if (substr($line,$endPos+5,1)=="N" || substr($line,$endPos+6,1)=="N"){ |
88 | | - $wpapi->rpedInsert($subLine); |
89 | | - } |
90 | | - } |
91 | | - |
92 | | - fclose($fp); |
93 | | - } |
94 | | -} |
\ No newline at end of file |
Index: trunk/extensions/RPED/RPED.config.php |
— | — | @@ -1,16 +0,0 @@ |
2 | | -<?php |
3 | | -$user='WikiSysop'; // Your username on your local wiki (must have RPED rights) |
4 | | -$ircserver='irc.mediawiki.org'; |
5 | | -$ircport='6667'; |
6 | | -$ircchannel='en.wikipedia'; |
7 | | -$pass='password'; // Your password on your local wiki |
8 | | -$owner=$user; |
9 | | -$status=''; |
10 | | - |
11 | | -#RPECIRC variables |
12 | | -$nick="YourNick"; // e.g. Awesome |
13 | | -$ident="YourIdent"; // For IRC identification purposes; e.g. AwesomeBot |
14 | | -$chan="#en.wikipedia"; |
15 | | -$realname = "Your Real Name"; |
16 | | -$port=6667; |
17 | | -$host = "irc.wikimedia.org"; |
\ No newline at end of file |
Index: trunk/extensions/RPED/RPEDFileReader.py |
— | — | @@ -1,47 +0,0 @@ |
2 | | -# RPEDFileReader.py by Tisane, http://www.mediawiki.org/wiki/User:Tisane |
3 | | -# |
4 | | -# This script is free software that is available under the terms of the Creative Commons |
5 | | -# Attribution-Sharealike 3.0 license and the current version of the GNU General Public License. |
6 | | -# |
7 | | -# The purpose of this script is to read a text file (specifically, the list of page titles from |
8 | | -# Wikipedia's data dump) and add each page title to a database table. |
9 | | - |
10 | | -FILES = ["enwiki-20100312-all-titles-in-ns0"] |
11 | | - |
12 | | -# Get the Data |
13 | | -import MySQLdb |
14 | | -import sys |
15 | | - |
16 | | -db= MySQLdb.connect(host='localhost', user='rpedorg' , passwd='password', db='rpedorg_beta2') |
17 | | -cursor= db.cursor() |
18 | | - |
19 | | -numArgs=0 |
20 | | -titleStart="foo" |
21 | | -notYetThere=False |
22 | | - |
23 | | -# FIXME: This argument-parsing system totally blows and doesn't work for strings |
24 | | -# starting with unusual characters (e.g. parentheses) |
25 | | -for arg in sys.argv: |
26 | | - numArgs+=1 |
27 | | - if numArgs==2: |
28 | | - if arg!='-l': |
29 | | - if arg!='line': |
30 | | - break |
31 | | - if numArgs==3: |
32 | | - titleStart=arg |
33 | | - notYetThere=True |
34 | | -lnum=0 |
35 | | - |
36 | | -for file in FILES: |
37 | | - infile = open(file,"r") |
38 | | - while infile: |
39 | | - line = infile.readline() |
40 | | - line=line.rstrip("\n") |
41 | | - if notYetThere==True: |
42 | | - if line==titleStart: |
43 | | - notYetThere==False |
44 | | - if notYetThere==False: |
45 | | - cursor.execute("INSERT INTO rped_page (rped_page_title) VALUES (%s)", (line,)) |
46 | | - lnum+=1 |
47 | | - if lnum%100==0: |
48 | | - print "%s: %s" % (lnum, line,) |
\ No newline at end of file |
Index: trunk/extensions/RPED/RPEDFileReader.pl |
— | — | @@ -1,68 +0,0 @@ |
2 | | -# RPEDFileReader.pl by Tisane, http://www.mediawiki.org/wiki/User:Tisane |
3 | | -# |
4 | | -# This script is free software that is available under the terms of the Creative Commons |
5 | | -# Attribution 3.0 license and the current version of the GNU General Public License. |
6 | | -# |
7 | | -# The purpose of this script is to read a text file (specifically, the list of page titles from |
8 | | -# Wikipedia's data dump) and add each page title to a database table. |
9 | | - |
10 | | -use strict; |
11 | | - |
12 | | -my $base_module_dir = (-d '/home2/rpedorg/perl' ? '/home2/rpedorg/perl' : ( getpwuid($>) )[7] . '/perl/'); |
13 | | - unshift @INC, map { $base_module_dir . $_ } @INC; |
14 | | - |
15 | | -#use Mysql; |
16 | | -use DBI; |
17 | | - |
18 | | -my $sql_login = 'rpedorg'; |
19 | | -my $sql_pass = 'Ab123456!'; |
20 | | -my $db_name = 'rpedorg_libertapedia'; |
21 | | -my $db_host = 'localhost'; # or remote mysql server name |
22 | | -my $numArgs = $#ARGV + 1; |
23 | | -my $offset=0; |
24 | | -my $titleMatch=''; |
25 | | -if ($numArgs>1){ |
26 | | - if ($ARGV[0] eq '-line' || $ARGV[0] eq '-l'){ |
27 | | - $offset=$ARGV[1]; |
28 | | - } |
29 | | - if ($ARGV[0] eq '-title' || $ARGV[0] eq '-t'){ |
30 | | - $titleMatch=$ARGV[1]; |
31 | | - } |
32 | | -} |
33 | | - |
34 | | -# if left blank, this defaults to localhost |
35 | | - |
36 | | -# PERL MYSQL CONNECT() |
37 | | -my $conn_string = "DBI:mysql:$db_name"; |
38 | | -if ($db_host) { $conn_string .= ":$db_host"; } |
39 | | -my $dbh = DBI->connect("$conn_string",$sql_login,$sql_pass); |
40 | | - |
41 | | -my $filename='enwiki-20100312-all-titles-in-ns0'; |
42 | | -open(MYDATA, $filename) or |
43 | | - die("Error: cannot open file '".$filename."'\n"); |
44 | | -my $line; |
45 | | -my $lnum = 1; |
46 | | -my $titleMatched=0; |
47 | | -if ($titleMatch eq ''){ |
48 | | - $titleMatched=1; |
49 | | -} |
50 | | -while( $line = <MYDATA> ){ |
51 | | - chomp($line); |
52 | | - if ($titleMatched==0){ |
53 | | - if ($titleMatch eq $line){ |
54 | | - $titleMatched=1; |
55 | | - } |
56 | | - } |
57 | | - if ($lnum>=$offset && $titleMatched==1){ |
58 | | - $line=$dbh->quote("$line"); |
59 | | - my $sql="INSERT INTO rped_page (rped_page_title) VALUES ($line)"; |
60 | | - $dbh->prepare($sql); |
61 | | - $dbh->do($sql); |
62 | | - if ($lnum%100==0){ |
63 | | - print "$lnum: $line\n"; |
64 | | - } |
65 | | - } |
66 | | - $lnum++; |
67 | | -} |
68 | | - |
69 | | -close MYDATA; |
\ No newline at end of file |
Index: trunk/extensions/RPED/wikibot.classes.php |
— | — | @@ -1,971 +0,0 @@ |
2 | | -<?PHP |
3 | | - /** |
4 | | - * @author Cobi Carter |
5 | | - **/ |
6 | | - |
7 | | - /** |
8 | | - * This class is designed to provide a simplified interface to cURL which maintains cookies. |
9 | | - * @author Cobi |
10 | | - **/ |
11 | | - class http { |
12 | | - private $ch; |
13 | | - private $uid; |
14 | | - public $postfollowredirs; |
15 | | - public $getfollowredirs; |
16 | | - |
17 | | - /** |
18 | | - * Our constructor function. This just does basic cURL initialization. |
19 | | - * @return void |
20 | | - **/ |
21 | | - function __construct () { |
22 | | - global $proxyhost, $proxyport; |
23 | | - $this->ch = curl_init(); |
24 | | - $this->uid = dechex(rand(0,99999999)); |
25 | | - curl_setopt($this->ch,CURLOPT_COOKIEJAR,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); |
26 | | - curl_setopt($this->ch,CURLOPT_COOKIEFILE,'/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); |
27 | | - curl_setopt($this->ch,CURLOPT_MAXCONNECTS,100); |
28 | | - curl_setopt($this->ch,CURLOPT_CLOSEPOLICY,CURLCLOSEPOLICY_LEAST_RECENTLY_USED); |
29 | | - curl_setopt($this->ch,CURLOPT_USERAGENT,'ClueBot/1.1'); |
30 | | - if (isset($proxyhost) and isset($proxyport) and ($proxyport != null) and ($proxyhost != null)) { |
31 | | - curl_setopt($this->ch,CURLOPT_PROXYTYPE,CURLPROXY_HTTP); |
32 | | - curl_setopt($this->ch,CURLOPT_PROXY,$proxyhost); |
33 | | - curl_setopt($this->ch,CURLOPT_PROXYPORT,$proxyport); |
34 | | - } |
35 | | - $this->postfollowredirs = 0; |
36 | | - $this->getfollowredirs = 1; |
37 | | - } |
38 | | - |
39 | | - /** |
40 | | - * Post to a URL. |
41 | | - * @param $url The URL to post to. |
42 | | - * @param $data The post-data to post, should be an array of key => value pairs. |
43 | | - * @return Data retrieved from the POST request. |
44 | | - **/ |
45 | | - function post ($url,$data) { |
46 | | - $time = microtime(1); |
47 | | - curl_setopt($this->ch,CURLOPT_URL,$url); |
48 | | - curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->postfollowredirs); |
49 | | - curl_setopt($this->ch,CURLOPT_MAXREDIRS,10); |
50 | | - curl_setopt($this->ch,CURLOPT_HEADER,0); |
51 | | - curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1); |
52 | | - curl_setopt($this->ch,CURLOPT_TIMEOUT,30); |
53 | | - curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10); |
54 | | - curl_setopt($this->ch,CURLOPT_POST,1); |
55 | | - curl_setopt($this->ch,CURLOPT_POSTFIELDS, $data); |
56 | | - curl_setopt($this->ch,CURLOPT_HTTPHEADER, array('Expect:')); |
57 | | - $data = curl_exec($this->ch); |
58 | | - #global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'POST: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n"); |
59 | | - return $data; |
60 | | - } |
61 | | - |
62 | | - /** |
63 | | - * Get a URL. |
64 | | - * @param $url The URL to get. |
65 | | - * @return Data retrieved from the GET request. |
66 | | - **/ |
67 | | - function get ($url) { |
68 | | - $time = microtime(1); |
69 | | - curl_setopt($this->ch,CURLOPT_URL,$url); |
70 | | - curl_setopt($this->ch,CURLOPT_FOLLOWLOCATION,$this->getfollowredirs); |
71 | | - curl_setopt($this->ch,CURLOPT_MAXREDIRS,10); |
72 | | - curl_setopt($this->ch,CURLOPT_HEADER,0); |
73 | | - curl_setopt($this->ch,CURLOPT_RETURNTRANSFER,1); |
74 | | - curl_setopt($this->ch,CURLOPT_TIMEOUT,30); |
75 | | - curl_setopt($this->ch,CURLOPT_CONNECTTIMEOUT,10); |
76 | | - curl_setopt($this->ch,CURLOPT_HTTPGET,1); |
77 | | - $data = curl_exec($this->ch); |
78 | | - #$global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'GET: '.$url.' ('.(microtime(1) - $time).' s) ('.strlen($data)." b)\n"); |
79 | | - return $data; |
80 | | - } |
81 | | - |
82 | | - /** |
83 | | - * Our destructor. Cleans up cURL and unlinks temporary files. |
84 | | - **/ |
85 | | - function __destruct () { |
86 | | - curl_close($this->ch); |
87 | | - @unlink('/tmp/cluewikibot.cookies.'.$this->uid.'.dat'); |
88 | | - } |
89 | | - } |
90 | | - |
91 | | - /** |
92 | | - * This class is a deprecated wrapper class which allows legacy code written for Wikipedia's query.php API to still work with wikipediaapi::. |
93 | | - **/ |
94 | | - class wikipediaquery { |
95 | | - private $http; |
96 | | - private $api; |
97 | | - public $queryurl = 'http://rped.org/beta2/query.php'; //Obsolete, but kept for compatibility purposes. |
98 | | - |
99 | | - /** |
100 | | - * This is our constructor. |
101 | | - * @return void |
102 | | - **/ |
103 | | - function __construct () { |
104 | | - global $__wp__http; |
105 | | - if (!isset($__wp__http)) { |
106 | | - $__wp__http = new http; |
107 | | - } |
108 | | - $this->http = &$__wp__http; |
109 | | - $this->api = new wikipediaapi; |
110 | | - } |
111 | | - |
112 | | - /** |
113 | | - * Reinitializes the queryurl. |
114 | | - * @private |
115 | | - * @return void |
116 | | - **/ |
117 | | - private function checkurl() { |
118 | | - $this->api->apiurl = str_replace('query.php','api.php',$this->queryurl); |
119 | | - } |
120 | | - |
121 | | - /** |
122 | | - * Gets the content of a page. |
123 | | - * @param $page The wikipedia page to fetch. |
124 | | - * @return The wikitext for the page. |
125 | | - **/ |
126 | | - function getpage ($page) { |
127 | | - $this->checkurl(); |
128 | | - $ret = $this->api->revisions($page,1,'older',true,null,true,false,false,false); |
129 | | - return $ret[0]['*']; |
130 | | - } |
131 | | - |
132 | | - /** |
133 | | - * Gets the page id for a page. |
134 | | - * @param $page The wikipedia page to get the id for. |
135 | | - * @return The page id of the page. |
136 | | - **/ |
137 | | - function getpageid ($page) { |
138 | | - $this->checkurl(); |
139 | | - $ret = $this->api->revisions($page,1,'older',false,null,true,false,false,false); |
140 | | - return $ret['pageid']; |
141 | | - } |
142 | | - |
143 | | - /** |
144 | | - * Gets the number of contributions a user has. |
145 | | - * @param $user The username for which to get the edit count. |
146 | | - * @return The number of contributions the user has. |
147 | | - **/ |
148 | | - function contribcount ($user) { |
149 | | - $this->checkurl(); |
150 | | - $ret = $this->api->users($user,1,null,true); |
151 | | - if ($ret !== false) return $ret[0]['editcount']; |
152 | | - return false; |
153 | | - } |
154 | | - } |
155 | | - |
156 | | - /** |
157 | | - * This class is for interacting with Wikipedia's api.php API. |
158 | | - **/ |
159 | | - class wikipediaapi { |
160 | | - private $http; |
161 | | - private $edittoken; |
162 | | - private $tokencache; |
163 | | - public $apiurl = 'http://rped.org/beta2/api.php'; |
164 | | - |
165 | | - /** |
166 | | - * This is our constructor. |
167 | | - * @return void |
168 | | - **/ |
169 | | - function __construct () { |
170 | | - global $__wp__http; |
171 | | - if (!isset($__wp__http)) { |
172 | | - $__wp__http = new http; |
173 | | - } |
174 | | - $this->http = &$__wp__http; |
175 | | - } |
176 | | - |
177 | | - function rpedInsert ($page){ |
178 | | - |
179 | | - $params = Array( |
180 | | - 'action' => 'rped', |
181 | | - 'format' => 'php', |
182 | | - 'insert' => $page, |
183 | | - ); |
184 | | - |
185 | | - $x = $this->http->post($this->apiurl,$params); |
186 | | - $x = unserialize($x); |
187 | | - #var_export($x); |
188 | | - return true; |
189 | | - } |
190 | | - |
191 | | - function rpedDelete ($page){ |
192 | | - |
193 | | - $params = Array( |
194 | | - 'action' => 'rped', |
195 | | - 'format' => 'php', |
196 | | - 'delete' => $page, |
197 | | - ); |
198 | | - |
199 | | - $x = $this->http->post($this->apiurl,$params); |
200 | | - $x = unserialize($x); |
201 | | - #var_export($x); |
202 | | - return true; |
203 | | - } |
204 | | - |
205 | | - |
206 | | - /** |
207 | | - * This function takes a username and password and logs you into wikipedia. |
208 | | - * @param $user Username to login as. |
209 | | - * @param $pass Password that corrisponds to the username. |
210 | | - * @return void |
211 | | - **/ |
212 | | - function login ($user,$pass) { |
213 | | - $x = unserialize($this->http->post($this->apiurl.'?action=login&format=php',array('lgname' => $user, 'lgpassword' => $pass))); |
214 | | - if($x['login']['result'] == 'Success') |
215 | | - return true; |
216 | | - if($x['login']['result'] == 'NeedToken') { |
217 | | - $x = unserialize($this->http->post($this->apiurl.'?action=login&format=php',array('lgname' => $user, 'lgpassword' => $pass, 'lgtoken' => $x['login']['token']))); |
218 | | - if($x['login']['result'] == 'Success') |
219 | | - return true; |
220 | | - } |
221 | | - return false; |
222 | | - } |
223 | | - |
224 | | - /** |
225 | | - * This function returns the edit token. |
226 | | - * @return Edit token. |
227 | | - **/ |
228 | | - function getedittoken () { |
229 | | - $tokens = $this->gettokens('Main Page'); |
230 | | - if ($tokens['edittoken'] == '') $tokens = $this->gettokens('Main Page',true); |
231 | | - $this->edittoken = $tokens['edittoken']; |
232 | | - return $tokens['edittoken']; |
233 | | - } |
234 | | - |
235 | | - /** |
236 | | - * This function returns the various tokens for a certain page. |
237 | | - * @param $title Page to get the tokens for. |
238 | | - * @param $flush Optional - internal use only. Flushes the token cache. |
239 | | - * @return An associative array of tokens for the page. |
240 | | - **/ |
241 | | - function gettokens ($title,$flush = false) { |
242 | | - if (!is_array($this->tokencache)) $this->tokencache = array(); |
243 | | - foreach ($this->tokencache as $t => $data) if (time() - $data['timestamp'] > 6*60*60) unset($this->tokencache[$t]); |
244 | | - if (isset($this->tokencache[$title]) && (!$flush)) { |
245 | | - return $this->tokencache[$title]['tokens']; |
246 | | - } else { |
247 | | - $tokens = array(); |
248 | | - $x = $this->http->get($this->apiurl.'?action=query&format=php&prop=info&intoken=edit|delete|protect|move|block|unblock|email&titles='.urlencode($title)); |
249 | | - $x = unserialize($x); |
250 | | - foreach ($x['query']['pages'] as $y) { |
251 | | - $tokens['edittoken'] = $y['edittoken']; |
252 | | - $tokens['deletetoken'] = $y['deletetoken']; |
253 | | - $tokens['protecttoken'] = $y['protecttoken']; |
254 | | - $tokens['movetoken'] = $y['movetoken']; |
255 | | - $tokens['blocktoken'] = $y['blocktoken']; |
256 | | - $tokens['unblocktoken'] = $y['unblocktoken']; |
257 | | - $tokens['emailtoken'] = $y['emailtoken']; |
258 | | - $this->tokencache[$title] = array( |
259 | | - 'timestamp' => time(), |
260 | | - 'tokens' => $tokens |
261 | | - ); |
262 | | - return $tokens; |
263 | | - } |
264 | | - } |
265 | | - } |
266 | | - |
267 | | - /** |
268 | | - * This function returns the recent changes for the wiki. |
269 | | - * @param $count The number of items to return. (Default 10) |
270 | | - * @param $namespace The namespace ID to filter items on. Null for no filtering. (Default null) |
271 | | - * @param $dir The direction to pull items. "older" or "newer". (Default 'older') |
272 | | - * @param $ts The timestamp to start at. Null for the beginning/end (depending on direction). (Default null) |
273 | | - * @return Associative array of recent changes metadata. |
274 | | - **/ |
275 | | - function recentchanges ($count = 10,$namespace = null,$dir = 'older',$ts = null) { |
276 | | - $append = ''; |
277 | | - if ($ts !== null) { $append .= '&rcstart='.urlencode($ts); } |
278 | | - $append .= '&rcdir='.urlencode($dir); |
279 | | - if ($namespace !== null) { $append .= '&rcnamespace='.urlencode($namespace); } |
280 | | - $x = $this->http->get($this->apiurl.'?action=query&list=recentchanges&rcprop=user|comment|flags|timestamp|title|ids|sizes&format=php&rclimit='.$count.$append); |
281 | | - $x = unserialize($x); |
282 | | - return $x['query']['recentchanges']; |
283 | | - } |
284 | | - |
285 | | - /** |
286 | | - * This function returns search results from Wikipedia's internal search engine. |
287 | | - * @param $search The query string to search for. |
288 | | - * @param $limit The number of results to return. (Default 10) |
289 | | - * @param $offset The number to start at. (Default 0) |
290 | | - * @param $namespace The namespace ID to filter by. Null means no filtering. (Default 0) |
291 | | - * @param $what What to search, 'text' or 'title'. (Default 'text') |
292 | | - * @param $redirs Whether or not to list redirects. (Default false) |
293 | | - * @return Associative array of search result metadata. |
294 | | - **/ |
295 | | - function search ($search,$limit = 10,$offset = 0,$namespace = 0,$what = 'text',$redirs = false) { |
296 | | - $append = ''; |
297 | | - if ($limit != null) $append .= '&srlimit='.urlencode($limit); |
298 | | - if ($offset != null) $append .= '&sroffset='.urlencode($offset); |
299 | | - if ($namespace != null) $append .= '&srnamespace='.urlencode($namespace); |
300 | | - if ($what != null) $append .= '&srwhat='.urlencode($what); |
301 | | - if ($redirs == true) $append .= '&srredirects=1'; |
302 | | - else $append .= '&srredirects=0'; |
303 | | - $x = $this->http->get($this->apiurl.'?action=query&list=search&format=php&srsearch='.urlencode($search).$append); |
304 | | - $x = unserialize($x); |
305 | | - return $x['query']['search']; |
306 | | - } |
307 | | - |
308 | | - /** |
309 | | - * Retrieve entries from the WikiLog. |
310 | | - * @param $user Username who caused the entry. Null means anyone. (Default null) |
311 | | - * @param $title Object to which the entry refers. Null means anything. (Default null) |
312 | | - * @param $limit Number of entries to return. (Default 50) |
313 | | - * @param $type Type of logs. Null means any type. (Default null) |
314 | | - * @param $start Date to start enumerating logs. Null means beginning/end depending on $dir. (Default null) |
315 | | - * @param $end Where to stop enumerating logs. Null means whenever limit is satisfied or there are no more logs. (Default null) |
316 | | - * @param $dir Direction to enumerate logs. "older" or "newer". (Default 'older') |
317 | | - * @return Associative array of logs metadata. |
318 | | - **/ |
319 | | - function logs ($user = null,$title = null,$limit = 50,$type = null,$start = null,$end = null,$dir = 'older') { |
320 | | - $append = ''; |
321 | | - if ($user != null) $append.= '&leuser='.urlencode($user); |
322 | | - if ($title != null) $append.= '&letitle='.urlencode($title); |
323 | | - if ($limit != null) $append.= '&lelimit='.urlencode($limit); |
324 | | - if ($type != null) $append.= '&letype='.urlencode($type); |
325 | | - if ($start != null) $append.= '&lestart='.urlencode($start); |
326 | | - if ($end != null) $append.= '&leend='.urlencode($end); |
327 | | - if ($dir != null) $append.= '&ledir='.urlencode($dir); |
328 | | - $x = $this->http->get($this->apiurl.'?action=query&format=php&list=logevents&leprop=ids|title|type|user|timestamp|comment|details'.$append); |
329 | | - $x = unserialize($x); |
330 | | - return $x['query']['logevents']; |
331 | | - } |
332 | | - |
333 | | - /** |
334 | | - * Retrieves metadata about a user's contributions. |
335 | | - * @param $user Username whose contributions we want to retrieve. |
336 | | - * @param $count Number of entries to return. (Default 50) |
337 | | - * @param[in,out] $continue Where to continue enumerating if part of a larger, split request. This is filled with the next logical continuation value. (Default null) |
338 | | - * @param $dir Which direction to enumerate from, "older" or "newer". (Default 'older') |
339 | | - * @return Associative array of contributions metadata. |
340 | | - **/ |
341 | | - function usercontribs ($user,$count = 50,&$continue = null,$dir = 'older') { |
342 | | - if ($continue != null) { |
343 | | - $append = '&ucstart='.urlencode($continue); |
344 | | - } else { |
345 | | - $append = ''; |
346 | | - } |
347 | | - $x = $this->http->get($this->apiurl.'?action=query&format=php&list=usercontribs&ucuser='.urlencode($user).'&uclimit='.urlencode($count).'&ucdir='.urlencode($dir).$append); |
348 | | - $x = unserialize($x); |
349 | | - $continue = $x['query-continue']['usercontribs']['ucstart']; |
350 | | - return $x['query']['usercontribs']; |
351 | | - } |
352 | | - |
353 | | - /** |
354 | | - * Returns revision data (meta and/or actual). |
355 | | - * @param $page Page for which to return revision data for. |
356 | | - * @param $count Number of revisions to return. (Default 1) |
357 | | - * @param $dir Direction to start enumerating multiple revisions from, "older" or "newer". (Default 'older') |
358 | | - * @param $content Whether to return actual revision content, true or false. (Default false) |
359 | | - * @param $revid Revision ID to start at. (Default null) |
360 | | - * @param $wait Whether or not to wait a few seconds for the specific revision to become available. (Default true) |
361 | | - * @param $getrbtok Whether or not to retrieve a rollback token for the revision. (Default false) |
362 | | - * @param $dieonerror Whether or not to kill the process with an error if an error occurs. (Default false) |
363 | | - * @param $redirects Whether or not to follow redirects. (Default false) |
364 | | - * @return Associative array of revision data. |
365 | | - **/ |
366 | | - function revisions ($page,$count = 1,$dir = 'older',$content = false,$revid = null,$wait = true,$getrbtok = false,$dieonerror = true,$redirects = false) { |
367 | | - $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':'')); |
368 | | - $x = unserialize($x); |
369 | | - if ($revid !== null) { |
370 | | - $found = false; |
371 | | - if (!isset($x['query']['pages']) or !is_array($x['query']['pages'])) { |
372 | | - if ($dieonerror == true) die('No such page.'."\n"); |
373 | | - else return false; |
374 | | - } |
375 | | - foreach ($x['query']['pages'] as $data) { |
376 | | - if (!isset($data['revisions']) or !is_array($data['revisions'])) { |
377 | | - if ($dieonerror == true) die('No such page.'."\n"); |
378 | | - else return false; |
379 | | - } |
380 | | - foreach ($data['revisions'] as $data2) if ($data2['revid'] == $revid) $found = true; |
381 | | - unset($data,$data2); |
382 | | - break; |
383 | | - } |
384 | | - |
385 | | - if ($found == false) { |
386 | | - if ($wait == true) { |
387 | | - sleep(1); |
388 | | - return $this->revisions($page,$count,$dir,$content,$revid,false,$getrbtok,$dieonerror); |
389 | | - } else { |
390 | | - if ($dieonerror == true) die('Revision error.'."\n"); |
391 | | - } |
392 | | - } |
393 | | - } |
394 | | - foreach ($x['query']['pages'] as $key => $data) { |
395 | | - $data['revisions']['ns'] = $data['ns']; |
396 | | - $data['revisions']['title'] = $data['title']; |
397 | | - $data['revisions']['currentuser'] = $x['query']['userinfo']['name']; |
398 | | -// $data['revisions']['currentuser'] = $x['query']['userinfo']['currentuser']['name']; |
399 | | - $data['revisions']['continue'] = $x['query-continue']['revisions']['rvstartid']; |
400 | | - $data['revisions']['pageid'] = $key; |
401 | | - return $data['revisions']; |
402 | | - } |
403 | | - } |
404 | | - |
405 | | - /** |
406 | | - * Enumerates user metadata. |
407 | | - * @param $start The username to start enumerating from. Null means from the beginning. (Default null) |
408 | | - * @param $limit The number of users to enumerate. (Default 1) |
409 | | - * @param $group The usergroup to filter by. Null means no filtering. (Default null) |
410 | | - * @param $requirestart Whether or not to require that $start be a valid username. (Default false) |
411 | | - * @param[out] $continue This is filled with the name to continue from next query. (Default null) |
412 | | - * @return Associative array of user metadata. |
413 | | - **/ |
414 | | - function users ($start = null,$limit = 1,$group = null,$requirestart = false,&$continue = null) { |
415 | | - $append = ''; |
416 | | - if ($start != null) $append .= '&aufrom='.urlencode($start); |
417 | | - if ($group != null) $append .= '&augroup='.urlencode($group); |
418 | | - $x = $this->http->get($this->apiurl.'?action=query&list=allusers&format=php&auprop=blockinfo|editcount|registration|groups&aulimit='.urlencode($limit).$append); |
419 | | - $x = unserialize($x); |
420 | | - $continue = $x['query-continue']['allusers']['aufrom']; |
421 | | - if (($requirestart == true) and ($x['query']['allusers'][0]['name'] != $start)) return false; |
422 | | - return $x['query']['allusers']; |
423 | | - } |
424 | | - |
425 | | - /** |
426 | | - * Get members of a category. |
427 | | - * @param $category Category to enumerate from. |
428 | | - * @param $count Number of members to enumerate. (Default 500) |
429 | | - * @param[in,out] $continue Where to continue enumerating from. This is automatically filled in when run. (Default null) |
430 | | - * @return Associative array of category member metadata. |
431 | | - **/ |
432 | | - function categorymembers ($category,$count = 500,&$continue = null) { |
433 | | - if ($continue != null) { |
434 | | - $append = '&cmcontinue='.urlencode($continue); |
435 | | - } else { |
436 | | - $append = ''; |
437 | | - } |
438 | | - $category = 'Category:'.str_ireplace('category:','',$category); |
439 | | - $x = $this->http->get($this->apiurl.'?action=query&list=categorymembers&cmtitle='.urlencode($category).'&format=php&cmlimit='.$count.$append); |
440 | | - $x = unserialize($x); |
441 | | - $continue = $x['query-continue']['categorymembers']['cmcontinue']; |
442 | | - return $x['query']['categorymembers']; |
443 | | - } |
444 | | - |
445 | | - /** |
446 | | - * Enumerate all categories. |
447 | | - * @param[in,out] $start Where to start enumerating. This is updated automatically with the value to continue from. (Default null) |
448 | | - * @param $limit Number of categories to enumerate. (Default 50) |
449 | | - * @param $dir Direction to enumerate in. 'ascending' or 'descending'. (Default 'ascending') |
450 | | - * @param $prefix Only enumerate categories with this prefix. (Default null) |
451 | | - * @return Associative array of category list metadata. |
452 | | - **/ |
453 | | - function listcategories (&$start = null,$limit = 50,$dir = 'ascending',$prefix = null) { |
454 | | - $append = ''; |
455 | | - if ($start != null) $append .= '&acfrom='.urlencode($start); |
456 | | - if ($limit != null) $append .= '&aclimit='.urlencode($limit); |
457 | | - if ($dir != null) $append .= '&acdir='.urlencode($dir); |
458 | | - if ($prefix != null) $append .= '&acprefix='.urlencode($prefix); |
459 | | - |
460 | | - $x = $this->http->get($this->apiurl.'?action=query&list=allcategories&acprop=size&format=php'.$append); |
461 | | - $x = unserialize($x); |
462 | | - |
463 | | - $start = $x['query-continue']['allcategories']['acfrom']; |
464 | | - |
465 | | - return $x['query']['allcategories']; |
466 | | - } |
467 | | - |
468 | | - /** |
469 | | - * Enumerate all backlinks to a page. |
470 | | - * @param $page Page to search for backlinks to. |
471 | | - * @param $count Number of backlinks to list. (Default 500) |
472 | | - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null) |
473 | | - * @param $filter Whether or not to include redirects. Acceptible values are 'all', 'redirects', and 'nonredirects'. (Default null) |
474 | | - * @return Associative array of backlink metadata. |
475 | | - **/ |
476 | | - function backlinks ($page,$count = 500,&$continue = null,$filter = null) { |
477 | | - if ($continue != null) { |
478 | | - $append = '&blcontinue='.urlencode($continue); |
479 | | - } else { |
480 | | - $append = ''; |
481 | | - } |
482 | | - if ($filter != null) { |
483 | | - $append .= '&blfilterredir='.urlencode($filter); |
484 | | - } |
485 | | - |
486 | | - $x = $this->http->get($this->apiurl.'?action=query&list=backlinks&bltitle='.urlencode($page).'&format=php&bllimit='.$count.$append); |
487 | | - $x = unserialize($x); |
488 | | - $continue = $x['query-continue']['backlinks']['blcontinue']; |
489 | | - return $x['query']['backlinks']; |
490 | | - } |
491 | | - |
492 | | - /** |
493 | | - * Gets a list of transcludes embedded in a page. |
494 | | - * @param $page Page to look for transcludes in. |
495 | | - * @param $count Number of transcludes to list. (Default 500) |
496 | | - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null) |
497 | | - * @return Associative array of transclude metadata. |
498 | | - **/ |
499 | | - function embeddedin ($page,$count = 500,&$continue = null) { |
500 | | - if ($continue != null) { |
501 | | - $append = '&eicontinue='.urlencode($continue); |
502 | | - } else { |
503 | | - $append = ''; |
504 | | - } |
505 | | - $x = $this->http->get($this->apiurl.'?action=query&list=embeddedin&eititle='.urlencode($page).'&format=php&eilimit='.$count.$append); |
506 | | - $x = unserialize($x); |
507 | | - $continue = $x['query-continue']['embeddedin']['eicontinue']; |
508 | | - return $x['query']['embeddedin']; |
509 | | - } |
510 | | - |
511 | | - /** |
512 | | - * Gets a list of pages with a common prefix. |
513 | | - * @param $prefix Common prefix to search for. |
514 | | - * @param $namespace Numeric namespace to filter on. (Default 0) |
515 | | - * @param $count Number of pages to list. (Default 500) |
516 | | - * @param[in,out] $continue Where to start enumerating from. This is automatically filled in. (Default null) |
517 | | - * @return Associative array of page metadata. |
518 | | - **/ |
519 | | - function listprefix ($prefix,$namespace = 0,$count = 500,&$continue = null) { |
520 | | - $append = '&apnamespace='.urlencode($namespace); |
521 | | - if ($continue != null) { |
522 | | - $append .= '&apfrom='.urlencode($continue); |
523 | | - } |
524 | | - $x = $this->http->get($this->apiurl.'?action=query&list=allpages&apprefix='.urlencode($prefix).'&format=php&aplimit='.$count.$append); |
525 | | - $x = unserialize($x); |
526 | | - $continue = $x['query-continue']['allpages']['apfrom']; |
527 | | - return $x['query']['allpages']; |
528 | | - } |
529 | | - |
530 | | - /** |
531 | | - * Edits a page. |
532 | | - * @param $page Page name to edit. |
533 | | - * @param $data Data to post to page. |
534 | | - * @param $summary Edit summary to use. |
535 | | - * @param $minor Whether or not to mark edit as minor. (Default false) |
536 | | - * @param $bot Whether or not to mark edit as a bot edit. (Default true) |
537 | | - * @param $wpStarttime Time in MW TS format of beginning of edit. (Default now) |
538 | | - * @param $wpEdittime Time in MW TS format of last edit to that page. (Default correct) |
539 | | - * @return boolean True on success, false on failure. |
540 | | - **/ |
541 | | - function edit ($page,$data,$summary = '',$minor = false,$bot = true,$wpStarttime = null,$wpEdittime = null,$checkrun = true) { |
542 | | - global $run, $user; |
543 | | - |
544 | | - $wpq = new wikipediaquery; $wpq->queryurl = str_replace('api.php','query.php',$this->apiurl); |
545 | | - |
546 | | - if ($checkrun == true) |
547 | | - if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run')))) |
548 | | - return false; /* Check /Run page */ |
549 | | - |
550 | | - $params = Array( |
551 | | - 'action' => 'edit', |
552 | | - 'format' => 'php', |
553 | | - 'assert' => 'bot', |
554 | | - 'title' => $page, |
555 | | - 'text' => $data, |
556 | | - 'token' => $this->getedittoken(), |
557 | | - 'summary' => $summary, |
558 | | - ($minor?'minor':'notminor') => '1', |
559 | | - ($bot?'bot':'notbot') => '1' |
560 | | - ); |
561 | | - |
562 | | - if ($wpStarttime !== null) $params['starttimestamp'] = $wpStarttime; |
563 | | - if ($wpEdittime !== null) $params['basetimestamp'] = $wpEdittime; |
564 | | - |
565 | | - $x = $this->http->post($this->apiurl,$params); |
566 | | - $x = unserialize($x); |
567 | | - var_export($x); |
568 | | - if ($x['edit']['result'] == 'Success') return true; |
569 | | - else return false; |
570 | | - } |
571 | | - |
572 | | - /** |
573 | | - * Moves a page. |
574 | | - * @param $old Name of page to move. |
575 | | - * @param $new New page title. |
576 | | - * @param $reason Move summary to use. |
577 | | - * @return void |
578 | | - **/ |
579 | | - function move ($old,$new,$reason) { |
580 | | - $tokens = $this->gettokens($old); |
581 | | - $params = array( |
582 | | - 'action' => 'move', |
583 | | - 'format' => 'php', |
584 | | - 'from' => $old, |
585 | | - 'to' => $new, |
586 | | - 'token' => $tokens['movetoken'], |
587 | | - 'reason' => $reason |
588 | | - ); |
589 | | - |
590 | | - $x = $this->http->post($this->apiurl,$params); |
591 | | - $x = unserialize($x); |
592 | | - var_export($x); |
593 | | - } |
594 | | - |
595 | | - /** |
596 | | - * Rollback an edit. |
597 | | - * @param $title Title of page to rollback. |
598 | | - * @param $user Username of last edit to the page to rollback. |
599 | | - * @param $reason Edit summary to use for rollback. |
600 | | - * @param $token Rollback token. If not given, it will be fetched. (Default null) |
601 | | - * @return void |
602 | | - **/ |
603 | | - function rollback ($title,$user,$reason,$token = null) { |
604 | | - if (($token == null) or ($token == '')) { |
605 | | - $token = $this->revisions($title,1,'older',false,null,true,true); |
606 | | - print_r($token); |
607 | | - if ($token[0]['user'] == $user) { |
608 | | - $token = $token[0]['rollbacktoken']; |
609 | | - } else { |
610 | | - return false; |
611 | | - } |
612 | | - } |
613 | | - $params = array( |
614 | | - 'action' => 'rollback', |
615 | | - 'format' => 'php', |
616 | | - 'title' => $title, |
617 | | - 'user' => $user, |
618 | | - 'summary' => $reason, |
619 | | - 'token' => $token, |
620 | | - 'markbot' => 0 |
621 | | - ); |
622 | | - |
623 | | - echo 'Posting to API: '; |
624 | | - var_export($params); |
625 | | - |
626 | | - $x = $this->http->post($this->apiurl,$params); |
627 | | - $x = unserialize($x); |
628 | | - var_export($x); |
629 | | - return (isset($x['rollback']['summary'])?true:false); |
630 | | - } |
631 | | - } |
632 | | - |
633 | | - /** |
634 | | - * This class is for interacting with Wikipedia's browser interface, index.php. |
635 | | - * Many of these functions are deprecated. |
636 | | - **/ |
637 | | - class wikipediaindex { |
638 | | - private $http; |
639 | | - public $indexurl = 'http://rped.org/beta2/index.php'; |
640 | | - private $postinterval = 0; |
641 | | - private $lastpost; |
642 | | - private $edittoken; |
643 | | - |
644 | | - /** |
645 | | - * This is our constructor. |
646 | | - * @return void |
647 | | - **/ |
648 | | - function __construct () { |
649 | | - global $__wp__http; |
650 | | - if (!isset($__wp__http)) { |
651 | | - $__wp__http = new http; |
652 | | - } |
653 | | - $this->http = &$__wp__http; |
654 | | - } |
655 | | - |
656 | | - /** |
657 | | - * Post data to a page, nicely. |
658 | | - * @param $page Page title. |
659 | | - * @param $data Data to post to page. |
660 | | - * @param $summery Edit summary. (Default '') |
661 | | - * @param $minor Whether to mark edit as minor. (Default false) |
662 | | - * @param $rv Revision data. If not given, it will be fetched. (Default null) |
663 | | - * @param $bot Whether to mark edit as bot. (Default true) |
664 | | - * @return HTML data from the page. |
665 | | - * @deprecated |
666 | | - * @see wikipediaapi::edit |
667 | | - **/ |
668 | | - function post ($page,$data,$summery = '',$minor = false,$rv = null,$bot = true) { |
669 | | - global $user; |
670 | | - global $maxlag; |
671 | | - global $irc; |
672 | | - global $irctechchannel; |
673 | | - global $run; |
674 | | - global $maxlagkeepgoing; |
675 | | - |
676 | | - $wpq = new wikipediaquery; $wpq->queryurl = str_replace('index.php','query.php',$this->indexurl); |
677 | | - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); |
678 | | - |
679 | | - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); |
680 | | - if ($rv == null) $rv = $wpapi->revisions($page,1,'older',true); |
681 | | - if (!$rv[0]['*']) $rv[0]['*'] = $wpq->getpage($page); |
682 | | - |
683 | | - //Fake the edit form. |
684 | | - $now = gmdate('YmdHis', time()); |
685 | | - $token = htmlspecialchars($this->edittoken); |
686 | | - $tmp = date_parse($rv[0]['timestamp']); |
687 | | - $edittime = gmdate('YmdHis', gmmktime($tmp['hour'],$tmp['minute'],$tmp['second'],$tmp['month'],$tmp['day'],$tmp['year'])); |
688 | | - $html = "<input type='hidden' value=\"{$now}\" name=\"wpStarttime\" />\n"; |
689 | | - $html.= "<input type='hidden' value=\"{$edittime}\" name=\"wpEdittime\" />\n"; |
690 | | - $html.= "<input type='hidden' value=\"{$token}\" name=\"wpEditToken\" />\n"; |
691 | | - $html.= '<input name="wpAutoSummary" type="hidden" value="'.md5('').'" />'."\n"; |
692 | | - |
693 | | - if (preg_match('/'.preg_quote('{{nobots}}','/').'/iS',$rv[0]['*'])) { return false; } /* Honor the bots flags */ |
694 | | - if (preg_match('/'.preg_quote('{{bots|allow=none}}','/').'/iS',$rv[0]['*'])) { return false; } |
695 | | - if (preg_match('/'.preg_quote('{{bots|deny=all}}','/').'/iS',$rv[0]['*'])) { return false; } |
696 | | - 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 */ |
697 | | - if (!preg_match('/'.preg_quote($user,'/').'/iS',$rv['currentuser'])) { return false; } /* We need to be logged in */ |
698 | | -// if (preg_match('/'.preg_quote('You have new messages','/').'/iS',$rv[0]['*'])) { return false; } /* Check talk page */ |
699 | | - if (!preg_match('/(yes|enable|true)/iS',((isset($run))?$run:$wpq->getpage('User:'.$user.'/Run')))) { return false; } /* Check /Run page */ |
700 | | - |
701 | | - $x = $this->forcepost($page,$data,$summery,$minor,$html,$maxlag,$maxlagkeepgoing,$bot); /* Go ahead and post. */ |
702 | | - $this->lastpost = time(); |
703 | | - return $x; |
704 | | - } |
705 | | - |
706 | | - /** |
707 | | - * Post data to a page. |
708 | | - * @param $page Page title. |
709 | | - * @param $data Data to post to page. |
710 | | - * @param $summery Edit summary. (Default '') |
711 | | - * @param $minor Whether to mark edit as minor. (Default false) |
712 | | - * @param $edithtml HTML from the edit form. If not given, it will be fetched. (Default null) |
713 | | - * @param $maxlag Maxlag for posting. (Default null) |
714 | | - * @param $mlkg Whether to keep going after encountering a maxlag error and sleeping or not. (Default null) |
715 | | - * @param $bot Whether to mark edit as bot. (Default true) |
716 | | - * @return HTML data from the page. |
717 | | - * @deprecated |
718 | | - * @see wikipediaapi::edit |
719 | | - **/ |
720 | | - function forcepost ($page,$data,$summery = '',$minor = false,$edithtml = null,$maxlag = null,$mlkg = null,$bot = true) { |
721 | | - $post['wpSection'] = ''; |
722 | | - $post['wpScrolltop'] = ''; |
723 | | - if ($minor == true) { $post['wpMinoredit'] = 1; } |
724 | | - $post['wpTextbox1'] = $data; |
725 | | - $post['wpSummary'] = $summery; |
726 | | - if ($edithtml == null) { |
727 | | - $html = $this->http->get($this->indexurl.'?title='.urlencode($page).'&action=edit'); |
728 | | - } else { |
729 | | - $html = $edithtml; |
730 | | - } |
731 | | - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpStarttime\" /\>|U',$html,$m); |
732 | | - $post['wpStarttime'] = $m[1]; |
733 | | - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEdittime\" /\>|U',$html,$m); |
734 | | - $post['wpEdittime'] = $m[1]; |
735 | | - preg_match('|\<input type\=\\\'hidden\\\' value\=\"(.*)\" name\=\"wpEditToken\" /\>|U',$html,$m); |
736 | | - $post['wpEditToken'] = $m[1]; |
737 | | - preg_match('|\<input name\=\"wpAutoSummary\" type\=\"hidden\" value\=\"(.*)\" /\>|U',$html,$m); |
738 | | - $post['wpAutoSummary'] = $m[1]; |
739 | | - if ($maxlag != null) { |
740 | | - $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&maxlag='.urlencode($maxlag).'&bot='.(($bot == true)?'1':'0'),$post); |
741 | | - if (preg_match('/Waiting for ([^ ]*): ([0-9.-]+) seconds lagged/S',$x,$lagged)) { |
742 | | - global $irc; |
743 | | - if (is_resource($irc)) { |
744 | | - global $irctechchannel; |
745 | | - foreach(explode(',',$irctechchannel) as $y) { |
746 | | - #fwrite($irc,'PRIVMSG '.$y.' :'.$lagged[1].' is lagged out by '.$lagged[2].' seconds. ('.$lagged[0].')'."\n"); |
747 | | - } |
748 | | - } |
749 | | - sleep(10); |
750 | | - if ($mlkg != true) { return false; } |
751 | | - else { $x = $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); } |
752 | | - } |
753 | | - return $x; |
754 | | - } else { |
755 | | - return $this->http->post($this->indexurl.'?title='.urlencode($page).'&action=submit&bot='.(($bot == true)?'1':'0'),$post); |
756 | | - } |
757 | | - } |
758 | | - |
759 | | - /** |
760 | | - * Get a diff. |
761 | | - * @param $title Page title to get the diff of. |
762 | | - * @param $oldid Old revision ID. |
763 | | - * @param $id New revision ID. |
764 | | - * @param $wait Whether or not to wait for the diff to become available. (Default true) |
765 | | - * @return Array of added data, removed data, and a rollback token if one was fetchable. |
766 | | - **/ |
767 | | - function diff ($title,$oldid,$id,$wait = true) { |
768 | | - $deleted = ''; |
769 | | - $added = ''; |
770 | | - |
771 | | - $html = $this->http->get($this->indexurl.'?title='.urlencode($title).'&action=render&diff='.urlencode($id).'&oldid='.urlencode($oldid).'&diffonly=1'); |
772 | | - |
773 | | - if (preg_match_all('/\&\;(oldid\=)(\d*)\\\'\>(Revision as of|Current revision as of)/USs', $html, $m, PREG_SET_ORDER)) { |
774 | | - //print_r($m); |
775 | | - if ((($oldid != $m[0][2]) and (is_numeric($oldid))) or (($id != $m[1][2]) and (is_numeric($id)))) { |
776 | | - if ($wait == true) { |
777 | | - sleep(1); |
778 | | - return $this->diff($title,$oldid,$id,false); |
779 | | - } else { |
780 | | - echo 'OLDID as detected: '.$m[0][2].' Wanted: '.$oldid."\n"; |
781 | | - echo 'NEWID as detected: '.$m[1][2].' Wanted: '.$id."\n"; |
782 | | - echo $html; |
783 | | - die('Revision error.'."\n"); |
784 | | - } |
785 | | - } |
786 | | - } |
787 | | - |
788 | | - if (preg_match_all('/\<td class\=(\"|\\\')diff-addedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) { |
789 | | - //print_r($m); |
790 | | - foreach ($m as $x) { |
791 | | - $added .= htmlspecialchars_decode(strip_tags($x[2]))."\n"; |
792 | | - } |
793 | | - } |
794 | | - |
795 | | - if (preg_match_all('/\<td class\=(\"|\\\')diff-deletedline\1\>\<div\>(.*)\<\/div\>\<\/td\>/USs', $html, $m, PREG_SET_ORDER)) { |
796 | | - //print_r($m); |
797 | | - foreach ($m as $x) { |
798 | | - $deleted .= htmlspecialchars_decode(strip_tags($x[2]))."\n"; |
799 | | - } |
800 | | - } |
801 | | - |
802 | | - //echo $added."\n".$deleted."\n"; |
803 | | - |
804 | | - if (preg_match('/action\=rollback\&\;from\=.*\&\;token\=(.*)\"/US', $html, $m)) { |
805 | | - $rbtoken = $m[1]; |
806 | | - $rbtoken = urldecode($rbtoken); |
807 | | -// echo 'rbtoken: '.$rbtoken.' -- '; print_r($m); echo "\n\n"; |
808 | | - return array($added,$deleted,$rbtoken); |
809 | | - } |
810 | | - |
811 | | - return array($added,$deleted); |
812 | | - } |
813 | | - |
814 | | - /** |
815 | | - * Rollback an edit. |
816 | | - * @param $title Page title to rollback. |
817 | | - * @param $user Username of last edit to the page to rollback. |
818 | | - * @param $reason Reason to rollback. If null, default is generated. (Default null) |
819 | | - * @param $token Rollback token to use. If null, it is fetched. (Default null) |
820 | | - * @param $bot Whether or not to mark as bot. (Default true) |
821 | | - * @return HTML or false if failure. |
822 | | - * @deprecated |
823 | | - * @see wikipediaapi::rollback |
824 | | - **/ |
825 | | - function rollback ($title,$user,$reason = null,$token = null,$bot = true) { |
826 | | - if (($token == null) or (!$token)) { |
827 | | - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); |
828 | | - $token = $wpapi->revisions($title,1,'older',false,null,true,true); |
829 | | - if ($token[0]['user'] == $user) { |
830 | | -// echo 'Token: '; print_r($token); echo "\n\n"; |
831 | | - $token = $token[0]['rollbacktoken']; |
832 | | - } else { |
833 | | - return false; |
834 | | - } |
835 | | - } |
836 | | - $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')); |
837 | | - #global $logfd; if (!is_resource($logfd)) $logfd = fopen('php://stderr','w'); fwrite($logfd,'Rollback return: '.$x."\n"); |
838 | | - if (!preg_match('/action complete/iS',$x)) return false; |
839 | | - return $x; |
840 | | - } |
841 | | - |
842 | | - /** |
843 | | - * Move a page. |
844 | | - * @param $old Page title to move. |
845 | | - * @param $new New title to move to. |
846 | | - * @param $reason Move page summary. |
847 | | - * @return HTML page. |
848 | | - * @deprecated |
849 | | - * @see wikipediaapi::move |
850 | | - **/ |
851 | | - function move ($old,$new,$reason) { |
852 | | - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); |
853 | | - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); |
854 | | - |
855 | | - $token = htmlspecialchars($this->edittoken); |
856 | | - |
857 | | - $post = array |
858 | | - ( |
859 | | - 'wpOldTitle' => $old, |
860 | | - 'wpNewTitle' => $new, |
861 | | - 'wpReason' => $reason, |
862 | | - 'wpWatch' => '0', |
863 | | - 'wpEditToken' => $token, |
864 | | - 'wpMove' => 'Move page' |
865 | | - ); |
866 | | - return $this->http->post($this->indexurl.'?title=Special:Movepage&action=submit',$post); |
867 | | - } |
868 | | - |
869 | | - /** |
870 | | - * Uploads a file. |
871 | | - * @param $page Name of page on the wiki to upload as. |
872 | | - * @param $file Name of local file to upload. |
873 | | - * @param $desc Content of the file description page. |
874 | | - * @return HTML content. |
875 | | - **/ |
876 | | - function upload ($page,$file,$desc) { |
877 | | - $post = array |
878 | | - ( |
879 | | - 'wpUploadFile' => '@'.$file, |
880 | | - 'wpSourceType' => 'file', |
881 | | - 'wpDestFile' => $page, |
882 | | - 'wpUploadDescription' => $desc, |
883 | | - 'wpLicense' => '', |
884 | | - 'wpWatchthis' => '0', |
885 | | - 'wpIgnoreWarning' => '1', |
886 | | - 'wpUpload' => 'Upload file' |
887 | | - ); |
888 | | - return $this->http->post($this->indexurl.'?title=Special:Upload&action=submit',$post); |
889 | | - } |
890 | | - |
891 | | - /** |
892 | | - * Check if a user has email enabled. |
893 | | - * @param $user Username to check whether or not the user has email enabled. |
894 | | - * @return True or false depending on whether or not the user has email enabled. |
895 | | - **/ |
896 | | - function hasemail ($user) { |
897 | | - $tmp = $this->http->get($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user)); |
898 | | - if (stripos($tmp,"No e-mail address") !== false) return false; |
899 | | - return true; |
900 | | - } |
901 | | - |
902 | | - /** |
903 | | - * Sends an email to a user. |
904 | | - * @param $user Username to send email to. |
905 | | - * @param $subject Subject of email to send. |
906 | | - * @param $body Body of email to send. |
907 | | - * @return HTML content. |
908 | | - **/ |
909 | | - function email ($user,$subject,$body) { |
910 | | - $wpapi = new wikipediaapi; $wpapi->apiurl = str_replace('index.php','api.php',$this->indexurl); |
911 | | - if ((!$this->edittoken) or ($this->edittoken == '')) $this->edittoken = $wpapi->getedittoken(); |
912 | | - |
913 | | - $post = array |
914 | | - ( |
915 | | - 'wpSubject' => $subject, |
916 | | - 'wpText' => $body, |
917 | | - 'wpCCMe' => 0, |
918 | | - 'wpSend' => 'Send', |
919 | | - 'wpEditToken' => $this->edittoken |
920 | | - ); |
921 | | - |
922 | | - return $this->http->post($this->indexurl.'?title=Special:EmailUser&target='.urlencode($user).'&action=submit',$post); |
923 | | - } |
924 | | - } |
925 | | -?> |
926 | | - |
927 | | - |
928 | | -[edit] Diff function (diff.function.php) |
929 | | - |
930 | | -<?PHP |
931 | | - function diff ($old,$new,$nret = true,$inline = false) { |
932 | | -// if ($inline) { |
933 | | -// return str_replace(array("\n",chr(92).chr(92),'\n'),array(' ',chr(92),"\n"),diff(implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$old))),implode("\n",explode(' ',str_replace(array(chr(92),"\n"),array(chr(92).chr(92),'\n'),$new))),$nret,false)); |
934 | | -// } |
935 | | - $file1 = tempnam('/tmp','diff_'); |
936 | | - $file2 = tempnam('/tmp','diff_'); |
937 | | - file_put_contents($file1,$old); |
938 | | - file_put_contents($file2,$new); |
939 | | - $out = array(); |
940 | | - if ($inline) { |
941 | | -// echo 'EXEC: wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2)."\n"; |
942 | | - @exec('wdiff -3'.(($nret)?'1':'2').' '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); |
943 | | - foreach ($out as $key => $line) { |
944 | | - if ($line == '======================================================================') unset($out[$key]); |
945 | | - elseif ($nret) $out[$key] = '> '.$line; |
946 | | - else $out[$key] = '< '.$line; |
947 | | - } |
948 | | - } else { |
949 | | - @exec('diff -d --suppress-common-lines '.escapeshellarg($file1).' '.escapeshellarg($file2),$out); |
950 | | - } |
951 | | - $out2 = array(); |
952 | | - foreach ($out as $line) { |
953 | | - if ( |
954 | | - ( |
955 | | - ($nret) |
956 | | - and (preg_match('/^\> .*$/',$line)) |
957 | | - ) |
958 | | - or ( |
959 | | - (!$nret) |
960 | | - and (preg_match('/^\< .*$/',$line)) |
961 | | - ) |
962 | | - ) { |
963 | | - $out2[] = substr($line,2); |
964 | | - } |
965 | | - } |
966 | | - $out = $out2; |
967 | | - unset($out2); |
968 | | - unlink($file1); |
969 | | - unlink($file2); |
970 | | - return implode("\n",$out); |
971 | | - } |
972 | | -?> |
\ No newline at end of file |