Come passare la schermata di accesso passata sulla chiamata Guzzle
Domanda
Devo inviare informazioni a un sito Web esterno usando il ricciolo.Ho impostato il Guzzle sulla mia applicazione laravel.Ho impostato le basi, ma secondo la documentazione del sito web, c'è un'azione necessaria per il nome utente e la password.Come posso passare l''azione' insieme alle credenziali necessarie per accedere e ottenere l'accesso?
Il sito Web indica:
curl [-k] –dump-header <header_file> -F “action=login” -F “username=<username>” -F “password=<password>” https://<website_URL>
My Controller:
$client = new \GuzzleHttp\Client();
$response = $client->get('http://website.com/page/login/', array(
'auth' => array('username', 'password')
));
$xml = $response;
echo $xml;
.
Il sito Web verrà caricato sul echo
, ma tirerà solo la schermata di accesso.Ho bisogno di quelle credenziali per bypassare la schermata di accesso (con un login di successo) per arrivare alla porzione di informazioni di cui ho bisogno per arricciatura.
Soluzione
curl -F
invia una richiesta post invece di una richiesta di ricezione.Quindi dovrai modificare il tuo codice di conseguenza, qualcosa come
$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;
.
Vedi http://guzzle.readthedocs.org/en/latest/quickstart.html#Post-richieste , http://curl.haxx.se/docs/manpage.html#-F
Modifica:
Basta aggiungere ['cookies' => true]
alle richieste per utilizzare il cookie Auth associato a questo GuzzleHttp\Client()
. http://guzzle.readthedocs.org/en/latest/clients.html#cookies .
$response2 = $client->get('http://website.com/otherpage/', ['cookies' => true]);
. Altri suggerimenti
Avevo problemi a ottenere la risposta di @ Jeremiahwinsley per lavorare sulla versione più recente del Guzzle, quindi ho aggiornato il loro codice per funzionare come Guzzle 5.x.
Sono richiesti tre modifiche principali
- .
- Utilizzo di
form_params
invece dibody
per impedire l'errore "Passare nell'opzione di richiesta" corpo "come array per inviare una richiesta di post è stata deprecata." - Modifica dei cookie per utilizzare l'oggetto
CookieJar
- Utilizzare
->getBody()->getContents()
per ottenere il corpo della richiesta .
Ecco il codice aggiornato:
$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;
.
e per continuare a utilizzare i cookie nelle richieste future, passare nel cookieJar
alla richiesta:
$response2 = $client->get('http://website.com/otherpage/', ['cookies' => $cookieJar]);
. Avevo problemi a ottenere @ Jeremiahwinsley's e @ Risposta di Samsquanch per lavorare sulla nuova versione di Guzzle.Quindi ho aggiornato il codice per lavorare da Guzzle 6.x.
Guzzle 6.x.Documenti: http://docs.guzzelphp.org/en/stable/index.htmljem/A>
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();
}
.