Php 如何通过Guzzle呼叫的登录屏幕

Php 如何通过Guzzle呼叫的登录屏幕,php,curl,laravel,guzzle,Php,Curl,Laravel,Guzzle,我必须使用cURL将信息发送到外部网站。我在Laravel应用程序上设置了Guzzle。我已经设置了基本设置,但是根据网站的文档,用户名和密码需要一个操作。如何传递“操作”以及登录和访问所需的凭据 该网站声明: curl[-k]–转储标题-F“action=login”-F“username=“-F”password=“https:// 我的控制器: $client = new \GuzzleHttp\Client(); $response = $client->get(

我必须使用cURL将信息发送到外部网站。我在Laravel应用程序上设置了Guzzle。我已经设置了基本设置,但是根据网站的文档,用户名和密码需要一个操作。如何传递“操作”以及登录和访问所需的凭据

该网站声明:

curl[-k]–转储标题-F“action=login”-F“username=“-F”password=“https://

我的控制器:

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

编辑:

只需将
['cookies'=>true]
添加到请求中,即可使用与此
GuzzleHttp\Client()关联的身份验证cookie


我很难得到@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;
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();
    }
要在将来的请求中继续使用cookie,请将
cookieJar
传递给请求:

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

我很难得到@JeremiahWinsley和@Samsquanch的答案来制作新版Guzzle。因此,我已经更新了代码,使其在Guzzle 6.x中工作

狂饮6.x。文件:

以下是更新的代码:

$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;
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();
    }

使用您建议的方式,我仍然只能获得登录页面。不确定我还可以尝试什么。只是为了确保,您可以使用给定的命令成功地对url执行cURL请求,对吗?我想是的,当我回显$xml变量时,页面将出现,但只会显示到登录屏幕。它需要打开页面,但要成功登录。然后我可以继续我需要做的事情,通过xml文件发送。对不起,我是指你帖子中的命令<代码>curl-F“action=login”-F“username=“-F”password=”http://website.com/page/login/这会生成登录页面还是正确的页面?@RoydonD'Souza查看并