source: spip-zone/_plugins_/twitter/trunk/inc/twitteroauth.php @ 81826

Last change on this file since 81826 was 81826, checked in by cedric@…, 7 years ago

Le plugin utilise désormais l'API interne recuperer_page plutot que cURL, ce qui permet de passer par le proxy configuré dans SPIP

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