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

aus FreewarWiki, der Referenz für Freewar
Zur Navigation springen Zur Suche springen
(Jetzt basierend auf Source der Wikiseiten; Felder durch Semikolon statt Komma getrennt; liest auch Drops und Vorkommen aus)
K (Schützte „Benutzer:Count Ypsilon/Skript:npclist.pl“: Spam ([edit=autoconfirmed] (unbeschränkt) [move=autoconfirmed] (unbeschränkt)))
 
(4 dazwischenliegende Versionen von 3 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;Vorkommen;Drops
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.
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 arbietet 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, siehe z.B. Quelltext von [[Windgeist (Quest)]].
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


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