Как пройти экран входа в систему при вызове Guzzle

StackOverflow https://stackoverflow.com//questions/25089960

  •  02-01-2020
  •  | 
  •  

Вопрос

Мне нужно отправить информацию на внешний веб-сайт, используя cURL.Я настроил Guzzle в своем приложении Laravel.У меня настроены основные параметры, но согласно документации веб-сайта для имени пользователя и пароля требуется действие.Как я могу передать «действие» вместе с учетными данными, необходимыми для входа в систему и получения доступа?

На сайте указано:

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

Мой контроллер:

    $client = new \GuzzleHttp\Client();

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

    $xml = $response;
    echo $xml;

Сайт загрузится на echo, но откроется только экран входа в систему.Мне нужны эти учетные данные, чтобы обойти экран входа в систему (при успешном входе в систему) и получить ту часть информации, которая мне нужна для cURL.

Это было полезно?

Решение

curl -F отправляет запрос POST вместо запроса GET.Поэтому вам нужно будет соответствующим образом изменить свой код, что-то вроде

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

Видеть http://guzzle.readthedocs.org/en/latest/quickstart.html#post-requests, http://curl.haxx.se/docs/manpage.html#-F

Редактировать:

Просто добавь ['cookies' => true] к запросам, чтобы использовать файл cookie аутентификации, связанный с этим GuzzleHttp\Client(). http://guzzle.readthedocs.org/en/latest/clients.html#cookies

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

Другие советы

У меня возникли проблемы с получением ответа @JeremiahWinsley для работы с более новой версией Guzzle, поэтому я обновил их код, чтобы он работал с Guzzle 5.x.

Требуются три основных изменения

  • С использованием form_params вместо body чтобы предотвратить ошибку «Передача опции запроса «body» в качестве массива для отправки запроса POST устарела».
  • Изменение файлов cookie для использования CookieJar объект
  • Использовать ->getBody()->getContents() чтобы получить тело запроса

Вот обновленный код:

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

А чтобы продолжать использовать файлы cookie в будущих запросах, передайте cookieJar на запрос:

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

У меня возникли проблемы с получением ответа @JeremiahWinsley и @Samsquanch для работы над новой версией Guzzle.Поэтому я обновил код, чтобы он работал с Guzzle 6.x.

Жрать 6.х.документы: http://docs.guzzlephp.org/en/stable/index.html

Вот обновленный код:

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();
    }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top