3 * Abraham Williams (abraham@abrah.am) http://abrah.am
\r
5 * Basic lib to work with Twitter's OAuth beta. This is untested and should not
\r
6 * be used in production code. Twitter's beta could change at anytime.
\r
9 * Fire Eagle code - http://github.com/myelin/fireeagle-php-lib
\r
10 * twitterlibphp - http://github.com/jdp/twitterlibphp
\r
13 //require_once('config.php');
\r
14 //require_once('oauth_lib.php');
\r
17 * Twitter OAuth class
\r
19 class TwitterOAuth {
\r
20 /* Contains the last HTTP status code returned */
\r
22 /* Contains the last API call */
\r
23 public $last_api_call;
\r
24 /* Set up the API root URL */
\r
25 //public $host = "https://api.twitter.com/1/";
\r
26 public $host = API_URL;
\r
27 /* Set timeout default */
\r
28 public $timeout = 5;
\r
29 /* Set connect timeout */
\r
30 public $connecttimeout = 30;
\r
31 /* Verify SSL Cert */
\r
32 public $ssl_verifypeer = FALSE;
\r
34 public $type = 'json';
\r
35 /* Decode return json data */
\r
36 public $decode_json = TRUE;
\r
38 public $source = 'embr';
\r
42 public $screen_name;
\r
47 public $http_header;
\r
52 function accessTokenURL() { return 'https://api.twitter.com/oauth/access_token'; }
\r
53 function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }
\r
54 function authorizeURL() { return 'https://api.twitter.com/oauth/authorize'; }
\r
55 function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }
\r
60 function lastStatusCode() { return $this->http_status; }
\r
61 function lastAPICall() { return $this->last_api_call; }
\r
64 * construct TwitterOAuth object
\r
66 function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
\r
67 $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
\r
68 $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
\r
69 if (!empty($oauth_token) && !empty($oauth_token_secret)) {
\r
70 $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
\r
71 $this->screen_name = $_SESSION['access_token']['screen_name'];
\r
72 $this->username = $_SESSION['access_token']['screen_name'];
\r
73 $this->user_id = $_SESSION['access_token']['user_id'];
\r
75 $this->token = NULL;
\r
81 * Get a request_token from Twitter
\r
83 * @returns a key/value array containing oauth_token and oauth_token_secret
\r
85 function getRequestToken($oauth_callback = NULL) {
\r
86 $parameters = array();
\r
87 if (!empty($oauth_callback)) {
\r
88 $parameters['oauth_callback'] = $oauth_callback;
\r
90 $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
\r
91 $token = OAuthUtil::parse_parameters($request);
\r
92 $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
\r
97 * Get the authorize URL
\r
101 function getAuthorizeURL($token) {
\r
102 if (is_array($token)) {
\r
103 $token = $token['oauth_token'];
\r
105 return $this->authorizeURL() . "?oauth_token={$token}";
\r
109 * Exchange the request token and secret for an access token and
\r
110 * secret, to sign API calls.
\r
112 * @returns array("oauth_token" => the access token,
\r
113 * "oauth_token_secret" => the access secret)
\r
115 function getAccessToken($oauth_verifier = FALSE) {
\r
116 $parameters = array();
\r
117 if (!empty($oauth_verifier)) {
\r
118 $parameters['oauth_verifier'] = $oauth_verifier;
\r
120 $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
\r
121 $token = OAuthUtil::parse_parameters($request);
\r
122 $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
\r
127 * GET wrappwer for oAuthRequest.
\r
129 function get($url, $parameters = array()) {
\r
130 $response = $this->oAuthRequest($url, 'GET', $parameters);
\r
131 if($response == false){
\r
134 if ($this->type == 'json' && $this->decode_json) {
\r
135 return json_decode($response);
\r
136 }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){
\r
137 return simplexml_load_string($response);
\r
143 * POST wreapper for oAuthRequest.
\r
145 function post($url, $parameters = array(), $multipart = NULL) {
\r
146 $response = $this->oAuthRequest($url, 'POST', $parameters, $multipart);
\r
147 if($response === false){
\r
150 if ($this->type === 'json' && $this->decode_json) {
\r
151 return json_decode($response);
\r
152 }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){
\r
153 return simplexml_load_string($response);
\r
159 * DELTE wrapper for oAuthReqeust.
\r
161 function delete($url, $parameters = array()) {
\r
162 $response = $this->oAuthRequest($url, 'DELETE', $parameters);
\r
163 if($response === false){
\r
166 if ($this->type === 'json' && $this->decode_json) {
\r
167 return json_decode($response);
\r
168 }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){
\r
169 return simplexml_load_string($response);
\r
175 * Format and sign an OAuth / API request, then make an HTTP request
\r
177 function oAuthRequest($url, $method, $parameters, $multipart=NULL) {
\r
178 if ($url[0] == '/') { //non-twitter.com api shall offer the entire url.
\r
179 $url = "{$this->host}{$url}.{$this->type}";
\r
181 $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
\r
182 $request->sign_request($this->sha1_method, $this->consumer, $this->token);
\r
183 $request->set_http_header($multipart);
\r
186 /* Curl settings */
\r
187 curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
\r
188 curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
\r
189 curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
\r
190 curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
\r
194 curl_setopt($ci, CURLOPT_URL, $request->to_url());
\r
195 curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
\r
198 $postfields = $multipart ? $multipart : $request->to_postdata();
\r
199 curl_setopt($ci, CURLOPT_URL, $request->get_normalized_http_url());
\r
200 curl_setopt($ci, CURLOPT_HTTPHEADER, $request->http_header);
\r
201 curl_setopt($ci, CURLOPT_POST, TRUE);
\r
202 if (!empty($postfields)) {
\r
203 curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
\r
207 $postfields = $request->to_postdata($multipart);
\r
208 $url = $request->get_normalized_http_url();
\r
209 curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');
\r
210 curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
\r
211 if (!empty($postfields)) {
\r
212 $url = "{$url}?{$postfields}";
\r
213 curl_setopt($ci, CURLOPT_URL, $url);
\r
217 $response = curl_exec($ci);
\r
218 $this->http_header = $request->http_header;
\r
219 $this->curl_info = curl_getinfo($ci);
\r
220 $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
\r
221 $this->last_api_call = curl_getinfo($ci, CURLINFO_EFFECTIVE_URL);
\r
229 /* ---------- API METHODS ---------- */
\r
231 /* ---------- Block ---------- */
\r
232 function blockingIDs(){
\r
233 $url = '/blocks/blocking/ids';
\r
234 return $this->get($url);
\r
237 function blockingList($id, $cursor=-1, $skip_status = 1){
\r
238 $url = '/blocks/list';
\r
241 $args['user_id'] = $id;
\r
243 $args['cursor'] = $cursor;
\r
244 $args['skip_status'] = $skip_status;
\r
245 return $this->get($url, $args);
\r
248 function blockUser($id){
\r
249 $url = "/blocks/create/$id";
\r
250 return $this->post($url);
\r
253 function isBlocked($id){
\r
254 $url = "/blocks/exists/$id";
\r
255 return $this->get($url);
\r
258 function unblockUser($id){
\r
259 $url = "/blocks/destroy/$id";
\r
260 return $this->delete($url);
\r
263 /* ---------- Messages ---------- */
\r
264 function deleteDirectMessage($id){
\r
265 $url = "/direct_messages/destroy/$id";
\r
266 return $this->delete($url);
\r
269 function directMessages($page = false, $since_id = false, $count = null, $include_entities = true){
\r
270 $url = '/direct_messages';
\r
273 $args['since_id'] = $since_id;
\r
275 $args['page'] = $page;
\r
276 if($include_entities)
\r
277 $args['include_entities'] = $include_entities;
\r
278 return $this->get($url, $args);
\r
281 function sendDirectMessage($user, $text){
\r
282 $url = '/direct_messages/new';
\r
284 $args['user'] = $user;
\r
286 $args['text'] = $text;
\r
287 return $this->post($url, $args);
\r
290 function sentDirectMessage($page = false, $since = false, $since_id = false){
\r
291 $url = '/direct_messages/sent';
\r
294 $args['since'] = $since;
\r
296 $args['since_id'] = $since_id;
\r
298 $args['page'] = $page;
\r
299 return $this->get($url, $args);
\r
302 /* ---------- List ---------- */
\r
303 function addListMember($listid, $memberid){
\r
304 $url = "/lists/members/create_all";
\r
307 $args['slug'] = $listid;
\r
309 $args['user_id'] = $memberid;
\r
311 return $this->post($url, $args);
\r
314 function beAddedLists($owner_screen_name = '', $cursor = false){
\r
315 $url = "/lists/memberships";
\r
317 if($owner_screen_name)
\r
318 $args['owner_screen_name'] = $owner_screen_name;
\r
320 $args['cursor'] = $cursor;
\r
322 return $this->get($url, $args);
\r
325 function createList($name, $description, $isPortect){
\r
326 $url = "/lists/create";
\r
329 $args['name'] = $name;
\r
331 $args['description'] = $description;
\r
333 $args['mode'] = 'private';
\r
335 return $this->post($url, $args);
\r
338 function createdLists($username = '', $cursor = false){
\r
339 $url = "/lists/ownerships";
\r
342 $args['cursor'] = $cursor;
\r
344 return $this->get($url, $args);
\r
347 function deleteList($id){
\r
348 $url = "/lists/destroy";
\r
350 $args['owner_screen_name'] = $arr[0];
\r
351 $args['slug'] = $arr[1];
\r
352 return $this->post($url, $args);
\r
355 function deleteListMember($id, $memberid){
\r
356 $arr = explode("/", $id);
\r
357 $url = "/lists/members/destroy_all";
\r
359 $args['slug'] = $arr[1];
\r
361 $args['id'] = $memberid;
\r
363 return $this->post($url, $args);
\r
366 function editList($prename, $name, $description, $isProtect){
\r
367 $url = "/lists/update";
\r
370 $args['slug'] = $prename;
\r
372 $args['name'] = $name;
\r
374 $args['description'] = $description;
\r
376 $args['mode'] = "private";
\r
377 return $this->post($url, $args);
\r
380 function followedLists($username = '', $cursor = false){
\r
381 $url = "/lists/subscriptions";
\r
384 $args['user_id'] = $username;
\r
386 $args['cursor'] = $cursor;
\r
387 return $this->get($url, $args);
\r
390 function followList($id){
\r
391 $url = "/lists/subscribers/create";
\r
392 $arr = explode("/", $id);
\r
394 $args['owner_screen_name'] = $arr[0];
\r
395 $args['slug'] = $arr[1];
\r
396 return $this->post($url, $args);
\r
399 function isFollowedList($id){
\r
400 $url = "/lists/subscribers/show";
\r
401 $arr = explode('/', $id);
\r
403 $args['owner_screen_name'] = $arr[0];
\r
404 $args['slug'] = $arr[1];
\r
405 $args['user_id'] = $this->username;
\r
406 return $this->get($url, $args);
\r
409 function listFollowers($id, $cursor = false, $skip_status = 1){
\r
410 $url = "/lists/subscribers";
\r
411 $arr = explode('/', $id);
\r
413 $args['owner_screen_name'] = $arr[0];
\r
414 $args['slug'] = $arr[1];
\r
416 $args['cursor'] = $cursor;
\r
418 $args['skip_status'] = $skip_status;
\r
419 return $this->get($url, $args);
\r
422 function listInfo($id){
\r
423 $arr = explode('/', $id);
\r
424 $url = "/lists/show";
\r
426 $args['owner_screen_name'] = $arr[0];
\r
427 $args['slug'] = $arr[1];
\r
428 return $this->get($url, $args);
\r
431 function listMembers($id, $cursor = false, $skip_status = 1){
\r
432 $arr = explode("/", $id);
\r
433 $url = "/lists/members";
\r
435 $args['owner_screen_name'] = $arr[0];
\r
436 $args['slug'] = $arr[1];
\r
438 $args['cursor'] = $cursor;
\r
440 $args['skip_status'] = $skip_status;
\r
441 return $this->get($url, $args);
\r
445 function listStatus($id, $page = false, $since_id = false,$include_rts = true, $include_entities = true){
\r
446 $arr = explode('/', $id);
\r
447 $url = '/lists/statuses';
\r
449 $args['slug'] = $arr[1];
\r
450 $args['owner_screen_name'] = $arr[0];
\r
452 $args['page'] = $page;
\r
455 $args['since_id'] = $since_id;
\r
458 $args['include_rts'] = $include_rts;
\r
459 if($include_entities)
\r
460 $args['include_entities'] = $include_entities;
\r
461 return $this->get($url, $args);
\r
464 function unfollowList($id){
\r
465 $arr = explode("/", $id);
\r
466 $url = "/lists/subscribers/destroy";
\r
468 $args['owner_screen_name'] = $arr[0];
\r
469 $args['slug'] = $arr[1];
\r
470 return $this->post($url, $args);
\r
473 /* ---------- Friendship ---------- */
\r
474 function destroyUser($id){
\r
475 $url = "/friendships/destroy/$id";
\r
476 return $this->delete($url);
\r
479 function followers($id = false, $page = false, $skip_status = true){
\r
480 $url = 'followers/list';
\r
482 $args['user_id'] = $id;
\r
483 $args['cursor'] = $page ? $page : -1;
\r
484 $args['skip_status'] = $skip_status;
\r
485 return $this->get($url, $args);
\r
488 function followUser($id, $notifications = false){
\r
489 $url = "/friendships/create/$id";
\r
492 $args['follow'] = true;
\r
493 return $this->post($url, $args);
\r
496 function friends($id = false, $page = false, $skip_status = true){
\r
497 $url = '/friends/list';
\r
500 $args['user_id'] = $id;
\r
501 $args['cursor'] = $page ? $page : -1;
\r
502 $args['skip_status'] = $skip_status;
\r
503 return $this->get($url, $args);
\r
506 function isFriend($user_a, $user_b){
\r
507 $url = '/friendships/exists';
\r
509 $args['user_a'] = $user_a;
\r
510 $args['user_b'] = $user_b;
\r
511 return $this->get($url, $args);
\r
514 function friendship($source_screen_name,$target_screen_name){
\r
515 $url = '/friendships/show';
\r
517 $args['source_screen_name'] = $source_screen_name;
\r
518 $args['target_screen_name'] = $target_screen_name;
\r
519 return $this->get($url, $args);
\r
522 function relationship($target, $source = false){
\r
523 $url = '/friendships/show';
\r
525 $args['target_screen_name'] = $target;
\r
527 $args['source_screen_name'] = $source;
\r
529 return $this->get($url, $args);
\r
532 function showUser($id = false, $email = false, $user_id = false, $screen_name = false,$include_entities = true){
\r
533 $url = '/users/show';
\r
537 elseif($screen_name)
\r
538 $args['id'] = $screen_name;
\r
540 $args['id'] = $this->user_id;
\r
542 return $this->get($url, $args);
\r
545 /* ---------- Ratelimit ---------- */
\r
546 function ratelimit(){
\r
547 $url = '/account/rate_limit_status';
\r
548 return $this->get($url,array(),false);
\r
551 /* ---------- Retweet ---------- */
\r
552 function getRetweeters($id, $count = false){
\r
553 $url = "/statuses/retweets/$id";
\r
554 if($count != false) {
\r
555 $url .= "?count=$count";
\r
557 return $this->get($url);
\r
560 function retweet($id){
\r
561 $url = "/statuses/retweet/$id";
\r
562 return $this->post($url);
\r
565 function retweets($id, $count = 20,$include_entities = true){
\r
569 $url = "/statuses/retweets/$id";
\r
571 $args['count'] = unt;
\r
573 $args['include_entities'] = $include_entities;
\r
574 return $this->get($url,$args);
\r
577 function retweets_of_me($page = false, $count = false, $since_id = false, $max_id = false,$include_entities = true){
\r
578 $url = '/statuses/retweets_of_me';
\r
581 $args['since_id'] = $since_id;
\r
583 $args['max_id'] = $max_id;
\r
585 $args['count'] = $count;
\r
587 $args['page'] = $page;
\r
588 if($include_entities)
\r
589 $args['include_entities'] = $include_entities;
\r
590 return $this->get($url, $args);
\r
593 /* ---------- Search ---------- */
\r
594 function search($q = false, $max_id = false, $include_entities = true){
\r
595 $url = "/search/tweets";
\r
603 $args['max_id'] = $max_id;
\r
604 if($include_entities)
\r
605 $args['include_entities'] = $include_entities;
\r
606 return $this->get($url, $args);
\r
609 /* ---------- Spam ---------- */
\r
610 function reportSpam($screen_name){
\r
611 $url = '/report_spam';
\r
613 $args['screen_name'] = $screen_name;
\r
614 return $this->post($url, $args);
\r
617 /* ---------- Timeline ---------- */
\r
618 function deleteStatus($id){
\r
619 $url = "/statuses/destroy/$id";
\r
620 return $this->delete($url);
\r
623 function homeTimeline($page = false, $since_id = false, $count = false, $include_entities = true) {
\r
624 $url = '/statuses/home_timeline';
\r
627 $args['page'] = $page;
\r
629 $args['since_id'] = $since_id;
\r
631 $args['count'] = $count;
\r
632 if($include_entities)
\r
633 $args['include_entities'] = $include_entities;
\r
634 return $this->get($url, $args);
\r
637 function friendsTimeline($page = false, $since_id = false, $count = false,$include_entities = true){
\r
638 $url = '/statuses/friends_timeline';
\r
641 $args['page'] = $page;
\r
643 $args['since_id'] = $since_id;
\r
645 $args['count'] = $count;
\r
646 if($include_entities)
\r
647 $args['include_entities'] = $include_entities;
\r
648 return $this->get($url, $args);
\r
651 function getFavorites($page = false,$userid=false,$include_entities = true){
\r
652 $url = '/favorites/list';
\r
655 $args['user_id'] = $userid;
\r
657 $args['page'] = $page;
\r
658 if($include_entities)
\r
659 $args['include_entities'] = $include_entities;
\r
660 return $this->get($url, $args);
\r
663 function makeFavorite($id){
\r
664 $url = "/favorites/create/$id";
\r
665 return $this->post($url);
\r
668 function publicTimeline($sinceid = false,$include_entities = true){
\r
669 $url = '/statuses/public_timeline';
\r
672 $args['since_id'] = $sinceid;
\r
674 if($include_entities)
\r
675 $args['include_entities'] = $include_entities;
\r
676 return $this->get($url, $args);
\r
679 function removeFavorite($id){
\r
680 $url = "/favorites/destroy/$id";
\r
681 return $this->post($url);
\r
684 function replies($page = false, $since_id = false,$include_entities = true){
\r
685 $url = '/statuses/mentions_timeline';
\r
688 $args['page'] = (int) $page;
\r
690 $args['since_id'] = $since_id;
\r
691 if($include_entities)
\r
692 $args['include_entities'] = $include_entities;
\r
693 return $this->get($url, $args);
\r
696 function showStatus($id,$include_entities = true){
\r
697 $url = "/statuses/show/";
\r
701 if($include_entities)
\r
702 $args['include_entities'] = $include_entities;
\r
703 return $this->get($url,$args);
\r
706 function update($status, $replying_to = false,$include_entities = true){
\r
708 $url = '/statuses/update';
\r
710 $args['status'] = $status;
\r
712 $args['in_reply_to_status_id'] = $replying_to;
\r
713 if($include_entities)
\r
714 $args['include_entities'] = $include_entities;
\r
715 return $this->post($url, $args);
\r
716 }catch(Exception $ex){
\r
717 echo $ex->getLine." : ".$ex->getMessage();
\r
721 function userTimeline($page = false, $id = false, $count = false, $since_id = false, $include_rts = true, $include_entities = true){
\r
722 $url = '/statuses/user_timeline';
\r
725 $args['page'] = $page;
\r
729 $args['count'] = $count;
\r
731 $args['since_id'] = $since_id;
\r
733 $args['include_rts'] = $include_rts;
\r
734 if($include_entities)
\r
735 $args['include_entities'] = $include_entities;
\r
736 $response = $this->get($url, $args);
\r
740 function trends_closest($lat = false, $long=false) {
\r
741 $url = "/trends/closest";
\r
744 $args['lat'] = $lat;
\r
746 $args['long'] = $long;
\r
747 return $this->get($url, $args);
\r
750 function trends_place($id = 1) {
\r
751 $url = "/trends/place";
\r
755 return $this->get($url, $args);
\r
757 /* ---------- Misc. ---------- */
\r
758 function twitterAvailable(){
\r
759 $url = "/help/test";
\r
760 if($this->get($url) == 'ok'){
\r
766 function veverify($skip_status = false){
\r
767 $url = '/account/verify_credentials';
\r
768 $args = array('skip_status' => $skip_status);
\r
769 return $this->get($url,$args);
\r
772 function updateProfile($fields = array(), $skip_status = true){
\r
773 $url = '/account/update_profile';
\r
775 foreach( $fields as $pk => $pv ){
\r
778 $args[$pk] = (string) substr( $pv, 0, 20 );
\r
781 $args[$pk] = (string) substr( $pv, 0, 100 );
\r
784 $args[$pk] = (string) substr( $pv, 0, 30 );
\r
786 case 'description' :
\r
787 $args[$pk] = (string) substr( $pv, 0, 160 );
\r
792 $args['skip_status'] = $skip_status;
\r
794 return $this->post($url, $args);
\r
798 function updateProfileImage($image, $skip_status=true) {
\r
799 $url = '/account/update_profile_image';
\r
802 $mul['image']=$image;
\r
805 $args['skip_status']=$skip_status;
\r
807 return $this->post($url, $args, $mul);
\r
810 function updateProfileBackground($image, $skip_status=true) {
\r
811 $url = '/account/update_profile_background_image';
\r
814 $mul['image']=$image;
\r
815 $mul['skip_status']=$skip_status;
\r
817 return $this->post($url, NULL, $mul);
\r
820 function updateMedia($status,$image,$replying_to = false) {
\r
821 $url = 'https://upload.twitter.com/1/statuses/update_with_media'.$this->type;
\r
823 if($status) $args['status'] = $status;
\r
824 if($replying_to) $args['in_reply_to_status_id'] = $replying_to;
\r
826 if($image) $mul['media'][] = $image;
\r
827 return $this->post($url,$args,$mul);
\r