Created
March 4, 2010 18:30
-
-
Save fangel/321992 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* A Client for Campus Notes' (http://getcampusnotes.com) API | |
* | |
* @requires OAuth-php (http://oauth.googlecode.com/svn/code/php/) * | |
* @copyright Campus Notes (C) 2009 | |
*/ | |
/** | |
* The exception thrown when something bad happens in CampusNotesAPI | |
*/ | |
class CNApiException extends Exception {} | |
/** | |
* CampusNotesAPI is the main class. It contains methods | |
* for getting the relevant tokens, and for querying the | |
* API | |
* @author Morten Fangel <[email protected]> | |
*/ | |
class CampusNotesAPI { | |
private $oauth_consumer; | |
private $oauth_token; | |
private $hmac_signature_method; | |
const REQUEST_URL = 'http://127.0.0.1/~fangel/campusnotes/api/request_token'; | |
const AUTH_URL = 'http://127.0.0.1/~fangel/campusnotes/api/authorize'; | |
const ACCESS_URL = 'http://127.0.0.1/~fangel/campusnotes/api/access_token'; | |
const API_URL = 'http://127.0.0.1/~fangel/campusnotes/api/json'; | |
/** | |
* Create a new CampusNotesAPI instance | |
* @param OAuthConsumer $c Your consumer info | |
* @param OAuthToken $t Your AccessToken (null if none) | |
*/ | |
public function __construct( OAuthConsumer $c, OAuthToken $t = null ) { | |
$this->oauth_consumer = $c; | |
$this->oauth_token = $t; | |
$this->hmac_signature_method = $hmac_method = new OAuthSignatureMethod_HMAC_SHA1(); | |
} | |
/** | |
* Fetches a new RequestToken for you to use.. | |
* @throws CNApiException | |
* @return OAuthToken | |
*/ | |
public function getRequestToken( $callback = 'oob' ) { | |
$req = OAuthRequest::from_consumer_and_token( | |
$this->oauth_consumer, | |
null, | |
'GET', | |
self::REQUEST_URL | |
); | |
$req->set_parameter('oauth_callback', $callback); | |
$token_str = $this->_performRequest($req); | |
parse_str($token_str, $token_arr); | |
if( isset($token_arr['oauth_token'], $token_arr['oauth_token_secret']) ) { | |
return new OAuthToken($token_arr['oauth_token'], $token_arr['oauth_token_secret']); | |
} else { | |
return null; | |
} | |
} | |
/** | |
* Returns the URL you can direct the user to for authorization | |
* @param OAuthToken $request_token | |
* @param string $callback_url | |
* @return string | |
*/ | |
public function getAuthorizeUrl( OAuthToken $request_token ) { | |
$url = self::AUTH_URL . '?oauth_token=' . $request_token->key; | |
return $url; | |
} | |
/** | |
* Exchanges a RequestToken for a AccessToken | |
* @param OAuthToken $request_token | |
* @return OAuthToken | |
* @throws CNApiException | |
*/ | |
public function getAccessToken( OAuthToken $request_token, $verifier ) { | |
$req = OAuthRequest::from_consumer_and_token( | |
$this->oauth_consumer, | |
$request_token, | |
'GET', | |
self::ACCESS_URL | |
); | |
$req->set_parameter('oauth_verifier', $verifier); | |
$token_str = $this->_performRequest($req, $request_token); | |
parse_str($token_str, $token_arr); | |
if( isset($token_arr['oauth_token'], $token_arr['oauth_token_secret']) ) { | |
return new OAuthToken($token_arr['oauth_token'], $token_arr['oauth_token_secret']); | |
} else { | |
return null; | |
} | |
} | |
/** | |
* Call a method at CampusNotes | |
* @param string $method | |
* @param array $params | |
* @return array | |
* @throws CNApiException; | |
*/ | |
public function call( $method, $params ) { | |
if( !$this->oauth_token ) return array(); | |
$params['method'] = $method; | |
$req = OAuthRequest::from_consumer_and_token( | |
$this->oauth_consumer, | |
$this->oauth_token, | |
'GET', | |
self::API_URL, | |
$params | |
); | |
$json_str = $this->_performRequest($req); | |
$json = json_decode($json_str); | |
if( isset($json->error) ) { | |
throw new CNApiException( $json->msg ); | |
} else { | |
return $json; | |
} | |
} | |
/** | |
* Performs a OAuthRequest, returning the response | |
* You can give a token to force signatures with this | |
* token. If none given, the token used when creating | |
* this instance of CampusNotesAPI is used | |
* @param OAuthRequest $req | |
* @param OAuthToken $token | |
* @return string | |
* @throws CNApiException | |
*/ | |
private function _performRequest( OAuthRequest $req, OAuthToken $token = null ) { | |
$token = ($token) ? $token : $this->oauth_token; | |
$req->sign_request($this->hmac_signature_method, $this->oauth_consumer, $token); | |
$curl = curl_init(); | |
$params = $req->get_parameters(); | |
foreach( array_keys($params) AS $i ) | |
if( substr($i, 0, 6) == 'oauth_' ) | |
unset($params[$i]); | |
$url = $req->get_normalized_http_url(); | |
if( $req->get_normalized_http_method() == 'POST' ) { | |
curl_setopt($curl, CURLOPT_POST, true); | |
curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($params) ); | |
} else { | |
if( count($params) ) | |
$url .= '?' . http_build_query($params); | |
} | |
curl_setopt($curl, CURLOPT_URL, $url); | |
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |
curl_setopt($curl, CURLOPT_HTTPHEADER, array( | |
$req->to_header() | |
)); | |
$rtn = curl_exec($curl); | |
if( !$rtn ) { | |
throw new CNApiException( curl_error($curl) ); | |
} else if( curl_getinfo($curl, CURLINFO_HTTP_CODE) != 200 ) { | |
throw new CNApiException( $rtn ); | |
} else { | |
return $rtn; | |
} | |
} | |
} | |
?> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment