Das PHP-Framework wurde in PHP geschrieben und arbeitet zusammen mit der MySQL Datenbank, um Cookies und ähnliches abzuspeichern. Es beinhaltet einige grundlegende Funktionen, wie zum Beispiel getcontent($titel), um den Text und die „Attribute“ eines Artikels zu holen, savecontent($title, $text, $attr, $summary) mit den Parametern titel für den Artikel-Titel, text für den Inhalt, attr für die Attribute aus getcontent, summary für die Zusammenfassung, um eine Seite zu speichern. Weitere Funktionen sind da für das Login, das Cookie-Management.

Bitte melde dich bei mir, wenn du diesen Source für deinen eigenen Bot benutzen möchtest. - Please give me a mail, if you want use this code for an own bot. - Donne-moi un e-mail si tu veux utiliser ce code.

<?PHP
	mysql_connect("localhost", "", ""); mysql_select_db("");
	
	/** 
	 * ressource connect( void );
	 * Connecting Function
	 * Used when script needs a connection to Wikipedia
	*/
	$status = '';
	function connect() {
		$fp = fsockopen ("de.wikipedia.org", 80, $errno, $errstr, 30);
		if (!$fp) {
			echo "$errstr ($errno)<br />\n";
			exit;
		}
		return $fp;
	}
	
	/** 
	 * void savecookie( string cookie_name, string cookie_value );
	 * Saves a Cookie into MySQL Database
	*/
	function savecookie($cookie_name, $cookie_value) {
		$result = mysql_query("SELECT * FROM `cookies` WHERE `cookie_name` = '".$cookie_name."';");
		if(mysql_num_rows($result) != 0) {
			mysql_query("DELETE FROM `cookies` WHERE `cookie_name` = '".$cookie_name."';");
			mysql_query("INSERT INTO `cookies` SET `cookie_name` = '".$cookie_name."', `cookie_value` = '".$cookie_value."';");
			echo mysql_error();
		} else {
			mysql_query("INSERT INTO `cookies` SET `cookie_name` = '".$cookie_name."', `cookie_value` = '".$cookie_value."';");
		}
	}
	
	/** 
	 * void parsecookie( string http_string );
	 * Extract Cookie-Datas and saves them with savecookie()
	*/
	function parsecookies($content) {
		preg_match_all("^Set-Cookie: (.*?)=(.*?);^", $content, $cookies);
		for($x = 0; $x < count($cookies[1]); $x++) {
			savecookie($cookies[1][$x], $cookies[2][$x]);
		}
		status("Alle Cookies aktualisiert.");
	}
	
	/** 
	 * int getlastactivity( void );
	 * Returns last activity from bot (phantom cookie = time)
	*/
	function getlastactivity() {
		$result = mysql_query("SELECT * FROM `cookies` WHERE `cookie_name` = 'time';");
		while($data = mysql_fetch_object($result)) 
			return $data->cookie_value;
	}
	
	/** 
	 * string getcookies( void );
	 * Returns all saved cookies, seperated by ; - startet with Cookie:
	*/
	function getcookies() {
		$return = 'Cookie: ';
		$result = mysql_query("SELECT * FROM `cookies`;");
		while($data = mysql_fetch_object($result)) $return .= $data->cookie_name."=".$data->cookie_value."; ";
		return substr($return, 0, -2);
	}
	
	/** 
	 * array getcontent( var title );
	 * Get the content of an article and the saving attributes
	 * array ( "text" => content of article with name title, "attr" => attributes )
	*/
	function getcontent($title) {
		status("Hole den Artikel ".$title);
		$fp = connect();
		fputs ($fp, "GET /w/index.php?title=".$title."&action=edit HTTP/1.1\r\nHost: de.wikipedia.org\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.6) Gecko/20060601 Firefox/2.0.0.6 (Ubuntu-edgy) Web-Sniffer/1.0.24\r\n".getcookies()."\r\n\r\n");
		$content = '';
		while (!feof($fp)) {
			$content .= fgets($fp,128);
		}
		parsecookies($content);
		
		fclose($fp);
	
		$pattern = '^type=';
		$pattern .= "'hidden' ";
		$pattern .= 'value="(.*?)" name="wp(.*?)"^';
		$pattern2 = '^name="wp(.*?)" type="hidden" value="(.*?)"^';
	
		preg_match_all($pattern,$content,$items);
		preg_match_all($pattern2,$content,$items2);
	
		$p = strpos($content, '<textarea');
		$k = substr($content, $p, strpos($content, '</textarea>') - $p);
		$k = substr($k, strpos($k, '>') + 1);
		$text = html_entity_decode_utf8($k, ENT_QUOTES);
		status("Artikel $status geholt, analysiert.");
		return array("text" =>$text, "attr" => array("start" => $items[1][0], "end" => $items[1][1], "EditToken" => $items[1][4], "AutoSummary" => $items[2][0]));
	}
	
	/** 
	 * void login( string nickname, string password );
	 * Login with nickname & password
	*/
	function login($nickname, $password) {
		status("Logge mich als $nickname ein.");
		$fp = connect();
		$data = 'wpName='.$nickname.'&wpPassword='.$password.'&wpRemember=1&wpLoginattempt=Anmelden';
		
		fputs($fp, "POST /w/index.php?title=Spezial:Anmelden&action=submitlogin&type=login HTTP/1.1\r\nHost: de.wikipedia.org\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.6) Gecko/20060601 Firefox/2.0.0.6 (Ubuntu-edgy) Web-Sniffer/1.0.24\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($data)."\r\n\r\n".$data."\r\n\r\n");
		$content = '';
		while (!feof($fp)) {
			$content .= fgets($fp,128);
		}
		parsecookies($content);
		fclose($fp);
		status("Ich bin nun $nickname.");
	}
	
	/** 
	 * void savecontent( string title, string text, array attr, string summary );
	 * Saves an article with title, text and summary
	*/
	function savecontent($title, $text, $attr, $summary) {
		status("Sende veränderten Artikel $title an Wikipedia.");
		$fp = connect();
	
		$data = '?wpSection=&wpStarttime='.$attr['start'].'&wpEdittime='.$attr['end'];
		$data .= '&wpScrolltop=0&wpTextbox1='.urlencode($text).'&wpSummary='.$summary.'&wpWatchthis=1&wpSave=Seite+speichern';
		$data .= '&wpEditToken='.urlencode($attr['EditToken']).'&wpAutoSummary='.urlencode($attr['AutoSummary']);
		fputs($fp, "POST /w/index.php?title=".$title."&action=submit HTTP/1.1\r\nHost: de.wikipedia.org\r\nUser-Agent: Mozilla/5.0 (X11; U; Linux i686; de; rv:1.8.1.6) Gecko/20060601 Firefox/2.0.0.6 (Ubuntu-edgy) Web-Sniffer/1.0.24\r\n".getcookies()."\r\nContent-Type: application/x-www-form-urlencoded\r\nContent-Length: ".strlen($data)."\r\n\r\n".$data."\r\n\r\n");
		$content = '';
		while (!feof($fp)) {
			$content .= fgets($fp,128);
		}
		
		if(strstr($content, "Bearbeitungskonflikt"))
			status("<font color='red'><b>Bearbeitungskonflikt festgestellt</b></font> - Mir wurde noch nicht beigebracht, bei solche fällen zu handeln! Informiere meinen Besizter!");
			
		parsecookies($content);
		fclose($fp);
		status("Neue Version gespeichert.");
	}
	
	/** 
	 * void status( status text );
	 * Add status message into status variable
	*/
	function status($text) {
		global $status;
		$status .= "<font face=\"Courier New\" size=\"2\"><b>[".date("H:i:s")."]</b> $text</font><br>";
	}
	
	/** 
	 * void ...( text );
	 * HTML entity decode to utf8 (html_entity_decode does not work well)
	*/
	function html_entity_decode_utf8($string)
	{
			static $trans_tbl;
		 
			// replace numeric entities
			$string = preg_replace('~&#x([0-9a-f]+);~ei', 'code2utf(hexdec("\\1"))', $string);
			$string = preg_replace('~&#([0-9]+);~e', 'code2utf(\\1)', $string);
	
			// replace literal entities
			if (!isset($trans_tbl))
			{
					$trans_tbl = array();
				 
					foreach (get_html_translation_table(HTML_ENTITIES) as $val=>$key)
							$trans_tbl[$key] = utf8_encode($val);
			}
		 
			return strtr($string, $trans_tbl);
	}
?>