2010-01-22 12 views
1

J'essaie de récupérer tous les profils d'un compte Google Analytics en PHP. J'utilise la classe HTTP_Request2 de PEAR (avec adaptateur cURL, mais j'ai aussi essayé avec Socket) et je reçois toujours l'erreur "Target feed is read-only" quand j'essaie d'extraire des données de https://www.google.com/analytics/feeds/accounts/default"Le flux cible est en lecture seule" dans l'API Google Analytics utilisant PEAR HTTP_Request2

Je suis en utilisant la méthode d'authentification ClientLogin et autant que je peux voir l'en-tête d'autorisation correct est envoyé avec chaque demande d'API (j'ai utilisé la classe d'observateur pour tester les en-têtes qui sont envoyés).

Voici le code que je l'utilise (stripped-down, version test):

require 'HTTP/Request2.php'; 


class GA { 

    protected $email; 
    protected $passwd; 
    protected $auth_code; 

    public function __construct($email = '', $passwd = '') { 
     $this->email = $email; 
     $this->passwd = $passwd; 
    } 

    public function authorize($email = '', $password = '', $force = false) { 

     if (!$force and !empty($this->auth_code) and $email == $this->email and $password == $this->passwd) { 
      return true; 
     } 

     unset($this->auth_code); 

     !empty($email) or $email = $this->email; 
     !empty($password) or $password = $this->passwd; 

     if (empty($email) or empty($password)) { 
      return false; 
     } 

     try { 

      $response = $this->post(
       'https://www.google.com/accounts/ClientLogin', 
       array(
        'accountType' => 'GOOGLE', 
        'Email' => $this->email = $email, 
        'Passwd' => $this->passwd = $password, 
        'service' => 'analytics' 
       ) 
      ); 

      if ($response->getStatus() == 200 and preg_match('/(?:^|[\n\r])Auth=(.*?)(?:[\n\r]|$)/', $response->getBody(), $match)) { 

       $this->auth_code = $match[1]; 
            echo $this->auth_code; 
       return true; 
      } 

     } catch (HTTP_Request2_Exception $e) { 
      return false; 
     } 
    } 

    public function call($url, array $params = array(), array $headers = array()) { 

     if (!$this->auth_code && !$this->authorize($this->email, $this->passwd, true)) { 
      return false; 
     } 

     $headers['Authorization'] = 'GoogleLogin auth=' . $this->auth_code; 

     return $this->post($url, $params, $headers); 
    } 

    protected function post($url, array $params = array(), array $headers = array()) { 

     $headers['GData-Version'] = '2'; 

     $request = new HTTP_Request2($url); 
     $request->setAdapter('curl'); 
     $request->setConfig('ssl_verify_peer', false); 
     $request->setHeader($headers); 
     $request->setMethod(HTTP_Request2::METHOD_POST); 
     $request->addPostParameter($params); 

     return $request->send(); 
    } 
} 

$ga = new GA('*********@gmail.com', '*********'); 

var_dump($ga->call('https://www.google.com/analytics/feeds/accounts/default')); 

Merci à l'avance!

Répondre