FreewarWiki:Bot/Skripts/forum crawler.php

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen
<?php
setlocale(LC_ALL, 'de_DE.utf8'); //wichtig! wird für strptime benötigt!;

$page_cache = include_once('PageTitles.php'); //enthält Seitentitel

$from_page = 1; //Startseite im AK-Forum
$to_page = 127; //letzte Seite im AK-Forum
$static_link = "http://forum.freewar.de/viewtopic.php?f=8"; //Link zum AK-Forum
$text = "";

for($page = $from_page; $page <= $to_page; $page++) {
	$start = ($page - 1) * 15; //uneingeloggt 15 Threads pro Seite
	$forum_page = file_get_contents("http://forum.freewar.de/search.php?st=0&sk=t&sd=d&sr=posts&terms=any&author=Sotrax&fid[]=8&sf=firstpost&start=".$start); //filtert Posts nach Sotrax
	
	$forum_page = utf8_encode(trim(preg_replace('/\s+/', ' ', $forum_page)));
	preg_match_all('#viewtopic\.php\?f=8(.*?)">(.*?)<.*?Verfasst:<\/b>(.*?\d+:\d+)&.*?postbody">(.*?)<\/td#',$forum_page,$data); //kompliziertes Bwoebi-Futter

	for($i = 0; $i < count($data[0]); $i++) {
		$desc = preg_split("(.\s?|\.\s?)", $data[4][$i])[0]."."; //kürze Beschreibungstexte auf 1 Satz; Forum-SW verkackt den Punkt;
		$desc = str_replace("</a>", "", preg_replace("/<a.*?>/", "", preg_replace("<img.*\/>", "", utf8_decode($desc))));
		
		// copy paste
		//setze alle bekannten Artikel aus dem Artikel-Cache $page_cache ein;
		//$page_cache wird mittels AllPagesBot.php generiert;
		//es werden nur solche Wörter betrachtet, die mehr als 3 Zeichen haben;
		$explosion = explode (" ", $desc);
		for($e = 0; $e < count($explosion); $e++) {
			$token = $explosion[$e];
			$flag = false;
			if(substr($token, -1) === ":") { //Überprüfung ob mehrteiliger Name
				$token .= " ".$explosion[$e+1];
				$flag = true;
			}
			if(strlen($token) > 3 && in_array($token, $page_cache)) {
				$token = "[[" . $token . "]]";
			} elseif(strlen($token) > 3 && in_array(substr($token, 0, -1), $page_cache)) {
				//entferne Satzzeichen, Plural "s" und sonstige einzelne Zeichen, die einen Artikel unauffindbar machen würden;
				$token = "[[" . substr($token, 0, -1) . "]]" . substr($token, -1);
			}
			$explosion[$e] = $token;
			if($flag) {
				$e++;
				$explosion[$e] = "";
			}
		}
		$desc = implode(" ", $explosion);	
		//copy paste ende

		$link = preg_replace("#&sid=.*#","",$data[1][$i]); //sid entfernen
		
		/* 
		* Da das Forum die Zeitangabe im deutschen Format ausgibt, funktioniert strtotime() nicht.
		* strptime() nutzt setlocale(), ist allerdings unter Windows NICHT implementiert.
		* strptime() hat auch ein anderes Format als date(), daher die Umrechnung.
		* Außerdem werden die leading zeros noch angefügt.
		*/
		$date = strptime(trim(utf8_decode($data[3][$i])), "%d. %B %Y, %H:%M"); //wandle Forenzeit um;
		$date = str_pad($date['tm_mday'], 2, '0', STR_PAD_LEFT).".".str_pad($date['tm_mon'] +1 , 2, '0', STR_PAD_LEFT).".".($date['tm_year'] +1900); //stelle Wiki-Zeit her;
		
		$title = utf8_decode(preg_replace("#(\[.*?\])#", "", $data[2][$i])); //entferne [W1*]-Markierung
		$text .= "|$date||[$static_link$link $title]||$desc\n|-\n";
	}
}
echo trim($text);