h1

Bot für das Pennergame [1]

Oktober 28, 2008

Ich spiele ja beim Pennergame mit. Also habe ich jetzt einen Bot für selbiges in Perl geschrieben, bestehend aus 3 Teilen.

Der erste Teil durchforstet die Seiten eines Forumsthemas nach Spendenlinks. Ungefähr 1900 verschiedene Pennergamespieler haben z.Z. dort ihren Spendenlink gepostet. Das Perlprogramm durchforstet also diese ganzen Seiten und sucht mithilfe von regulären Ausdrücken in jeder Zeile nach Spendenlinks. Am Ende wird diese Liste von Spendenlinks sortiert und in die Datei „links.txt“ geschrieben. Allerdings sind dort auch Einträge mehrfach vertreten, weil ich noch nicht weiß, wie man in Perl „uniq“ auf ein Array anwendet (Seid mir deswegen nicht böse, ich hab erst gestern angefangen Perl zu lernen😉 ). Dieser Mangel lässt sich aber in der Bash mit einem „uniq links.txt > links_uniq.txt“ leicht beheben.

Wer Kritik an dem Quellcode hat – ich bitte darum, Verbesserungsvorschläge als Kommentar zu posten😀

#!/usr/bin/perl -w
#
# Name: get_spendenlinks.pl
# License: GPL
# Sucht Spendenlinks von
# 'http://www.cheat-lexikon.de/spiele-forum/pc-f3/brauche-geld-fuer-meine-penner-t31.html'
# für das Pennergame (pennergame.de)
# Schreibt die Links in "./links.txt"
# Im Ergebnis kommen Links mehrfach vor, da Leute ihren Link mehr als einmal eintragen
#     --> Nachbereitung: 'cat links.txt | uniq > links.uniq.txt'
# Uniq kann auch noch implementiert werden, weiß durch geringe Perl-Kenntnisse noch nicht wie.
# 
# You may use, distribute or modify this program
# under the terms of the GPL.

# "Strengen Compiler" benutzen
use strict;
# Das Modul, das den "Browser" beinhaltet
use LWP::Simple;

my $url;
my $content;
my $zeile;
my $nextlink; # Welcher Link ist als nächstes dran?
my $lastlink; # Welcher Link war gerade - zum Vergleichen
my @zeilen;
my @links; # Beinhaltet am Ende alle Spendenlinks
my $anzahl; # Zeigt, auf der wievielten Seite man ist

$nextlink = 'http://www.cheat-lexikon.de/spiele-forum/pc-f3/brauche-geld-fuer-meinen-penner-t31.html'; # Startseite
$lastlink = ""; # Leer, sonst kommt es zu einem Fehler beim ersten Vergleich
$anzahl = 0;

# Solange der letzte Link nicht gleich dem nächsten ist, es also noch "unerkundete" Seiten gibt
while ($lastlink ne $nextlink) {
    print ++$anzahl . ". Durchlauf\n"; # Ausgabe der aktuellen Seitenzahl
    $lastlink = $nextlink; # Falls kein neuer Link gefunden wird, ist nextlink und lastlink gleich --> Abbruchbedingug erfüllt

    $content = get $nextlink; # get ruft die Url in nextlink auf. Gibt den Inhalt zurück
    die "Couldn't get $nextlink" unless defined $content; # Fehlerausgabe + Beenden

    # Schreibt die Seite in ein Tempfile, weil ich noch nicht weiß, wie man $content anders in Zeilen zerlegt.
    open(TMPFILE, ">/tmp/cheat_lexikon.htm") || die "Fehler beim Öffnen der Tempdatei zum schreiben\n";
    print TMPFILE $content || die "Fehler beim Schreiben in die Tempdatei\n";
    close(TMPFILE) || die "Fehler beim Schreiben in die Tempdatei\n";

    # Tempfile lesend öffnen und Inhalt in ein Array @zeilen einlesen
    open(TMPFILE, "/tmp/cheat_lexikon.htm") || die "Fehler beim Öffnen der Tempdatei zum lesen\n";
    @zeilen = <TMPFILE>;
    close(TMPFILE) || die "Fehler beim Schließen der Tempdatei\n";

    # Den Inhalt zeilenweise bearbeiten
    foreach $zeile (@zeilen) {
        # Passt der Inhalt auf die Zeile auf den regülären Ausdruck? --> Rest abschneiden und zu @links hinzufügen
        if ($zeile =~ s/.*?(http:\/\/www\.pennergame\.de\/change_please\/[0-9]{7}\/).*/$1/ ) {
            push(@links,$zeile);
        # Passt die Zeile auf den regülären Ausdruck, für die nächste Seite?
        } elsif ($zeile =~ s/.*?<a href="\.(\/pc-f3\/brauche-geld-fuer-meinen-penner-t31-s[0-9]{2,5}.html)">Nächste<\/a>.*/$1/ ) {
            $nextlink = "http://www.cheat-lexikon.de/spiele-forum" . $zeile;
        }
    }
}

@links = sort(@links);

# Zeilen in die Linkdatei (links.txt) schreiben
open(LINKDATEI, ">./links.txt") || die "Kann die Linkdatei nicht öffnen\n";
foreach $zeile (@links) {
    print LINKDATEI $zeile || die "Kann nicht in die Linkdatei schreiben\n";
}
close(LINKDATEI) || die "Kann nicht in die Linkdatei schreiben\n";

print "Fertig ;)";

2 Kommentare

  1. Eine Anleitung wie man den eigentlichen Bot benutzt findet sich hier.


  2. Hier jetzt noch eine etwas einfachere Version des Bots, als weiterer Artikel.



Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s

%d Bloggern gefällt das: