aboutsummaryrefslogblamecommitdiffhomepage
path: root/inc/3rdparty/libraries/send2kindle/api.php
blob: 564c171c05f7811266f963362870e20b53937b8f (plain) (tree)









































































































































































































































                                                                                                                                                                            
<?php
/**
*     @author Dimmduh
*     @email dimmduh@gmail.com
*/
class API{
    
    private $service;
    private $auth;
    private $token;
    private $source = 'GoogleReaderAPIClass-0.1';
    private $client = 'scroll';
    private $account_type = 'HOSTED_OR_GOOGLE';
    private $clientlogin_url = 'https://www.google.com/accounts/ClientLogin';
    private $reader_api_url = 'http://www.google.com/reader/api/0/';
    private $session_var_auth_name = 'google_auth';

    
    public function __construct( $email, $password, $service = 'reader' ){
        if (isset( $service ) ){
            $this -> service = $service;
        }
        /* if ( isset($_SESSION[ $this -> session_var_auth_name ] ) ){
            $this -> auth = $_SESSION[ $this -> session_var_auth_name ];
            echo "Loading";
        } else { */
            $this -> clientLogin( $email, $password );
            $this -> get_token();
        /* } */
     }
          
     
    private function request( $url, $type = 'get', $headers = false, $fields = false, $cookie = false){
     
          $curl = curl_init();
                    
          if ( $fields ){
               if ($type == 'get'){
                    $url .= '?'.http_build_query( $fields );
               } else {
                    curl_setopt($curl, CURLOPT_POST, true);
                    curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($fields) );
               }
          }
          if ( $headers ){
               curl_setopt($curl, CURLOPT_HEADER, true);
               curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
          }
           if ( $cookie ){
               curl_setopt($curl, CURLOPT_COOKIE, $cookie);
          }
          
          curl_setopt($curl, CURLOPT_URL, $url);
          if (strpos($url, 'https://') !== false){
               curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
          }
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
          curl_setopt($curl, CURLINFO_HEADER_OUT, true);
          
          $response = array();
          $response['text'] = curl_exec($curl);
          $response['info'] = curl_getinfo( $curl);
          $response['code'] = curl_getinfo( $curl, CURLINFO_HTTP_CODE );
          $response['body'] = substr( $response['text'], $response['info']['header_size'] );

          curl_close( $curl );
          return $response;
     }

     private function request2google( $url, $type = 'get', $headers = false, $fields = false ){
          if ( $this -> auth ){
               $headers[] = 'Content-type: application/x-www-form-urlencoded';
               $headers[] = 'Authorization: GoogleLogin auth='.$this -> auth;
               
               if ( strpos( $url, 'http://') === false && strpos( $url, 'https://' ) === false ){
                    $url = $this -> reader_api_url.$url;
               }
               
               $response = $this -> request( $url, $type, $headers, $fields);               
               if ( $response['code'] == 200 ){
                    if ( isset( $fields['output'] ) ){
                         switch ($fields['output']){
                              case 'xml':
                                   return (new SimpleXMLElement( $response['body'] ) );
                                   break;
                              case 'json':
                              default:
                                   return json_decode( $response['body'] );
                                   break;
                         }
                    } else {
                         return $response['body'];
                    }
               } else {
                    Throw new AutentificationException('Auth error: server response '.$response['code'] );
               }
               
          } else {
               Throw new AutentificationException('Auth error: not finded Auth token');
          }
     }
     
     public function get_tag_list( $output = 'json' ){
          return $this -> request2google('tag/list', "get", false, array(
                    'output' => $output,
                    'ck' => time(),
                    'client' => $this -> client,
               ));
     }
     public function get_subscription_list( $output = 'json' ){
          return $this -> request2google('subscription/list', "get", false, array(
                    'output' => $output,
                    'ck' => time(),
                    'client' => $this -> client,
               ));
     }
     public function get_preference_list( $output = 'json' ){
          return $this -> request2google('preference/list', "get", false, array(
                    'output' => $output,
                    'ck' => time(),
                    'client' => $this -> client,
               ));
     }
     public function get_unread_count( $output = 'json' ){
          return $this -> request2google('unread-count', "get", false, array(
                    'all' => true,
                    'output' => $output,
                    'ck' => time(),
                    'client' => $this -> client,
               ));
     }
     public function get_user_info( $output = 'json' ){
          return $this -> request2google('user-info', "get", false, array(
                    'output' => $output,
                    'ck' => time(),
                    'client' => $this -> client,
               ));
     }
     private function get_token(){
          $this -> token = $this -> request2google('token');
     }
     
     //get contents functions
     /*
          r - order
          r = n - new items
          r = o - old items
          r = a - auto sort
     
     */
     private function get_content( $content_url = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
          $fields = array(
               'ck' => time(),
               'client' => $this -> client,
               'n' => $number,
               'r' => $order,
               'output' => 'json',
          );
          if ( !empty($exclude_target) ){$fields['xt'] = $exclude_target;}
          if ( !empty($start_time) ){$fields['ot'] = $start_time;}
          if ( !empty($continuation) ){$fields['c'] = $continuation;}
          
          return $this -> request2google('stream/contents/'.Utils::urlencode( $content_url ), 'get', false, $fields);
     }
     
     public function get_content_feed( $feed_url = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
          return $this -> get_content( $feed_url, $number, $order, $exclude_target, $start_time, $continuation );
     }
     public function get_content_by_label( $label = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
          return $this -> get_content( (strpos($label, '/') === false?'user/-/label/':'').$label, $number, $order, $exclude_target, $start_time, $continuation );
     }
     public function get_content_by_state( $state = '', $number = 20, $order = 'n', $exclude_target = '', $start_time = '', $continuation = ''){
          return $this -> get_content( (strpos($state, '/') === false?'user/-/state/com.google/':'').$state, $number, $order, $exclude_target, $start_time, $continuation );
     }

    public function get_unread( $number = 20, $order = 'n' ){
        return $this ->get_content_by_state('reading-list', $number, $order, 'user/-/state/com.google/read');
    }

    public function get_starred($number = 20, $order = 'n'){
        return $this ->get_content_by_state('starred', $number, $order);
    }

    /*
     Edit functions
     */
     private function edit_do( $api_function , $post_fields ){
          $post_fields['T'] = $this -> token;
          if ( $this -> request2google( $api_function, "post", false, $post_fields ) == "OK"){
                    return true;
                } else {
                    return false;
                }
     }
     
     /* public function edit_subscription( 
     s     return $this -> edit_do( 'subscription/edit', 
     } */
     public function set_state( $itemId, $state = 'read'){
            $post_fields = array(
                "i" => $itemId,
                "a" => 'user/-/state/com.google/'.$state,
            );
            //print_r( $post_fields );
            return $this ->edit_do('edit-tag?client='.$this -> client, $post_fields);
        }

     private function clientLogin( $email, $password ){
          
          $response = $this -> request( $this -> clientlogin_url, 'post', false, array(
               "accountType" => $this -> account_type,
               "Email" => $email,
               "Passwd" => $password,
               "service" => $this -> service,
               "source" => $this -> source,
          ));
                    
          if ( $response['code'] == 200) {
               preg_match("/Auth=([a-z0-9_\-]+)/i", $response['body'], $matches_auth);               
               if ($matches_auth[1]){
                    $this -> auth = $matches_auth[1];
                    $_SESSION[ $this -> session_var_auth_name ] = $this -> auth;
                    return true;
               } else {
                    Throw new AutentificationException('Auth error: not finded Auth token in response');
               }
          } else {
               Throw new AutentificationException('Auth error: server response '.$response['code'] );
          }
     }
}

//Exceptions
class AutentificationException extends Exception {}