Pergunta

Tenho que enviar informações para um site externo usando cURL.Configurei o Guzzle em meu aplicativo Laravel.Tenho o básico configurado, mas de acordo com a documentação do site, existe uma ação necessária para o nome de usuário e senha.Como posso passar a 'ação' junto com as credenciais necessárias para fazer login e obter acesso?

O site afirma:

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

Meu controlador:

    $client = new \GuzzleHttp\Client();

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

    $xml = $response;
    echo $xml;

O site será carregado no echo, mas apenas abrirá a tela de login.Preciso dessas credenciais para ignorar a tela de login (com um login bem-sucedido) para chegar à parte das informações necessárias para cURL.

Foi útil?

Solução

curl -F envia uma solicitação POST em vez de uma solicitação GET.Então você precisará modificar seu código de acordo, algo como

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

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

Editar:

Basta adicionar ['cookies' => true] às solicitações para usar o cookie de autenticação associado a este GuzzleHttp\Client(). http://guzzle.readthedocs.org/en/latest/clients.html#cookies

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

Outras dicas

Eu estava tendo problemas para fazer com que a resposta de @JeremiahWinsley funcionasse na versão mais recente do Guzzle, então atualizei o código para funcionar a partir do Guzzle 5.x.

Três grandes mudanças são necessárias

  • Usando form_params em vez de body para evitar o erro "A passagem da opção de solicitação "body" como uma matriz para enviar uma solicitação POST foi descontinuada."
  • Alterando os cookies para usar o CookieJar objeto
  • Usar ->getBody()->getContents() para obter o corpo da solicitação

Aqui está o código atualizado:

$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 para continuar usando cookies em solicitações futuras, passe no cookieJar ao pedido:

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

Eu estava tendo problemas para fazer com que a resposta de @JeremiahWinsley e @Samsquanch funcionasse na versão mais recente do Guzzle.Então atualizei o código para funcionar a partir do Guzzle 6.x.

Beba 6.x.documentos: http://docs.guzzlephp.org/en/stable/index.html

Aqui está o código atualizado:

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();
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top