Question

Je dois envoyer des informations à un site Web externe en utilisant cURL.J'ai configuré Guzzle sur mon application Laravel.J'ai configuré les bases, mais selon la documentation du site Web, une action est requise pour le nom d'utilisateur et le mot de passe.Comment puis-je transmettre « l'action » ainsi que les informations d'identification nécessaires pour me connecter et obtenir l'accès ?

Le site Web indique :

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

Mon contrôleur :

    $client = new \GuzzleHttp\Client();

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

    $xml = $response;
    echo $xml;

Le site Web se chargera sur le echo, mais cela ne fera qu'afficher l'écran de connexion.J'ai besoin de ces informations d'identification pour contourner l'écran de connexion (avec une connexion réussie) afin d'accéder à la partie des informations dont j'ai besoin pour cURL.

Était-ce utile?

La solution

curl -F soumet une requête POST au lieu d’une requête GET.Vous devrez donc modifier votre code en conséquence, quelque chose comme

$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;

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

Modifier:

Ajoutez simplement ['cookies' => true] aux demandes afin d'utiliser le cookie d'authentification associé à ce GuzzleHttp\Client(). http://guzzle.readthedocs.org/en/latest/clients.html#cookies

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

Autres conseils

J'avais du mal à faire fonctionner la réponse de @JeremiahWinsley sur une version plus récente de Guzzle, j'ai donc mis à jour leur code pour qu'il fonctionne à partir de Guzzle 5.x.

Trois changements majeurs sont nécessaires

  • En utilisant form_params au lieu de body pour éviter l'erreur "Le passage de l'option de requête "body" en tant que tableau pour envoyer une requête POST est obsolète."
  • Modification des cookies pour utiliser le CookieJar objet
  • Utiliser ->getBody()->getContents() pour obtenir le corps de la demande

Voici le code mis à jour :

$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;

Et pour continuer à utiliser les cookies dans vos futures requêtes, transmettez le cookieJar à la demande :

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

J'avais du mal à obtenir la réponse de @JeremiahWinsley et @Samsquanch pour travailler sur une version plus récente de Guzzle.J'ai donc mis à jour le code pour qu'il fonctionne à partir de Guzzle 6.x.

Engloutir 6.x.document : http://docs.guzzlephp.org/en/stable/index.html

Voici le code mis à jour :

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();
    }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top