是否可以通过登录表单对用户进行身份验证,例如通过https://github.com/login
登录GitHub,然后转到需要登录的页面,例如https://github.com/settings/profile
?我知道像" FriendsOfPHP / Goutte"做这个工作,但他们使用" symfony / browser-kit"用guzzle打包。只有guzzle可以做到这一点吗?
我试过这个,但登录没有验证:
<?php
use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Cookie\FileCookieJar;
class guzzleRequest {
private $client;
private $jar;
private $body;
private $baseUrl;
private $host;
private $path;
public function __construct($base_url, $host) {
$this->path = __DIR__ . '/tmp/cookie.txt';
$this->jar = new FileCookieJar($this->path);
$this->client = new Client(['cookies' => $this->jar, 'allow_redirects' => TRUE]);
$this->baseUrl = $base_url;
$this->host = $host;
}
protected function makeRequest($page, $query = array(), $debug = false) {
try {
$options = [
'headers' => [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
'Host' => $this->host,
'Referer' => $this->baseUrl . $page
]
];
if (!empty($query)) {
$options['query'] = $query;
}
$res = $this->client->request('GET', $this->baseUrl . $page, $options);
$this->body = $res->getBody();
return true;
} catch (RequestException $e) {
$this->body = $e->getResponse()->getBody();
return false;
}
}
public function getPage($page) {
$this->makeRequest($page);
return $this->body;
}
public function submitForm($page, $query = array(), $form_params = array(), $debug = false) {
try {
$options = [
'headers' => [
'User-Agent' => 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.102 Safari/537.36',
'Host' => $this->host,
'Referer' => $this->baseUrl . $page
]
];
if (!empty($query)) {
$options['query'] = $query;
}
if (!empty($form_params)) {
$options['form_params'] = $form_params;
}
$res = $this->client->request('POST', $this->baseUrl . $page, $options);
$this->body = $res->getBody();
$this->jar->save($this->path);
return true; //everything is fine
} catch (RequestException $e) {
$this->body = $e->getResponse()->getBody();
return false;
}
}
public function saveBody($mod = '') {
file_put_contents('tmp/output' . $mod . '.html', $this->body);
}
public function loadBody() {
$this->body = file_get_contents('test/output.html');
return $this->body;
}
}
然后调用它:
require_once 'vendor/autoload.php';
require_once 'guzzleRequest.php';
$guzzleRequest = new guzzleRequest("https://github.com", "github.com");
$form_params = ["login" => "user", "password" => "pass"];
$guzzleRequest->submitForm('/session', array(), $form_params, true);
$guzzleRequest->getPage('/settings/profile');
$guzzleRequest->saveBody();
但是在output.html中,保存页面是&#34; github.com/login"并且用户未经过身份验证
答案 0 :(得分:0)
我在github上打开了一个问题,并得到了答案,只有guzzle才能做到这一点 &#34; https://github.com/guzzle/guzzle/issues/1817&#34;