Benutzer:Count Ypsilon/Skript:npclist.pl: Unterschied zwischen den Versionen

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen
(nur falls das jemand anders auch mal nutzen will)
 
K (Schützte „Benutzer:Count Ypsilon/Skript:npclist.pl“: Spam ([edit=autoconfirmed] (unbeschränkt) [move=autoconfirmed] (unbeschränkt)))
 
(5 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
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
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
NPC-Name;Angriffsstärke;LP;XP;GM;Vorkommen;Drops;Bild-URL;Bild-Autor


Das Skript arbeitet mit der HTML-Ausgabe der Wiki-Seiten, das ist suboptimal und fehleranfällig, es sollte auf das Parsen der Wiki-Quelltexte umgestellt werden - aber für den Augenblick tut es.
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.


  #!/usr/bin/perl
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>
  use strict;
#!/usr/bin/perl
  use LWP::UserAgent;
 
  use URI::Escape;
use strict;
  use HTTP::Request;
use LWP::UserAgent;
 
use URI::Escape;
  my $ua = LWP::UserAgent->new();  
use HTTP::Request;
  my $host = "http://www.fwwiki.de";
 
  my $url = $host . "/index.php/Kategorie:NPCs";
 
 
 
  while($url ne "")
my $ua = LWP::UserAgent->new();
  {
my $host = "http://www.fwwiki.de";
      my $request = HTTP::Request->new("GET", $url);
my $url = $host . "/index.php/Kategorie:NPCs";
      my $response = $ua->simple_request($request);
my @urllist;
      my $c = $response->content();
 
      $url = "";
 
 
 
      while($c =~ /<a([^>]*)>([^<]*)<\/a>/gm)
 
      {
push(@urllist, $url);
          my ($anchor, $text) = ($1, $2);
 
          my $href;
 
          $href = $1 if ($anchor =~ /href\s*=\s*"([^"]*)"/);
# als erstes die URLs aufsammeln, die auf die aufeinanderfolgenden Kategorieseiten verweisen:
          $href =~ s/&amp;/&/g;  
while($url ne "") {
          my $title;
my $request = HTTP::Request->new("GET", $url);
          $title = $1 if ($anchor =~ /title\s*=\s*"([^"]*)"/);
my $response = $ua->simple_request($request);
          $url = $host.$href if ($text =~ /n.*chste \d+/);
my $c = $response->content();
          registerNpc($text, $host.$href) if ($title eq $text);
 
      }
 
  }
$url = "";
 
if ($c =~ /(<a [^>]*Kategorie:NPCs[^<]*)(n[^<]*chste \d+)/im) { # Zeichenkette mit der Angabe "nächste n" ermitteln
  sub registerNpc
# $1 enthält jetzt die URL im Format <a ... href="..." ... >
  {
$c = $1;
      my ($text, $href) = @_;
# print "HTML-URL: " . $c . "\n";
      my $request = HTTP::Request->new("GET", $href);
if ($c =~ /href=\"([^\"]*)/im) { # ... aus href="..." rausfummeln
      my $response = $ua->simple_request($request);
$url = $host . $1;
      my $c = $response->content();
$url =~ s/&amp;/&/g;
 
push(@urllist, $url);
      my $atk;
}
      my $xp;
}
      my $lp;
}
      my $gm;
 
      my $drops;
# Nun die Kategorieseiten abarbeiten:
 
 
      $atk = $1 if ($c =~ /Angriffsst.{1,4}rke: (\d+)/);
foreach (@urllist) {
      $lp = $1.$3 if ($c =~ /Lebenspunkte[^0-9]{1,8}(\d+)(\.(\d+))?/);
my $request = HTTP::Request->new("GET", $_);
      $xp = $1 if ($c =~ /Erfahrung[^0-9]{1,8}(\d+)/);
my $response = $ua->simple_request($request);
      $gm = $1 if ($c =~ /Gold[^0-9]{1,8}(\d+)/);
my $c = $response->content();
 
 
      print "$text,$atk,$lp,$xp,$gm\n";
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>

Aktuelle Version vom 28. September 2011, 12:49 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";
	}
}