Antworten auf deine Fragen:
Neues Thema erstellen

[PHP] HTTP Post ohne cURL

Rum0

PSler

Ich suche verzweifelt nach einem funktionierenden Script, um ohne cURL per PHP Daten per Post an eine Webseite zu übergegeben.

HTML:
<form id="login-form" action="auth/login" method="post">
<div>
<label for="rememberme">Remember me</label>
<input type="checkbox" class="remember" checked="checked" name="remember me" />
<label for="email" id="email-label" class="no-js">Email</label>
<input id="email-email" type="text" name="handle" value="" autocomplete="off" />
<label for="combination" id="combo-label" class="no-js">Combination</label>
<input id="password-clear" type="text" value="Combination" autocomplete="off" />
<input id="password-password" type="password" name="password" value="" autocomplete="off" />
<input id="sumbitLogin" class="signin" type="submit" value="Sign In" />
</div>
</form>
Das ist das Formular, auf Welcome to Lockerz. In dieser Seite soll sich der Server bei Aufruf des PHP-Scriptes einloggen. Leider gibt es keine cURL-Unterstützung.
PHP:
<?php
$data = "remember+me=on&handle=username%40emailserver.de&password=usernamespassword";
$params = array('http' => array(
                'method' => 'POST',
                'header' => array(
                    'Content-Type' => "application/x-www-form-urlencoded",
                    'Content-Length' => strlen($data),
                    'User-Agent' => "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
                ),
                'content' => $data
                )
        );
$ctx = stream_context_create($params);
$fp = @fopen("http://www.lockerz.com/auth/login", 'r', false, $ctx); // rb
if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
}
$response = @stream_get_contents($fp);
if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
}
else{
    echo htmlentities($response);
}
?>
$data hab ich auch durch stimmende Daten ersetzt.
Das Script an sich ist nicht von mir, ich habs nur angepasst auf das Fomular etc. Daher versteh ich zum Beispiel auch nicht, warum
Code:
if ($response === false)
hier 3 und nicht 2 Gleichheitszeichen sind.
Code:
'User-Agent' => "Mozilla/5.0 (Windows; U; Windows NT 6.1; de;  rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3"
ist Firefox unter Windows 7.

In dieser Form funktioniert das Script aber nicht, wenn man die Seite aufruft, wird nur die ganz normale Login-Seite angezeigt. Natürlich ohne CSS und JavaScript, weil das bislang ja noch nicht eingebunden wurde.
Das Ergebnis ist hier zu bewundern: Welcome to Lockerz
Woran kann das liegen? Ist das Script an sich falsch und es werden überhaupt keine Daten per Post übermittelt?
Oder kann der Server sonst irgendiwe überprüfen, ob es von meinem Server losgeschickt wurde?
Wenn der Login fehlschlagen würde, dann müsste der Login Button übrigens so aussehen:
HTML:
<input id="sumbitLogin" class="signin-wrong-email" type="submit" value="Login Failed - Try Again" />
Das tut er wie Ihr ja sehen könnt aber nicht.
Ich kann mri übrigens nicht vorstellen, dass Lockerz etwas gegen dieses Script hat, da sie so schlussendlich mehr Member kriegen.

Also ich hoffe Ihr könnt mir helfen, mein Script zu überarbeiten, oder mir bei einem neuen helfen.

MfG,
Rum0

PS: Über das id=sumbitLogin von Lockerz lach ich jedes Mal.
 
Zuletzt bearbeitet:

Duddle

Posting-Frequenz: 14µHz

AW:
PHP:
 HTTP Post ohne cURL[/b]

Wenn ich bei deinem zu bewundernden Ergebnis auf "Sign In" klicke, kommt ein 404.

Die "===" sind eine strikte Variante des Vergleiches. Dort wird nur true geliefert, wenn der Typ der zu vergleichenden Variablen, sowie natürlich deren Inhalte selbst, gleich sind. Siehe auch: [url=http://php.net/manual/en/language.operators.comparison.php]PHP: Comparison Operators - Manual[/url]

Ob POST-Daten abgeschickt werden, kannst du beispielsweise mit FireBug (Firefox-Addon) testen, das hat ein Netzwerk-Tab mit dem du den ganzen Verkehr untersuchen kannst.

Auf Anhieb sehe ich jedenfalls erstmal keinen Fehler bei deinem Code. Eine Vermutung von mir ist, dass der Lockerz-Login auch auf den Referer schaut und nur das eigene Login akzeptiert. Aber das kannst du notfalls auch simulieren.

Bitte fixe mal den 404, dann kann man da mal näher reinschauen.


Duddle
 

Rum0

PSler

AW:
PHP:
 HTTP Post ohne cURL[/b]

Onload wird das PHP Script aufgerufen, das versucht sich einzuloggen. Der Server überträgt ja von sich aus die POST Daten, nicht mein CLient, also funktionert es mit z.B. HTTPFox nicht sich azugucken, ob POST Daten übermittelt werden.
Was du auf meiner Seite siehst, ist einfach $response wie es ausgegeben wird. Natürlich sind die relativen Verweise wie z.B. /auth/login und sowohlauf CSS als auch auf JavaScript damit hinfällig. Das Bild wird nur deswegen richtig angezeigt, weil der Verweis auf der oirginal Lockerz Seite absolut ist.
Das $response ausgegeben wird, ist nur zum Testen, das wird antürlich noch ersetzt, wenn es mal funktioniert.
Der Code meiner Seite ist genau der PHP-Code von oben. Abgesehen von dem angepassten $data.
Danke schon mal für dne Hinweis mit ===, werde mir das mal bei Gelegenheit ansehen.

Also sollte ich versuchen im header array referer auf http : // www . lockerz .com zu setzen? Werde das gleich mal ausprobieren.

EDIT: Ich hab jetzt mal htmlentities benutzt, sodass der HTML Code des Response raw zurückgegeben wird. Vll. hilft dir das zu verstehen, was die Seite macht.
EDIT2: Hier mal, was mir HTTPFox als Request-Header angibt, beim Login:
[quote](Request-Line)    POST /auth/login HTTP/1.1
Host    [URL="http://www.lockerz.com"]www.lockerz.com[/URL]
User-Agent    Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept    text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
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    115
Connection    keep-alive
Referer    [URL]http://www.lockerz.com/[/URL]
Cookie    __utma=cookie inhalt, zur Vorsicht rausgenommen
Content-Type    application/x-www-form-urlencoded
Content-Length    73[/quote]Soll ich das mal alles, was generell ist, in meine HTTP Request übernehmen?
Und kann, dass es nicht klappt, eventuell daran liegen, dass man von /auth/login direkt weitergeleitet wird zu http : // www .lockerz. com / myLocker ?
 
Zuletzt bearbeitet:

Duddle

Posting-Frequenz: 14µHz

AW:
PHP:
 HTTP Post ohne cURL[/b]

Habe jetzt mal ein bisschen rumgespielt. Dein Script läuft bei mir mit dem gleichen Ergebnis. Mit einem POST von wget aus holt er die gewünschte "Login Failed"-Version der Seite, aber erst nach einem 302 Redirect der Login-Seite. Daher dachte ich zuerst, der Redirect wird von PHP nicht richtig verarbeitet.

Dann habe ich es mit einem [URL="http://bytes.com/topic/php/answers/849032-php-post-without-curl"]anderen Script[/URL] getestet, das ist am 302 hängen geblieben. Daher wird wohl die stream_context-Variante auf den 302 reagieren, daran kann es also nicht liegen.

Danach habe ich mir die Header angeschaut (Firebug ist dein Freund) und gesehen, dass der Antwort-Header vom POST auf /auth/login u.a. ein Set-Cookie mitschickt. Dieser Cookie wird vom folgenden GET des Browsers (er will ja auf den 302 reagieren) mitgeschickt und ich lande auf der "Login Failed"-Variante. Daher habe ich mal Cookies von lockerz.com verboten und es nochmal probiert -> schon lande ich nicht mehr auf der "Login Failed"-Seite, sondern der normalen. 

Also erkennt die Seite offensichtlich anhand des Cookies, ob du dich versucht hast falsch einzuloggen. Daher wird dein Script auch nie auf der "Login Failed"-Seite landen, ohne vorher den Cookie des 302 mitzuschicken. Damit wäre diese Frage schonmal geklärt.

Da das Prinzip sicherlich genauso mit einem erfolgreichen Login funktioniert, müsstest du irgendwie Cookies in das ganze einbauen. Auf Anhieb weiss ich aber nicht, wie man mit den stream_context-Funktionen arbeitet um den Antwort-Header der Seite zu verarbeiten.

Edit: offenbar gibt es eine [URL="http://de.php.net/manual/en/reserved.variables.httpresponseheader.php"]Variable namens $http_response_header[/URL], die den Antwort-Header komplett enthält. Vielleicht könnte man mit der was entsprechendes bauen. Aber wahrscheinlicher ist es, dass es für dieses Problem eine viel, viel simplere Lösung gibt...


Duddle
 
Zuletzt bearbeitet:

Rum0

PSler

AW:
PHP:
 HTTP Post ohne cURL[/b]

Danke, dass du dich da so reinhängst für mich.
Und du hast Recht.
Ich habs mir in HTTPFox noch Mal angeguckt. Firebug lad ich mir auch gleich mal runter.
Der 302 Redirect hat im Header Set-Cookie: lockerz=weirdnumbersandchars
Dieser Cookie wird an den Cookie angehängt, der schon beim Post auf /auth/login mitgeschickt wurde, und das Ganze steht dann im Header zum GET Request auf /myLocker.
Also muss ich den Cookie aus dem HTTP Header auslesen, und beim Get dann mitschicken.
Aber muss ich den Cookie, der schon beim Http Post mitgeschickt wurde, auch noch manuell hinzufügen?
Ich werde es nachher so oder so mal ausprobieren.

So sieht jetzt erst Mal das Script aus, um den Set-Cookie auszulesen.
[php]
<?php
$data = "remember+me=on&handle=username%40mail.de&password=usernamespassword";
$params = array('http' => array(
                'method' => 'POST',
                'header' => array(
                    'Content-Type' => "application/x-www-form-urlencoded",
                    'Content-Length' => strlen($data),
                    'User-Agent' => "Mozilla/5.0 (Windows; U; Windows NT 6.1; de; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3",
                    'Referer' => "http://www.lockerz.com/"
                ),
                'content' => $data
                )
        );
$ctx = stream_context_get_default($params);
$responseHeader = get_headers("http://www.lockerz.com/auth/login");
$num_elements = count($responseHeader); 
for ($i = 0; $i < $num_elements; ++$i) {
    if(eregi('Set-Cookie: ', $responseHeader[$i]) == true && eregi('lockerz=', $responseHeader[$i]) == true) {
        $values = explode(": ", $responseHeader[$i]);
        $cookievalue = explode(";", $values[1]);
        print $cookievalue[0] . "\n";
    }
}    
?>
Natürlich kann ich mit break; nur eine der Cookie-Values als Cookie-Value setzen, aber welche muss es denn sein?
Die Lösung um den eigentlichen Cookie-Wert auszulesen mag noch unschön sein, aber sie funktioniert. Merkwürdigerweise gibt das ganze aber 3 Ergebnisse, wie du hier sehen kannst:
http://skillz-entertainment.kilu.de/invites/index_new.php
Danke noch Mal für deine Mühe.
Rum0
 
Zuletzt bearbeitet:
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Statistik des Forums

Themen
118.565
Beiträge
1.538.067
Mitglieder
67.488
Neuestes Mitglied
Andrew56524
Oben