Kategorien
Benutzer:Count Ypsilon/Skript:npclist.pl: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
(zPVPmA web20power.txt;1;1) |
Bwoebi (Diskussion | Beiträge) K (Änderung 228976 von 109.73.68.18 (Diskussion) wurde rückgängig gemacht.) |
||
Zeile 1: | Zeile 1: | ||
Dieses Skript erzeugt eine Liste aller im Wiki verzeichneten NPCs. In der Ausgabedatei steht jede Zeile für ein NPC und hat den Inhalt | |||
NPC-Name;Angriffsstärke;LP;XP;GM;Vorkommen;Drops;Bild-URL;Bild-Autor | |||
Vorkommen ist dabei eine durch / separierte Liste der unter "Vorkommen" gelisteten Gebiete. Falls explizite Felder gelistet sind, werden diese im Vorkommen in der Form X,Y verzeichnet. | |||
Das Skript arbeitet nun mit dem Source der Wiki-Seiten, ist dafür allerdings auf die Verwendung der NPC-Vorlagen angewiesen. Für NPCs, die die Vorlage emulieren, muss ein Extra-Datenblock eingebaut werden, wie beispielsweise [http://www.fwwiki.de/index.php?title=Windgeist_%28Quest%29&diff=77619&oldid=77615 eine frühere Version] von [[Windgeist (Quest)]]. | |||
<pre> | |||
#!/usr/bin/perl | |||
use strict; | |||
use LWP::UserAgent; | |||
use URI::Escape; | |||
use HTTP::Request; | |||
my $ua = LWP::UserAgent->new(); | |||
my $host = "http://www.fwwiki.de"; | |||
my $url = $host . "/index.php/Kategorie:NPCs"; | |||
my @urllist; | |||
push(@urllist, $url); | |||
# als erstes die URLs aufsammeln, die auf die aufeinanderfolgenden Kategorieseiten verweisen: | |||
while($url ne "") { | |||
my $request = HTTP::Request->new("GET", $url); | |||
my $response = $ua->simple_request($request); | |||
my $c = $response->content(); | |||
$url = ""; | |||
if ($c =~ /(<a [^>]*Kategorie:NPCs[^<]*)(n[^<]*chste \d+)/im) { # Zeichenkette mit der Angabe "nächste n" ermitteln | |||
# $1 enthält jetzt die URL im Format <a ... href="..." ... > | |||
$c = $1; | |||
# print "HTML-URL: " . $c . "\n"; | |||
if ($c =~ /href=\"([^\"]*)/im) { # ... aus href="..." rausfummeln | |||
$url = $host . $1; | |||
$url =~ s/&/&/g; | |||
push(@urllist, $url); | |||
} | |||
} | |||
} | |||
# Nun die Kategorieseiten abarbeiten: | |||
foreach (@urllist) { | |||
my $request = HTTP::Request->new("GET", $_); | |||
my $response = $ua->simple_request($request); | |||
my $c = $response->content(); | |||
while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm) { | |||
my ($anchor, $text) = ($1, $2); | |||
my $href; | |||
$href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/); | |||
$href =~ s/&/&/g; | |||
my $title; | |||
$title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/); | |||
next if ($href eq ""); | |||
registerNpc($text, $host.$href) if ($title eq $text); | |||
} | |||
} | |||
sub trim($) | |||
{ | |||
my $string = shift; | |||
$string =~ s/^\s+//; | |||
$string =~ s/\s+$//; | |||
return $string; | |||
} | |||
sub registerNpc | |||
{ | |||
my ($text, $href) = @_; | |||
my $request = HTTP::Request->new("GET", $href."?action=edit"); | |||
my $response = $ua->simple_request($request); | |||
my $c = $response->content(); | |||
$c =~ tr/\n/ /; | |||
my $atk; | |||
my $xp; | |||
my $lp; | |||
my $gm; | |||
my $drops; | |||
my $bild; | |||
my $bildautor; | |||
my @vklist; | |||
my @itemlist; | |||
$atk = $1 if ($c =~ /\|\s*St..?rke\s*=\s*(\d+)/i); | |||
$lp = $1.$3 if ($c =~ /\|\s*Lebenspunkte\s*=\s*(\d+)(\.(\d+))?/i); | |||
$xp = $1 if ($c =~ /\|\s*XP\s*=\s*(\d+)/i); | |||
$gm = $1 if ($c =~ /\|\s*Gold\s*=\s*(\d+)/i); | |||
$bild = trim($1) if ($c =~ /\|\s*Bild\s*=\s*([^|}]*)/i); | |||
$bildautor = trim($1) if ($c =~ /\|\s*Bildautor\s*=\s*([^|}]*)/i); | |||
if ($c=~ /\|Vorkommen\s*=\s([^=]*)/) { | |||
my $vk=$1; | |||
while ($vk =~ /\*\s*\[\[([^\]]+)\]\]/ogm) { | |||
my $area = $1; | |||
$area = $1 if ($area =~ /(.*)\|/); | |||
push(@vklist, $area); | |||
} | |||
} | |||
if ($c=~ /\|Items\s*=\s([^=]*)/) { | |||
my $it=$1; | |||
while ($it =~ /\*\s*\[\[([^\]]+)\]\]/og) { | |||
push(@itemlist, $1); | |||
} | |||
} | |||
while ($c=~/\{\{Feld\|[^|]+\|[^|]+\|(\d+)\|(\d+)\}\}/ogm) { | |||
push(@vklist, "$1,$2"); | |||
} | |||
if ($atk>0) { | |||
print "$text;$atk;$lp;$xp;$gm;"; | |||
print join("/", @vklist); | |||
print ";"; | |||
print join("/", @itemlist); | |||
print ";$bild;$bildautor"; | |||
print "\n"; | |||
} | |||
} | |||
</pre> |
Version vom 28. September 2011, 12:44 Uhr
Dieses Skript erzeugt eine Liste aller im Wiki verzeichneten NPCs. In der Ausgabedatei steht jede Zeile für ein NPC und hat den Inhalt
NPC-Name;Angriffsstärke;LP;XP;GM;Vorkommen;Drops;Bild-URL;Bild-Autor
Vorkommen ist dabei eine durch / separierte Liste der unter "Vorkommen" gelisteten Gebiete. Falls explizite Felder gelistet sind, werden diese im Vorkommen in der Form X,Y verzeichnet.
Das Skript arbeitet nun mit dem Source der Wiki-Seiten, ist dafür allerdings auf die Verwendung der NPC-Vorlagen angewiesen. Für NPCs, die die Vorlage emulieren, muss ein Extra-Datenblock eingebaut werden, wie beispielsweise eine frühere Version von Windgeist (Quest).
#!/usr/bin/perl use strict; use LWP::UserAgent; use URI::Escape; use HTTP::Request; my $ua = LWP::UserAgent->new(); my $host = "http://www.fwwiki.de"; my $url = $host . "/index.php/Kategorie:NPCs"; my @urllist; push(@urllist, $url); # als erstes die URLs aufsammeln, die auf die aufeinanderfolgenden Kategorieseiten verweisen: while($url ne "") { my $request = HTTP::Request->new("GET", $url); my $response = $ua->simple_request($request); my $c = $response->content(); $url = ""; if ($c =~ /(<a [^>]*Kategorie:NPCs[^<]*)(n[^<]*chste \d+)/im) { # Zeichenkette mit der Angabe "nächste n" ermitteln # $1 enthält jetzt die URL im Format <a ... href="..." ... > $c = $1; # print "HTML-URL: " . $c . "\n"; if ($c =~ /href=\"([^\"]*)/im) { # ... aus href="..." rausfummeln $url = $host . $1; $url =~ s/&/&/g; push(@urllist, $url); } } } # Nun die Kategorieseiten abarbeiten: foreach (@urllist) { my $request = HTTP::Request->new("GET", $_); my $response = $ua->simple_request($request); my $c = $response->content(); while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm) { my ($anchor, $text) = ($1, $2); my $href; $href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/); $href =~ s/&/&/g; my $title; $title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/); next if ($href eq ""); registerNpc($text, $host.$href) if ($title eq $text); } } sub trim($) { my $string = shift; $string =~ s/^\s+//; $string =~ s/\s+$//; return $string; } sub registerNpc { my ($text, $href) = @_; my $request = HTTP::Request->new("GET", $href."?action=edit"); my $response = $ua->simple_request($request); my $c = $response->content(); $c =~ tr/\n/ /; my $atk; my $xp; my $lp; my $gm; my $drops; my $bild; my $bildautor; my @vklist; my @itemlist; $atk = $1 if ($c =~ /\|\s*St..?rke\s*=\s*(\d+)/i); $lp = $1.$3 if ($c =~ /\|\s*Lebenspunkte\s*=\s*(\d+)(\.(\d+))?/i); $xp = $1 if ($c =~ /\|\s*XP\s*=\s*(\d+)/i); $gm = $1 if ($c =~ /\|\s*Gold\s*=\s*(\d+)/i); $bild = trim($1) if ($c =~ /\|\s*Bild\s*=\s*([^|}]*)/i); $bildautor = trim($1) if ($c =~ /\|\s*Bildautor\s*=\s*([^|}]*)/i); if ($c=~ /\|Vorkommen\s*=\s([^=]*)/) { my $vk=$1; while ($vk =~ /\*\s*\[\[([^\]]+)\]\]/ogm) { my $area = $1; $area = $1 if ($area =~ /(.*)\|/); push(@vklist, $area); } } if ($c=~ /\|Items\s*=\s([^=]*)/) { my $it=$1; while ($it =~ /\*\s*\[\[([^\]]+)\]\]/og) { push(@itemlist, $1); } } while ($c=~/\{\{Feld\|[^|]+\|[^|]+\|(\d+)\|(\d+)\}\}/ogm) { push(@vklist, "$1,$2"); } if ($atk>0) { print "$text;$atk;$lp;$xp;$gm;"; print join("/", @vklist); print ";"; print join("/", @itemlist); print ";$bild;$bildautor"; print "\n"; } }