Login-Skript mir Perl

bigb702

Lt. Junior Grade
Registriert
Juli 2005
Beiträge
283
Hallo!

Ich will ein Skript schreiben, daß sich beim Ausführen mit meinem Benutzernamen und Passwort an einer Seite anmeldet und nach dem Login die im Browser erscheinende Seite zieht. Das Ziehen einer Seite ist ja nicht schwer, nur kreige ich es nicht hin auf ner Seite einzuloggen. Ich habe es bereits mit den Modulen WWW::Mechanize, LWP::UserAgent und HTML::Form versucht, nur kriege ich es nicht hin ein funktionierendes Skript zu scheiben. Habe Probleme damit mir die richtigen Sachen aus den Anleitungen der Module auf CPAN zusammen zu suchen.

Hoffe ihr könnt mir helfen.

MfG
 
eigentlich musst du nur wissen, was du bei nem login eigentlich tust. und zwar tust du nix anderes als ein formular abzuschicken mit der http-methode POST. und genau das gleiche machst du mit perl dann. du hast die url (zb /forms/login.php) von der website (steht im form-tag), dann die eingabe variablen (input-tags mit name="user" zb.). dann baust du dir ne url zusammen http://bla.xxx/forms/login.php?user=hans&pass=wurst und schickst das ganze mit ner passenden funktion aus nem cpan-modul ab. ggf. musst du auch den kompletten request zusammenbauen mit http-headerzeilen... ich kann kein perl, aber eigenlich steckt das dahinter..

gruß
hostile

ps. geht übrigens auch alles mit php, falls dir das mehr liegt... ;)
 
Das habe ich mir auch gedacht. Darum versuche ich das ja. Aber ich kriege es net hin. Ich habe bisher das hier. Aber ich weiß nicht, ob ers die richtige Form auswählt, auf www.studivz.net/Login z.B.: gibts nur eine Form. Und ich weiß net, ob der alles richtig sendet.



use strict;
use WWW::Mechanize;

my $login = 'xxxxx%40xxxxx.de';
my $password = 'xxxxx;


my $url = "http://www.studivz.net/Login";
my @fields = ("email","password","login");
my $mech = WWW::Mechanize->new();
$mech->get($url);
$mech->form_with_fields => @fields;
$mech->submit_form(

fields => { email => $login,
password => $password, login => 'Einloggen', jsEnabled => 'false', formkey => 'd944b337936b9025295c560cd119494f3ea9459fd5bea7c542870ad4b9f1d211ff527a79b98f2f6e27c9049015dd79cc071eb1b591a4223205fcaeb882a0599d',
iv => 'eb86b7cb533080b9bf99d1a91f1de5ce', checkcode => '5f883a1c82c576261aa2cd14f9e49624'},
);
$mech->click();
die unless ($mech->success);

Momentan kriege ich diese Meldung:


C:\Users\Basti\workspace\sdfdsf>perl rhtg.pl
no fields provided at C:/Perl/site/lib/WWW/Mechanize.pm line 1198.

Eigentlich muß ich ja nur email und password setzen, und die anderen nur übergeben. Die langen Felder ändern sich zwar jedes Mal, aber mit denen gehts auch. sind in einer alten HTML-Datei gespeichert, wo ich die Form isoliert habe.
Nur mit dem submit_form stirbt da Skript immer. Eigentlich soll er das senden:

POST /Login HTTP/1.1
Host: secure.studivz.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; de; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: de-de,de;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://www.studivz.net/Login
Cookie: PHPSESSID=8aa95b3724ea5faa2c4a382867924410f44ff712
Content-Type: application/x-www-form-urlencoded
Content-Length: 293
email=xxxxxxx%40xxxxx.de&password=xxxxxxx&login=Einloggen&jsEnabled=true&formkey=9708f18ef078df000473cd2dfc882e8ccb8978cbe87c857c83f3afc8ea74b6c4876d6ac07f08adccf6ce932ddbf8d636eb31eaca0dea2f990bf3b039246485e7&iv=937f51f6ae420928f4e490c5f54dd34a&checkcode=093909f36cef02393eef4d967aac5a1c

Was mache ich falsch?
 
eigentlich stimmt das was du da machst (abgesehen von zeile 5, da fehlt ein ').
das problem liegt daran, dass er an https:// schicken will... lösung weiss ich auch (noch) nicht...

gruß
hostile

ps: http://search.cpan.org/~petdance/WW...chanize/FAQ.pod#Why_don't_https://_URLs_work?

ps2: form_with_fields(@fields); <- wird so benutzt..
dann noch die hidden-felder aus dem submit_form entfernen.

um tipps zu erhalten kannst du auch perl mit perl -w starten.
 
Zuletzt bearbeitet:
Wie soll ich https machen? In der Doc von www:mechanize steht da nichts drüber. Aber das muß doch über das Modul machbar sein. Den Code von IO::Socket::SSL (wenn ich da mal installieren kann) kann ich ja nicht in den Submit verwenden.

@hostile

Einige Felde sind "hidden" von denen, die ich senden will.
 
Zuletzt bearbeitet:
verstehe deinen post überhaupt nicht. installier sicherheitshalber beide (IO::Socket::SSL und Crypt::SSLeay) und dann probier's nochmal aus! bei mir geht's zumindest dann... (auf nem testserver).

gruß
hostile

ps. bei studivz bekommst du sogar "gzip-encodetes" zurück.
erweiter das script um folgendes:

Code:
my $res = $mech->response();
print $res->content;

dann mach:

Code:
~# perl rhtg.pl > test.gz && gzip -d test.gz && cat test

dann bekommst du den html-code.

gruß
hostile
 
Zuletzt bearbeitet:
Also ich kann nicht die Module richtig komplieren. Nur bei dem IO::Socket::SSL kommt, daß es nicht richtig kompliert wurde (über den PPM) und über Kommandozeile, daß Net::SSL nicht installiert ist. DIeses ist in Crypt::SSLeay und da kommt dann wären der Install oder Ausführen eine Fehlermeldung, daß bei einer lib-Datei die Ordnungszahlen fehlerhaft sind. Wohl gemerkt ich nutze Windows + ActivePerl. Wie soll ich dann den Befeghl mit gzip ausführen?

Kannst du vielleicht mal dein Skript posten?
 
windows... hm.. schlecht ^^ probier ich auch mal aus zuhause... mein test-script sieht im moment so aus:

Code:
use strict;
use WWW::Mechanize;

my $email = 'xxxxx%40xxxxx.de';
my $password = 'xxxxx';

my $url = "https://pd930.hostile.dyndns.info/~hostile/login.php";
my @fields = ("email", "password");
my $mech = WWW::Mechanize->new();
$mech->add_header(Encoding  => 'text/plain' );
$mech->add_header(Accept  => 'text/html' );
$mech->add_header(User_Agent  => 'Opera/9.10 (Windows NT 5.0; U; de)' );
   $mech->get($url);
   $mech->form_with_fields(@fields);
   $mech->submit_form(
            fields => {
                email => $email,
                password => $password,
                login => 'Einloggen' }
                );

die login.php

Code:
<?php
    echo $_POST['email']."\n<br>";
    echo $_POST['password']."\n<br>";
    echo $_POST['iv'];
?>


<form method="post" action="https://pd930.hostile.dyndns.info/~hostile/login.php">

<input type="text" name="email" value="">
<br/>
<input type="password" name="password" value="">
<br/>
<input type="hidden" name="iv" value="1234">
<br/>
<input type="submit" name="login" value="Einloggen">

</form>


was ich noch festgestellt habe ist, dass du kein click() brauchst, mit submit_form() wird schon alles erledigt...

gruß
hostile

ps. die add_header() kannst du übersehen, ich bin gerade am herumspielen...
 
Cool! Scheine schon mit deinem Skript einen Schritt weiter zu sein. Jedenfalls bekomme ich jetzt eine Anwort vom Server, die aber verschlüsselt ist. Ich gehe davon aus, daß der Login geklappt hat. Nur denke ich steht in dem verschlüsselten Zeug die Adresse, auf die ich zugreifen muß, um die Starteseite nach dem Login auzurufen. Nun frage ich mich, woher ich den Schlüssel zum Entschlüsseln bekomme. Oder kann das mit einem Cookie klappen und dann per GET die Seite holen?
 
das ist nicht verschlüsselt. Das ist gzip-komprimierung. einmal durch nen filter gezogen und dann ist der klartext wieder da. geht bestimmt irgendwie. oder versuch in dem form die action-variable umzubiegen auf eine "http://"-adresse.

gruß
hostile
 
Ok. Habs geschaft das Zeug mir im Klartext anzeigen zu lassen mit

my $klartext = Compress::Zlib::memGunzip($res->content) ;

Das ist die Seite, die mir sagt, daß der Login nicht geklappt hat wegen "Falsches Passwort oder Benutzername". Ich habe das "%40" durch ein @ ersetzt, der Name erscheint dann auch in dem Feld der ANtwort. Nur das Passwort geht nicht. Habe es schon geändert und es steht richtig in dem Skript, aber es geht nicht!
 
Hm, da kann ich dir jetzt auch nicht helfen, da ich keinen studivz-account habe (und mir sicherlich auch keinen anlegen werde..), tut mir echt leid.

gruß
hostile
 
Schade. Ich schätze aber das Problem liegt nich beim Studi, sondern beim Generieren des Posts. In der Anwort, dich ich bekomme, ist der value einfach leer. Weißt du ob mir Mechanize anzeigen kann, was er da sendet, also den POST?

Sonst schon mal vielen Dank für die Hilfe! ;)
 
Zurück
Oben