2017-04-23 149 views
1

是否可以通過登錄表單身份驗證用戶,例如通過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,保存頁面爲「github.com/login」和用戶未通過身份驗證

+0

參考日是http://stackoverflow.com/questions/25089960/how-to-get-past-login-screen-on-guzzle-call –

+0

我之前檢查過該頁面,但它不適用,我認爲該網頁的工作api認證。你有什麼意見如何做到這一點? @BhupeshKushwaha –

回答