Kategorien
FreewarWiki:Bot/Skripts/Waffenliste.php: Unterschied zwischen den Versionen
< FreewarWiki:Bot | Skripts
(update) |
(da di de dumm) |
||
Zeile 3: | Zeile 3: | ||
<pre> | <pre> | ||
<?php | <?php | ||
//Benutzername wird für den User-Agent benötigt | |||
$bot = new mwBot('Beispieluser', 'www.fwwiki.de'); | |||
//HINWEIS: Skript schreibt Output in die Textdatei output.txt, evtl muss diese bestehen und die nötigen Rechte gegeben sein! | |||
if (false === $bot->print2file($bot->erstelleTabelle())) { | |||
echo 'Daten konnten nicht geschrieben werden, Datei "output.txt" vorhanden und beschreibbar?'; | |||
} | |||
class mwBot { | class mwBot { | ||
Zeile 50: | Zeile 57: | ||
/* Angriffswaffen des FWWiki*/ | /* Angriffswaffen des FWWiki*/ | ||
public function | public function erstelleTabelle() { | ||
$pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode('Angriffswaffen') . '&cmlimit=500'); | $pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode('Angriffswaffen') . '&cmlimit=500'); | ||
foreach($pages['categorymembers'] as $page) { | |||
$content = $this->getContent($page['title']); | |||
if ($this->isWaffe($content)) { | |||
$waffenArray[] = $this->createWaffe($content, ($page['title'])); | |||
} | |||
else { | |||
echo "Artikel beschreibt keine Waffe!"; | |||
} | |||
} | |||
// Sortierung des Arrays nach der Staerke der Waffen-Objekte | |||
usort($waffenArray, array("Waffe", "cmpWaffe")); | |||
$out = htmlentities("Diese Tabelle wird von Zeit zu Zeit automatisch aus den Daten aus den einzelnen Angriffswaffen-Artikeln erstellt (zuletzt am '''" . date("d.m.Y H:i:s") . "'''). Die Daten hier sollten nicht direkt geändert werden, weil solche Änderungen bei einer Neuerstellung verloren gehen. Stattdessen bitte die Daten auf den Seiten der jeweiligen Angriffswaffe korrigieren!"); | $out = htmlentities("Diese Tabelle wird von Zeit zu Zeit automatisch aus den Daten aus den einzelnen Angriffswaffen-Artikeln erstellt (zuletzt am '''" . date("d.m.Y H:i:s") . "'''). Die Daten hier sollten nicht direkt geändert werden, weil solche Änderungen bei einer Neuerstellung verloren gehen. Stattdessen bitte die Daten auf den Seiten der jeweiligen Angriffswaffe korrigieren!"); | ||
$out .= "\n\n"; | $out .= "\n\n"; | ||
$out .= "{| class=\"prettytable\"\n"; | |||
$out .= "{| class=\" | |||
$out .= "! align=\"center\" | Angriffswaffe\n"; | $out .= "! align=\"center\" | Angriffswaffe\n"; | ||
$out .= "|-\n"; | $out .= "|-\n"; | ||
foreach($ | foreach($waffenArray as $currentWaffe) { | ||
$ | $out .= "| [[" . ($currentWaffe -> name) . "]]\n" . "|-\n"; | ||
} | |||
return substr($out, 0, -2) . "}\n"; | |||
} | |||
private function isWaffe($content) { | |||
// Ueberpruefung ob der Artikel dem Layout fuer eine Angriffswaffe entspricht | |||
if ( preg_match('/Item\/Layout|Typ=awaffe/', $content) ) { | |||
// Ueberpruefung ob der Artikel eine saisonale Waffe beschreibt | |||
if ( preg_match('/Saisonale Items/', $content) ) { | |||
} | } | ||
else { | else { | ||
return true; | |||
} | } | ||
} | } | ||
return | return false; | ||
} | |||
private function createWaffe($content, $name) { | |||
preg_match('#Stärke=\W*([0-9]+)#si', $content, $staerke); | |||
$newWaffe = new Waffe( $name, ($staerke[1]) ); | |||
return $newWaffe; | |||
} | } | ||
public function print2file($str, $file = 'output.txt') { | public function print2file($str, $file = 'output.txt') { | ||
Zeile 91: | Zeile 110: | ||
} | } | ||
// | /* Waffen-Objekt */ | ||
$ | class Waffe { | ||
// | public $name; | ||
public $staerke; | |||
// Konstruktor fuer ein Waffen-Objekt | |||
function Waffe ($name, $staerke){ | |||
$this->name = $name; | |||
$this->staerke = $staerke; | |||
} | |||
// Vergleichsfunktion fuer Waffen-Objekte | |||
static function cmpWaffe($a, $b){ | |||
$al = strtolower($a->staerke); | |||
$bl = strtolower($b->staerke); | |||
if ($al == $bl) { | |||
return 0; | |||
} | |||
return ($al > $bl) ? +1 : -1; | |||
} | |||
} | } | ||
</pre> | </pre> |
Version vom 7. Januar 2015, 00:09 Uhr
<?php //Benutzername wird für den User-Agent benötigt $bot = new mwBot('Beispieluser', 'www.fwwiki.de'); //HINWEIS: Skript schreibt Output in die Textdatei output.txt, evtl muss diese bestehen und die nötigen Rechte gegeben sein! if (false === $bot->print2file($bot->erstelleTabelle())) { echo 'Daten konnten nicht geschrieben werden, Datei "output.txt" vorhanden und beschreibbar?'; } class mwBot { private $server; private $nick; public function __construct($name, $server) { $this->nick = $name; $this->server = $server; } public function status($status, $code = 0) { print date("d.m.y H:i:s") . " => " . $status . ($code == 0?"":(" (".$code.")")) . "<br/>"; } /*################################# # APIVERBINDUNG ## #################################*/ private function getAPI($query) { $c = curl_init('http://' . $this->server . '/api.php?' . $query . '&format=json'); curl_setopt($c, CURLOPT_USERAGENT, 'BotFrameWorkApi -- Benutzer:' . $this->nick); curl_setopt($c, CURLOPT_RETURNTRANSFER, true); $result = curl_exec($c); curl_close($c); $decoded = json_decode($result, true); return $decoded['query']; } /*################################# # HILFSFUNKTIONEN ## #################################*/ private function getContent($title) { $this->status('Hole Artikel: ' . htmlentities($title)); $result = $this->getAPI('action=query&prop=info|revisions&titles=' . urlencode($title) . '&rvprop=timestamp|content&intoken=edit'); $pages = $result['pages']; foreach($pages as $page) { return $page['revisions'][0]['*']; } } /*################################# # SPEZIELLE FUNKTIONEN ## #################################*/ /* Angriffswaffen des FWWiki*/ public function erstelleTabelle() { $pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode('Angriffswaffen') . '&cmlimit=500'); foreach($pages['categorymembers'] as $page) { $content = $this->getContent($page['title']); if ($this->isWaffe($content)) { $waffenArray[] = $this->createWaffe($content, ($page['title'])); } else { echo "Artikel beschreibt keine Waffe!"; } } // Sortierung des Arrays nach der Staerke der Waffen-Objekte usort($waffenArray, array("Waffe", "cmpWaffe")); $out = htmlentities("Diese Tabelle wird von Zeit zu Zeit automatisch aus den Daten aus den einzelnen Angriffswaffen-Artikeln erstellt (zuletzt am '''" . date("d.m.Y H:i:s") . "'''). Die Daten hier sollten nicht direkt geändert werden, weil solche Änderungen bei einer Neuerstellung verloren gehen. Stattdessen bitte die Daten auf den Seiten der jeweiligen Angriffswaffe korrigieren!"); $out .= "\n\n"; $out .= "{| class=\"prettytable\"\n"; $out .= "! align=\"center\" | Angriffswaffe\n"; $out .= "|-\n"; foreach($waffenArray as $currentWaffe) { $out .= "| [[" . ($currentWaffe -> name) . "]]\n" . "|-\n"; } return substr($out, 0, -2) . "}\n"; } private function isWaffe($content) { // Ueberpruefung ob der Artikel dem Layout fuer eine Angriffswaffe entspricht if ( preg_match('/Item\/Layout|Typ=awaffe/', $content) ) { // Ueberpruefung ob der Artikel eine saisonale Waffe beschreibt if ( preg_match('/Saisonale Items/', $content) ) { } else { return true; } } return false; } private function createWaffe($content, $name) { preg_match('#Stärke=\W*([0-9]+)#si', $content, $staerke); $newWaffe = new Waffe( $name, ($staerke[1]) ); return $newWaffe; } public function print2file($str, $file = 'output.txt') { return file_put_contents($file, $str); } } /* Waffen-Objekt */ class Waffe { public $name; public $staerke; // Konstruktor fuer ein Waffen-Objekt function Waffe ($name, $staerke){ $this->name = $name; $this->staerke = $staerke; } // Vergleichsfunktion fuer Waffen-Objekte static function cmpWaffe($a, $b){ $al = strtolower($a->staerke); $bl = strtolower($b->staerke); if ($al == $bl) { return 0; } return ($al > $bl) ? +1 : -1; } }