Kategorien
FreewarWiki:Bot/Skripts/Waffenliste.php: Unterschied zwischen den Versionen
< FreewarWiki:Bot | Skripts
K (sortierung nu mit alphabetischer sortierung bei gleicher stärke.) |
K (https) |
||
(8 dazwischenliegende Versionen von 2 Benutzern werden nicht angezeigt) | |||
Zeile 3: | Zeile 3: | ||
<pre> | <pre> | ||
<?php | <?php | ||
$cats = array("Verteidigungswaffen", "Angriffswaffen"); | |||
if (!isset($argv[1]) && !in_array($argv[1], $cats)) { | |||
die("Nutzung: php Waffenliste.php arg\narg ist dabei einer der folgenden Werte: " . implode(", ", $cats) . "\n"); | |||
} | |||
//Benutzername wird für den User-Agent benötigt | //Benutzername wird für den User-Agent benötigt | ||
$bot = new mwBot('Beispieluser', 'www.fwwiki.de'); | $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! | //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-> | if (false === $bot->print2file($bot->start($argv[1]))) { | ||
echo 'Daten konnten nicht geschrieben werden, Datei "output.txt" vorhanden und beschreibbar?'; | |||
} | } | ||
Zeile 21: | Zeile 26: | ||
public function status($status, $code = 0) { | public function status($status, $code = 0) { | ||
print date("d.m.y H:i:s") . " => " . $status . ($code == 0?"":(" (".$code.")")) . " | print date("d.m.y H:i:s") . " => " . $status . ($code == 0?"":(" (".$code.")")) . "\n"; | ||
} | } | ||
Zeile 29: | Zeile 34: | ||
private function getAPI($query) { | private function getAPI($query) { | ||
$c = curl_init(' | $c = curl_init('https://' . $this->server . '/api.php?' . $query . '&format=json'); | ||
curl_setopt($c, CURLOPT_USERAGENT, 'BotFrameWorkApi -- Benutzer:' . $this->nick); | curl_setopt($c, CURLOPT_USERAGENT, 'BotFrameWorkApi -- Benutzer:' . $this->nick); | ||
curl_setopt($c, CURLOPT_RETURNTRANSFER, true); | curl_setopt($c, CURLOPT_RETURNTRANSFER, true); | ||
Zeile 43: | Zeile 48: | ||
private function getContent($title) { | private function getContent($title) { | ||
$this->status('Hole Artikel: ' . | $this->status('Hole Artikel: ' . $title); | ||
$result = $this->getAPI('action=query&prop=info|revisions&titles=' . urlencode($title) . '&rvprop=timestamp|content&intoken=edit'); | $result = $this->getAPI('action=query&prop=info|revisions&titles=' . urlencode($title) . '&rvprop=timestamp|content&intoken=edit'); | ||
$pages = $result['pages']; | $pages = $result['pages']; | ||
Zeile 55: | Zeile 60: | ||
#################################*/ | #################################*/ | ||
/* | /* Main-Funktion - sucht die Artikel einer Waffenkategorie und baut die Wiki-Seite auf */ | ||
public function start($cat) { | |||
public function | $pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode($cat) . '&cmlimit=500'); | ||
$pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode( | |||
foreach($pages['categorymembers'] as $page) { | foreach ($pages['categorymembers'] as $page) { | ||
$content = $this->getContent($page['title']); | $content = $this->getContent($page['title']); | ||
if ($this->isWaffe($content)) { | if ($this->isWaffe($content)) { | ||
$waffenArray[] = $this->createWaffe($content, | $waffenArray[] = $this->createWaffe($content, $page['title']); | ||
} | } | ||
else { | else { | ||
echo " | echo "\tArtikel beschreibt keine Waffe!\n"; | ||
} | } | ||
} | } | ||
// Sortierung des Arrays nach der | // Sortierung des Arrays nach der Stärke der Waffen-Objekte | ||
usort($waffenArray, array("Waffe", "cmpWaffe")); | usort($waffenArray, array("Waffe", "cmpWaffe")); | ||
$out = | // Zählen der Waffen | ||
$count = count($waffenArray); | |||
// Aufbau der Liste | |||
$out = "<noinclude>\nDiese Liste wird von Zeit zu Zeit automatisch aus den Daten aus den einzelnen $cat-Artikeln erstellt (zuletzt am '''" . date("d.m.Y H:i:s") . "'''). Das Script um die Liste zu akualisieren findet ihr hier [[FreewarWiki:Bot/Skripts/Waffenliste.php]]."; | |||
$out .= "\n\n"; | $out .= "\n\n"; | ||
$out .= " | $out .= "Anzahl Waffen: " . $count . "\n\n</noinclude><!--\n\n-->{{#vardefine:" . $cat . "Anzahl|" . $count . "}}<!--\n"; | ||
// Durchlaufen des Waffen-Arrays und Hinzufuegen zur Liste | |||
foreach($waffenArray as $currentWaffe) { | foreach($waffenArray as $currentWaffe) { | ||
$out .= "| | $out .= "\n-->{{{{{Vorlage}}}|Name=" . $currentWaffe->name . "}}<!--" ; | ||
} | } | ||
return | return $out . "\n\n--><noinclude>{{Dokumentation}}</noinclude>"; | ||
} | } | ||
/* Überprüfung ob der Artikel eine Waffe ist */ | |||
private function isWaffe($content) { | private function isWaffe($content) { | ||
// | // Überprüfung ob der Artikel dem Layout für eine Angriffswaffe entspricht | ||
if ( preg_match(' | if (preg_match('~Item/Layout|Typ=awaffe~', $content)) { | ||
// | // Überprüfung ob der Artikel eine saisonale Waffe beschreibt | ||
if ( ! | if (!preg_match('/Saisonale Items/', $content)) { | ||
return true; | return true; | ||
} | } | ||
Zeile 95: | Zeile 103: | ||
} | } | ||
/* Erstellen eines neuen Waffen-Objektes */ | |||
private function createWaffe($content, $name) { | private function createWaffe($content, $name) { | ||
preg_match('#Stärke=\W*([0-9]+)#si', $content, $staerke); | preg_match('#\|Stärke=\W*([0-9]+)#si', $content, $staerke); | ||
return new Waffe($name, $staerke[1]); | |||
} | } | ||
public function print2file($str, $file = 'output.txt') { | public function print2file($str, $file = 'output.txt') { | ||
Zeile 107: | Zeile 114: | ||
} | } | ||
class Waffe { | class Waffe { | ||
public $name; | public $name; | ||
public $staerke; | public $staerke; | ||
function | function __construct($name, $staerke){ | ||
$this->name = $name; | |||
$this->staerke = $staerke; | $this->staerke = $staerke; | ||
} | |||
// Vergleichsfunktion fuer Waffen-Objekte | // Vergleichsfunktion fuer Waffen-Objekte | ||
static function cmpWaffe($waffe1, $waffe2){ | static function cmpWaffe($waffe1, $waffe2){ | ||
$staerke1 = $waffe1->staerke; | |||
$staerke2 = $waffe2->staerke; | |||
if ($staerke1 == $staerke2) { | |||
return strcasecmp($waffe1->name, $waffe2->name); | |||
} | |||
return $staerke1 - $staerke2; | |||
} | |||
} | } | ||
</pre> | </pre> |
Aktuelle Version vom 24. Dezember 2020, 14:25 Uhr
<?php $cats = array("Verteidigungswaffen", "Angriffswaffen"); if (!isset($argv[1]) && !in_array($argv[1], $cats)) { die("Nutzung: php Waffenliste.php arg\narg ist dabei einer der folgenden Werte: " . implode(", ", $cats) . "\n"); } //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->start($argv[1]))) { 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.")")) . "\n"; } /*################################# # APIVERBINDUNG ## #################################*/ private function getAPI($query) { $c = curl_init('https://' . $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: ' . $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 ## #################################*/ /* Main-Funktion - sucht die Artikel einer Waffenkategorie und baut die Wiki-Seite auf */ public function start($cat) { $pages = $this->getAPI('action=query&list=categorymembers&cmtitle=Category:' . urlencode($cat) . '&cmlimit=500'); foreach ($pages['categorymembers'] as $page) { $content = $this->getContent($page['title']); if ($this->isWaffe($content)) { $waffenArray[] = $this->createWaffe($content, $page['title']); } else { echo "\tArtikel beschreibt keine Waffe!\n"; } } // Sortierung des Arrays nach der Stärke der Waffen-Objekte usort($waffenArray, array("Waffe", "cmpWaffe")); // Zählen der Waffen $count = count($waffenArray); // Aufbau der Liste $out = "<noinclude>\nDiese Liste wird von Zeit zu Zeit automatisch aus den Daten aus den einzelnen $cat-Artikeln erstellt (zuletzt am '''" . date("d.m.Y H:i:s") . "'''). Das Script um die Liste zu akualisieren findet ihr hier [[FreewarWiki:Bot/Skripts/Waffenliste.php]]."; $out .= "\n\n"; $out .= "Anzahl Waffen: " . $count . "\n\n</noinclude><!--\n\n-->{{#vardefine:" . $cat . "Anzahl|" . $count . "}}<!--\n"; // Durchlaufen des Waffen-Arrays und Hinzufuegen zur Liste foreach($waffenArray as $currentWaffe) { $out .= "\n-->{{{{{Vorlage}}}|Name=" . $currentWaffe->name . "}}<!--" ; } return $out . "\n\n--><noinclude>{{Dokumentation}}</noinclude>"; } /* Überprüfung ob der Artikel eine Waffe ist */ private function isWaffe($content) { // Überprüfung ob der Artikel dem Layout für eine Angriffswaffe entspricht if (preg_match('~Item/Layout|Typ=awaffe~', $content)) { // Überprüfung ob der Artikel eine saisonale Waffe beschreibt if (!preg_match('/Saisonale Items/', $content)) { return true; } } return false; } /* Erstellen eines neuen Waffen-Objektes */ private function createWaffe($content, $name) { preg_match('#\|Stärke=\W*([0-9]+)#si', $content, $staerke); return new Waffe($name, $staerke[1]); } public function print2file($str, $file = 'output.txt') { return file_put_contents($file, $str); } } class Waffe { public $name; public $staerke; function __construct($name, $staerke){ $this->name = $name; $this->staerke = $staerke; } // Vergleichsfunktion fuer Waffen-Objekte static function cmpWaffe($waffe1, $waffe2){ $staerke1 = $waffe1->staerke; $staerke2 = $waffe2->staerke; if ($staerke1 == $staerke2) { return strcasecmp($waffe1->name, $waffe2->name); } return $staerke1 - $staerke2; } }