Frage

Ich muss Informationen über cURL an eine externe Website senden.Ich habe Guzzle in meiner Laravel-Anwendung eingerichtet.Ich habe die Grundlagen eingerichtet, aber laut der Dokumentation der Website ist eine Aktion für den Benutzernamen und das Passwort erforderlich.Wie kann ich die „Aktion“ zusammen mit den Anmeldeinformationen übergeben, die für die Anmeldung und den Zugriff erforderlich sind?

Auf der Website heißt es:

curl [-k] –dump-header <header_file> -F “action=login” -F “username=<username>” -F “password=<password>” https://<website_URL>

Mein Controller:

    $client = new \GuzzleHttp\Client();

    $response = $client->get('http://website.com/page/login/', array(
        'auth' => array('username', 'password')
    ));

    $xml = $response;
    echo $xml;

Die Website wird geladen echo, aber es wird nur der Anmeldebildschirm angezeigt.Ich benötige diese Anmeldeinformationen, um den Anmeldebildschirm (bei erfolgreicher Anmeldung) zu umgehen und zu den Informationen zu gelangen, die ich für cURL benötige.

War es hilfreich?

Lösung

curl -F sendet eine POST-Anfrage anstelle einer GET-Anfrage.Sie müssen Ihren Code also entsprechend ändern, etwa

$client = new \GuzzleHttp\Client();

$response = $client->post('http://website.com/page/login/', [
    'body' => [
        'username' => $username,
        'password' => $password,
        'action' => 'login'
    ],
    'cookies' => true
]
);

$xml = $response;
echo $xml;

Sehen http://guzzle.readthedocs.org/en/latest/quickstart.html#post-requests, http://curl.haxx.se/docs/manpage.html#-F

Bearbeiten:

Einfach hinzufügen ['cookies' => true] auf Anfragen, um das damit verbundene Auth-Cookie zu verwenden GuzzleHttp\Client(). http://guzzle.readthedocs.org/en/latest/clients.html#cookies

$response2 = $client->get('http://website.com/otherpage/', ['cookies' => true]);

Andere Tipps

Ich hatte Probleme damit, die Antwort von @JeremiahWinsley auf einer neueren Version von Guzzle zum Laufen zu bringen, also habe ich ihren Code so aktualisiert, dass er ab Guzzle 5.x funktioniert.

Drei wesentliche Änderungen sind erforderlich

  • Benutzen form_params anstatt body um den Fehler zu verhindern: „Die Übergabe der Anforderungsoption „body“ als Array zum Senden einer POST-Anfrage ist veraltet.“
  • Ändern der Cookies, um die zu verwenden CookieJar Objekt
  • Verwenden ->getBody()->getContents() um das zu bekommen Hauptteil der Anfrage

Hier ist der aktualisierte Code:

$client = new \GuzzleHttp\Client();
$cookieJar = new \GuzzleHttp\Cookie\CookieJar();

$response = $client->post('http://website.com/page/login/', [
    'form_params' => [
        'username' => $username,
        'password' => $password,
        'action' => 'login'
    ],
    'cookies' => $cookieJar
]
);

$xml = $response->getBody()->getContents();
echo $xml;

Und um in zukünftigen Anfragen weiterhin Cookies zu verwenden, geben Sie Folgendes ein cookieJar zur Anfrage:

$response2 = $client->get('http://website.com/otherpage/', ['cookies' => $cookieJar]);

Ich hatte Probleme, die Antwort von @JeremiahWinsley und @Samsquanch für die Arbeit an einer neueren Version von Guzzle zu bekommen.Daher habe ich den Code so aktualisiert, dass er ab Guzzle 6.x funktioniert.

Guzzle 6.x.Unterlagen: http://docs.guzzlephp.org/en/stable/index.html

Hier ist der aktualisierte Code:

use GuzzleHttp\Client;
use GuzzleHttp\Cookie\CookieJar;

try {
        $client = new Client();
        $cookieJar = new CookieJar();

        $response = $client->request('POST', 'http://website.com/page/login/', [
            'form_params' => [
                'username' => 'test@example.com',
                'password' => '123456'
            ],
            'cookies' => $cookieJar
        ]);

        $response2 = $client->request('GET', 'http://website.com/otherpage/', [
            'cookies' => $cookieJar
        ]);

        if ($response2->getStatusCode() == 200) {
            return $response2->getBody()->getContents();
        } else {
            return "Oops!";
        }
    } catch (\Exception $exception) {
        return 'Caught exception: ', $exception->getMessage();
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top