h1

Bot für das Pennergame [3]

Oktober 28, 2008

Der dritte Teil des Pennergamebots sammelt von einem Account alle Links zu „Pennern“ ein, die ihm schon gespendet haben. Es gibt eine „Spendenstatistik“, auf der alle diese „Penner“ aufgeführt werden, dort muss man nur noch die Links herausfiltern und in eine Datei schreiben. Ist das Programm durchgelaufen, erhält man in der Datei spenden.txt (definiert in der Variable $spendendatei), alle seine Spender. Dabei kommt ein Spender der mir 10 mal gespendet hat auch 10 mal in der Datei vor. Im Anfangskommentar des Scripts steht auch ein Beispiel wie man diese Informationen verwerten kann.

#!/usr/bin/perl -w
#
# Name: spenden.pl
# License: GPL
# 
# Liest die Spendenstatistik vom Pennergame des Accounts $username mit dem Passwort $passwort aus.
# Speichert alle aufgeführt Spender sortiert in spender.txt.
# Daten kann man dann z.b. mit einem Shellscript weiterverarbeiten:
# "for link in `cat spender.txt | uniq`
# do
#     anzahl=`cat spender.txt | grep $link | wc -l`
#     echo $anzahl $link
# done | sort -rn > spender.sort.txt"
#
# You may use, distribute or modify this program
# under the terms of the GPL.

use strict;
use LWP::UserAgent;

# neuen Browser erstellen
my $browser = LWP::UserAgent->new;

my $url;
my $response; # Beinhaltet die Antwort eines Seitenaufrufs
my $username = "muster";
my $password = "passwort";
my $line; # Wird in foreach-Schleifen verwendet, um etwas zeilenweise einzulesen
my $count; # Beinhaltet später die Anzahl der Seiten, die die Statistik hat
my $i; # Schleifenvariable
my @spender; # Beinhaltet am Ende alle bisherigen Spender
my $link; # Beinhaltet einen einzelnen Link als Zwischenspeicher
my $spenderdatei = "./spenden.txt";

# Cookies einschalten
$browser->cookie_jar({});

# Einloggen bei pennergame.de mit $username und $password
$url = "http://www.pennergame.de/login/check/";
$response = $browser->post( $url,
   [
     "submitform" => "submitform",
     "username" => $username,
     "password" => $password
   ],
 );
die "Konnte $url nicht laden" unless defined $response;

# Rückgabestatus = 302 --> Weiterleitung nach erfolgreichem Einloggen (Optional)
if ($response->status_line =~ m/.*?302.*?/) {
    $url = $response->header("Location");
    $response = $browser->get($url);
    die "Fehler bei $url\n" unless defined $response;
}

$url = "http://www.pennergame.de/change_please/statistics/"; # Anlaufpunkt, Statistikseite 1
$response = $browser->get($url);
die "Fehler beim laden von $url\n" unless defined $response;

# Antworte in Tempfile ablegen, um es dann zeilenweise wieder einzulesen. Überflüssig, habe aber nicht genug Perl kenntnisse, um das anders zu lösen
open(TMPFILE, ">/tmp/pennergame.tmp") || die "Fehler beim Öffnen des Tempfiles\n";
print TMPFILE $response->content || die "Kann nicht in das Tempfile schreiben\n";
close(TMPFILE) || die "Kann nicht in das Tempfile schreiben\n";

# Zeilenweise (!) wieder aus dem Tempfile lesen, ermitteln wieviele Statistikseiten vorhanden sind
open(TMPFILE, "/tmp/pennergame.tmp") || die "Kann das Tempfile nicht zum Lesen öffnen\n";
while ($line = <TMPFILE>)  {
    chomp($line);
    if ($line =~ s/.*?<a href="\/change_please\/statistics\/([0-9]+)\/">.*/$1/ ) {
        $count = $line; # $count bekommt sie Seitenzahlen
    }
}
close(TMPFILE) || die "Kann das Tempfile nicht schließen\n";

# Jede Seite ansteuern und die Spender heraussammeln
for ($i = 1; $i <= $count; $i++) {
    $url = "http://www.pennergame.de/change_please/statistics/$i/";
    $response = $browser->get($url);
    die "Fehler beim Laden von $url\n" unless defined $response;

    # Response ins Tempfile schreiben, um zeilenweise wieder einzulesen
    open(TMPFILE, ">/tmp/pennergame.tmp") || die "Fehler beim Öffnen des Tempfiles\n";
    print TMPFILE $response->content || die "Kann nicht Schreiben ins Tempfile\n";
    close(TMPFILE) || die "Kann nicht Tempfile wieder schließen\n";

    # Tempfile einlesen und Zeilenweise bearbeiten
    open(TMPFILE, "/tmp/pennergame.tmp") || die "Kann Tempfile nicht zum Lesen öffnen\n";
    while ($line = <TMPFILE>) {
        # Passt auf regulären Ausdruck? --> Rest abschneiden und $link zur Liste der Spendern hinzufügen
        if ($line =~ s/.*?(\/change_please\/[0-9]{7}\/).*/$1/ ) {
            $link = "http://www.pennergame.de" . $line;
            push(@spender, $link);
        }
    }
    close(TMPFILE) || die "Kann Tempfile nicht wieder schließen\n";
}

@spender = sort(@spender);

# sortierte Liste in spender.txt schreiben
open(SPENDER, ">$spenderdatei") || die "Fehler beim öffnen von $spenderdatei\n";
foreach $line (@spender) {
    print SPENDER $line || die "Fehler beim schreiben in $spenderdatei\n";
}
close(SPENDER) || die "Fehler beim schreiben in $spenderdatei\n";

5 Kommentare

  1. Und wie funktionirt das jetzt? Sry aber bin dabei nicht der helste könntest du mir sagen wie ich das jetzt maache?


  2. Eine kleine Anleitung findest du hier.


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


  4. Also habe Perl geladen, dann in eine und dem selben Ordner ne Datei „passwort.txt“ wo ich meinen Pennernamen eingebe und darunter mein Passwort. Dann habe ich auch die Datei spenden.pl. Wenn ich dann auf spenden.pl klicke steht da „Spendenlink noch nicht erstellt“…dann wird geladen und irgendwann erscheint in dem Order ne Textdatei die „Spendenlinks“ heisst. Und wenn ich dann wider auf spenden.pl klicke steht da das er sich nich einloggn kann???

    Was hab ich falsch gemacht?


  5. Überprüfe nochmal ob in der Datei passwort.txt wirklich dein richtiger Benutzername und dein richtiges Passwort stehen. Groß-/Kleinschreibung beachten usw.. Eigentlich müsste es gehen, wenn er sich nicht einloggen kann, liegt es höchstwahrscheinlich am falschen Passwort oder Benutzernamen.



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: