WordPress.org

Plugin Directory

Changeset 602487


Ignore:
Timestamp:
09/22/12 19:22:50 (19 months ago)
Author:
betzster
Message:

Rewrite of the Twitter-OAuth interface to use the WordPress HTTP API instead of using cURL directly

  • Spaces -> tabs
  • Change from C to C++ style comments
  • Introduce constants instead of functions that always return the same thing
Location:
tweet-posts/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • tweet-posts/trunk/readme.txt

    r602206 r602487  
    44Requires at least: 3.4 
    55Tested up to: 3.4.1 
    6 Stable tag: 0.2.1 
     6Stable tag: 0.3 
    77 
    88Tweet your posts. 
     
    2323== Changelog == 
    2424 
     25= 0.3 = 
     26* Rewrite of the Twitter-OAuth interface to use the WordPress HTTP API instead of using cURL directly. 
     27 
    2528= 0.2.1 = 
    2629* Bug fix: Didn't show Twitter API info in the admin 
  • tweet-posts/trunk/tweet-posts.php

    r602206 r602487  
    44Plugin URI: http://joshbetz.com/2012/08/tweet-posts/ 
    55Description: Tweet your posts. 
    6 Version: 0.2.1 
     6Version: 0.3 
    77Author: Josh Betz 
    88Author URI: http://joshbetz.com 
     
    1313class Tweet_Posts { 
    1414 
    15     const VERSION = '0.2.1'; 
     15    const VERSION = '0.3'; 
    1616    const SLUG    = 'tweet-posts'; 
    1717    const OPTION  = 'tweet_posts'; 
  • tweet-posts/trunk/twitteroauth.php

    r590723 r602487  
    55 * 
    66 * The first PHP Library to support OAuth for Twitter's REST API. 
     7 * 
     8 * Modifications for WordPress made by Josh Betz - http://joshbetz.com 
    79 */ 
    810 
    9 /* Load OAuth lib. You can find it at http://oauth.net */ 
     11// Load OAuth lib. You can find it at http://oauth.net 
    1012require_once('OAuth.php'); 
    1113 
     
    1416 */ 
    1517class TwitterOAuth { 
    16   /* Contains the last HTTP status code returned. */ 
    17   public $http_code; 
    18   /* Contains the last API call. */ 
    19   public $url; 
    20   /* Set up the API root URL. */ 
    21   public $host = "https://api.twitter.com/1/"; 
    22   /* Set timeout default. */ 
    23   public $timeout = 30; 
    24   /* Set connect timeout. */ 
    25   public $connecttimeout = 30;  
    26   /* Verify SSL Cert. */ 
    27   public $ssl_verifypeer = FALSE; 
    28   /* Respons format. */ 
    29   public $format = 'json'; 
    30   /* Decode returned json data. */ 
    31   public $decode_json = TRUE; 
    32   /* Contains the last HTTP headers returned. */ 
    33   public $http_info; 
    34   /* Set the useragnet. */ 
    35   public $useragent = 'WordPress'; 
    36  
    37  
    38   /** 
    39    * Set API URLS 
    40    */ 
    41   function accessTokenURL()  { return 'https://api.twitter.com/oauth/access_token'; } 
    42   function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; } 
    43   function authorizeURL()    { return 'https://api.twitter.com/oauth/authorize'; } 
    44   function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; } 
    45  
    46   /** 
    47    * Debug helpers 
    48    */ 
    49   function lastStatusCode() { return $this->http_status; } 
    50   function lastAPICall() { return $this->last_api_call; } 
    51  
    52   /** 
    53    * construct TwitterOAuth object 
    54    */ 
    55   function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) { 
    56     $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); 
    57     $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); 
    58     if (!empty($oauth_token) && !empty($oauth_token_secret)) { 
    59       $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret); 
    60     } else { 
    61       $this->token = NULL; 
    62     } 
    63   } 
    64  
    65  
    66   /** 
    67    * Get a request_token from Twitter 
    68    * 
    69    * @returns a key/value array containing oauth_token and oauth_token_secret 
    70    */ 
    71   function getRequestToken($oauth_callback = NULL) { 
    72     $parameters = array(); 
    73     if (!empty($oauth_callback)) { 
    74       $parameters['oauth_callback'] = $oauth_callback; 
    75     }  
    76     $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters); 
    77     $token = OAuthUtil::parse_parameters($request); 
    78     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    79     return $token; 
    80   } 
    81  
    82   /** 
    83    * Get the authorize URL 
    84    * 
    85    * @returns a string 
    86    */ 
    87   function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) { 
    88     if (is_array($token)) { 
    89       $token = $token['oauth_token']; 
    90     } 
    91     if (empty($sign_in_with_twitter)) { 
    92       return $this->authorizeURL() . "?oauth_token={$token}"; 
    93     } else { 
    94        return $this->authenticateURL() . "?oauth_token={$token}"; 
    95     } 
    96   } 
    97  
    98   /** 
    99    * Exchange request token and secret for an access token and 
    100    * secret, to sign API calls. 
    101    * 
    102    * @returns array("oauth_token" => "the-access-token", 
    103    *                "oauth_token_secret" => "the-access-secret", 
    104    *                "user_id" => "9436992", 
    105    *                "screen_name" => "abraham") 
    106    */ 
    107   function getAccessToken($oauth_verifier = FALSE) { 
    108     $parameters = array(); 
    109     if (!empty($oauth_verifier)) { 
    110       $parameters['oauth_verifier'] = $oauth_verifier; 
    111     } 
    112     $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters); 
    113     $token = OAuthUtil::parse_parameters($request); 
    114     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    115     return $token; 
    116   } 
    117  
    118   /** 
    119    * One time exchange of username and password for access token and secret. 
    120    * 
    121    * @returns array("oauth_token" => "the-access-token", 
    122    *                "oauth_token_secret" => "the-access-secret", 
    123    *                "user_id" => "9436992", 
    124    *                "screen_name" => "abraham", 
    125    *                "x_auth_expires" => "0") 
    126    */   
    127   function getXAuthToken($username, $password) { 
    128     $parameters = array(); 
    129     $parameters['x_auth_username'] = $username; 
    130     $parameters['x_auth_password'] = $password; 
    131     $parameters['x_auth_mode'] = 'client_auth'; 
    132     $request = $this->oAuthRequest($this->accessTokenURL(), 'POST', $parameters); 
    133     $token = OAuthUtil::parse_parameters($request); 
    134     $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
    135     return $token; 
    136   } 
    137  
    138   /** 
    139    * GET wrapper for oAuthRequest. 
    140    */ 
    141   function get($url, $parameters = array()) { 
    142     $response = $this->oAuthRequest($url, 'GET', $parameters); 
    143     if ($this->format === 'json' && $this->decode_json) { 
    144       return json_decode($response); 
    145     } 
    146     return $response; 
    147   } 
    148    
    149   /** 
    150    * POST wrapper for oAuthRequest. 
    151    */ 
    152   function post($url, $parameters = array()) { 
    153     $response = $this->oAuthRequest($url, 'POST', $parameters); 
    154     if ($this->format === 'json' && $this->decode_json) { 
    155       return json_decode($response); 
    156     } 
    157     return $response; 
    158   } 
    159  
    160   /** 
    161    * DELETE wrapper for oAuthReqeust. 
    162    */ 
    163   function delete($url, $parameters = array()) { 
    164     $response = $this->oAuthRequest($url, 'DELETE', $parameters); 
    165     if ($this->format === 'json' && $this->decode_json) { 
    166       return json_decode($response); 
    167     } 
    168     return $response; 
    169   } 
    170  
    171   /** 
    172    * Format and sign an OAuth / API request 
    173    */ 
    174   function oAuthRequest($url, $method, $parameters) { 
    175     if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { 
    176       $url = "{$this->host}{$url}.{$this->format}"; 
    177     } 
    178     $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters); 
    179     $request->sign_request($this->sha1_method, $this->consumer, $this->token); 
    180     switch ($method) { 
    181     case 'GET': 
    182       return $this->http($request->to_url(), 'GET'); 
    183     default: 
    184       return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); 
    185     } 
    186   } 
    187  
    188   /** 
    189    * Make an HTTP request 
    190    * 
    191    * @return API results 
    192    */ 
    193   function http($url, $method, $postfields = NULL) { 
    194     $this->http_info = array(); 
    195     $ci = curl_init(); 
    196     /* Curl settings */ 
    197     curl_setopt($ci, CURLOPT_USERAGENT, $this->useragent); 
    198     curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout); 
    199     curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout); 
    200     curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE); 
    201     curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:')); 
    202     curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer); 
    203     curl_setopt($ci, CURLOPT_HEADERFUNCTION, array($this, 'getHeader')); 
    204     curl_setopt($ci, CURLOPT_HEADER, FALSE); 
    205  
    206     switch ($method) { 
    207       case 'POST': 
    208         curl_setopt($ci, CURLOPT_POST, TRUE); 
    209         if (!empty($postfields)) { 
    210           curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields); 
    211         } 
    212         break; 
    213       case 'DELETE': 
    214         curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE'); 
    215         if (!empty($postfields)) { 
    216           $url = "{$url}?{$postfields}"; 
    217         } 
    218     } 
    219  
    220     curl_setopt($ci, CURLOPT_URL, $url); 
    221     $response = curl_exec($ci); 
    222     $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE); 
    223     $this->http_info = array_merge($this->http_info, curl_getinfo($ci)); 
    224     $this->url = $url; 
    225     curl_close ($ci); 
    226     return $response; 
    227   } 
    228  
    229   /** 
    230    * Get the header info to store. 
    231    */ 
    232   function getHeader($ch, $header) { 
    233     $i = strpos($header, ':'); 
    234     if (!empty($i)) { 
    235       $key = str_replace('-', '_', strtolower(substr($header, 0, $i))); 
    236       $value = trim(substr($header, $i + 2)); 
    237       $this->http_header[$key] = $value; 
    238     } 
    239     return strlen($header); 
    240   } 
     18 
     19    // Set API URLs 
     20    const ACCESS_TOKEN = 'https://api.twitter.com/oauth/access_token'; 
     21    const AUTHENTICATE = 'https://api.twitter.com/oauth/authenticate'; 
     22    const AUTHORIZE = 'https://api.twitter.com/oauth/authorize'; 
     23    const REQUEST_TOKEN = 'https://api.twitter.com/oauth/request_token'; 
     24 
     25    // Contains the last HTTP status code returned. 
     26    public $http_code; 
     27 
     28    // Contains the last API call. 
     29    public $url; 
     30 
     31    // Set up the API root URL. 
     32    public $host = "https://api.twitter.com/1/"; 
     33 
     34    // Set timeout default. 
     35    public $timeout = 30; 
     36 
     37    // Verify SSL Cert. 
     38    public $ssl_verifypeer = FALSE; 
     39 
     40    // Respons format. 
     41    public $format = 'json'; 
     42 
     43    // Decode returned json data. 
     44    public $decode_json = TRUE; 
     45 
     46    // Contains the last HTTP headers returned. 
     47    public $http_info; 
     48 
     49 
     50    /** 
     51     * construct TwitterOAuth object 
     52     */ 
     53    function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) { 
     54        $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1(); 
     55        $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret); 
     56        if (!empty($oauth_token) && !empty($oauth_token_secret)) { 
     57            $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret); 
     58        } else { 
     59            $this->token = NULL; 
     60        } 
     61    } 
     62 
     63 
     64    /** 
     65     * Get a request_token from Twitter 
     66     * 
     67     * @returns a key/value array containing oauth_token and oauth_token_secret 
     68     */ 
     69    function getRequestToken($oauth_callback = NULL) { 
     70        $parameters = array(); 
     71        if (!empty($oauth_callback)) { 
     72            $parameters['oauth_callback'] = $oauth_callback; 
     73        } 
     74        $request = $this->oAuthRequest(self::REQUEST_TOKEN, 'GET', $parameters); 
     75        $token = OAuthUtil::parse_parameters($request); 
     76        $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
     77        return $token; 
     78    } 
     79 
     80    /** 
     81     * Get the authorize URL 
     82     * 
     83     * @returns a string 
     84     */ 
     85    function getAuthorizeURL($token, $sign_in_with_twitter = TRUE) { 
     86        if (is_array($token)) { 
     87            $token = $token['oauth_token']; 
     88        } 
     89        if (empty($sign_in_with_twitter)) { 
     90            return self::AUTHORIZE . "?oauth_token={$token}"; 
     91        } else { 
     92         return self::AUTHENTICATE . "?oauth_token={$token}"; 
     93     } 
     94 } 
     95 
     96    /** 
     97     * Exchange request token and secret for an access token and 
     98     * secret, to sign API calls. 
     99     * 
     100     * @returns array("oauth_token" => "the-access-token", 
     101     *                "oauth_token_secret" => "the-access-secret", 
     102     *                "user_id" => "9436992", 
     103     *                "screen_name" => "abraham") 
     104     */ 
     105    function getAccessToken($oauth_verifier = FALSE) { 
     106        $parameters = array(); 
     107        if (!empty($oauth_verifier)) { 
     108            $parameters['oauth_verifier'] = $oauth_verifier; 
     109        } 
     110        $request = $this->oAuthRequest(self::ACCESS_TOKEN, 'GET', $parameters); 
     111        $token = OAuthUtil::parse_parameters($request); 
     112        $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
     113        return $token; 
     114    } 
     115 
     116    /** 
     117     * One time exchange of username and password for access token and secret. 
     118     * 
     119     * @returns array("oauth_token" => "the-access-token", 
     120     *                "oauth_token_secret" => "the-access-secret", 
     121     *                "user_id" => "9436992", 
     122     *                "screen_name" => "abraham", 
     123     *                "x_auth_expires" => "0") 
     124     */ 
     125    function getXAuthToken($username, $password) { 
     126        $parameters = array(); 
     127        $parameters['x_auth_username'] = $username; 
     128        $parameters['x_auth_password'] = $password; 
     129        $parameters['x_auth_mode'] = 'client_auth'; 
     130        $request = $this->oAuthRequest(self::ACCESS_TOKEN, 'POST', $parameters); 
     131        $token = OAuthUtil::parse_parameters($request); 
     132        $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']); 
     133        return $token; 
     134    } 
     135 
     136    /** 
     137     * GET wrapper for oAuthRequest. 
     138     */ 
     139    function get($url, $parameters = array()) { 
     140        $response = $this->oAuthRequest($url, 'GET', $parameters); 
     141        if ($this->format === 'json' && $this->decode_json) { 
     142            return json_decode($response); 
     143        } 
     144        return $response; 
     145    } 
     146 
     147    /** 
     148     * POST wrapper for oAuthRequest. 
     149     */ 
     150    function post($url, $parameters = array()) { 
     151        $response = $this->oAuthRequest($url, 'POST', $parameters); 
     152        if ($this->format === 'json' && $this->decode_json) { 
     153            return json_decode($response); 
     154        } 
     155        return $response; 
     156    } 
     157 
     158    /** 
     159     * DELETE wrapper for oAuthReqeust. 
     160     */ 
     161    function delete($url, $parameters = array()) { 
     162        $response = $this->oAuthRequest($url, 'DELETE', $parameters); 
     163        if ($this->format === 'json' && $this->decode_json) { 
     164            return json_decode($response); 
     165        } 
     166        return $response; 
     167    } 
     168 
     169    /** 
     170     * Format and sign an OAuth / API request 
     171     */ 
     172    function oAuthRequest($url, $method, $parameters) { 
     173        if (strrpos($url, 'https://') !== 0 && strrpos($url, 'http://') !== 0) { 
     174            $url = "{$this->host}{$url}.{$this->format}"; 
     175        } 
     176        $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters); 
     177        $request->sign_request($this->sha1_method, $this->consumer, $this->token); 
     178        switch ( $method ) { 
     179            case 'GET': 
     180                return $this->http($request->to_url(), 'GET'); 
     181            default: 
     182                return $this->http($request->get_normalized_http_url(), $method, $request->to_postdata()); 
     183        } 
     184    } 
     185 
     186    /** 
     187     * Make an HTTP request 
     188     * 
     189     * @return API results 
     190     */ 
     191    function http($url, $method, $postfields = NULL) { 
     192        $this->http_info = array(); 
     193 
     194        $args = array( 
     195            'method' => $method, 
     196            'timeout' => $this->timeout, 
     197            'sslverify' => $this->ssl_verifypeer 
     198        ); 
     199 
     200        if ( !empty( $postfields ) ) 
     201            $args['body'] = $postfields; 
     202 
     203        $request = wp_remote_request( $url, $args ); 
     204        $response = wp_remote_retrieve_body( $request ); 
     205 
     206        $this->http_code = wp_remote_retrieve_response_code( $response ); 
     207        $this->http_info = wp_remote_retrieve_headers( $response ); 
     208        $this->url = $url; 
     209 
     210        return $response; 
     211    } 
     212 
    241213} 
Note: See TracChangeset for help on using the changeset viewer.