OSDN Git Service

embrj
[embrj/master.git] / lib / twitteroauth.php
index 9dedf59..7c9157f 100644 (file)
-<?php\r
-/*\r
- * Abraham Williams (abraham@abrah.am) http://abrah.am\r
- *\r
- * Basic lib to work with Twitter's OAuth beta. This is untested and should not\r
- * be used in production code. Twitter's beta could change at anytime.\r
- *\r
- * Code based on:\r
- * Fire Eagle code - http://github.com/myelin/fireeagle-php-lib\r
- * twitterlibphp - http://github.com/jdp/twitterlibphp\r
- */\r
-\r
-//require_once('config.php');\r
-//require_once('oauth_lib.php');\r
-\r
-/**\r
- * Twitter OAuth class\r
- */\r
-class TwitterOAuth {\r
-       /* Contains the last HTTP status code returned */\r
-       public $http_code;\r
-       /* Contains the last API call */\r
-       public $last_api_call;\r
-       /* Set up the API root URL */\r
-       //public $host = "https://api.twitter.com/1/";\r
-       public $host = API_URL;\r
-       /* Set timeout default */\r
-       public $timeout = 5;\r
-       /* Set connect timeout */\r
-       public $connecttimeout = 30;\r
-       /* Verify SSL Cert */\r
-       public $ssl_verifypeer = FALSE;\r
-       /* Response type */\r
-       public $type = 'json';\r
-       /* Decode return json data */\r
-       public $decode_json = TRUE;\r
-\r
-       public $source = 'embr';\r
-\r
-       // user info\r
-       public $username;\r
-       public $screen_name;\r
-       public $user_id;\r
-       \r
-       //for debug use\r
-       public $curl_info;\r
-       public $http_header;\r
-\r
-       /**\r
-        * Set API URLS\r
-        */\r
-       function accessTokenURL()  { return 'https://api.twitter.com/oauth/access_token'; }\r
-       function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }\r
-       function authorizeURL()    { return 'https://api.twitter.com/oauth/authorize'; }\r
-       function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }\r
-\r
-       /**\r
-        * Debug helpers\r
-        */\r
-       function lastStatusCode() { return $this->http_status; }\r
-       function lastAPICall() { return $this->last_api_call; }\r
-\r
-       /**\r
-        * construct TwitterOAuth object\r
-        */\r
-       function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {\r
-               $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();\r
-               $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);\r
-               if (!empty($oauth_token) && !empty($oauth_token_secret)) {\r
-                       $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);\r
-                       $this->screen_name = $_SESSION['access_token']['screen_name'];\r
-                       $this->username = $_SESSION['access_token']['screen_name'];\r
-                       $this->user_id = $_SESSION['access_token']['user_id'];\r
-               } else {\r
-                       $this->token = NULL;\r
-               }\r
-       }\r
-\r
-\r
-       /**\r
-        * Get a request_token from Twitter\r
-        *\r
-        * @returns a key/value array containing oauth_token and oauth_token_secret\r
-        */\r
-       function getRequestToken($oauth_callback = NULL) {\r
-               $parameters = array();\r
-               if (!empty($oauth_callback)) {\r
-                       $parameters['oauth_callback'] = $oauth_callback;\r
-               } \r
-               $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);\r
-               $token = OAuthUtil::parse_parameters($request);\r
-               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
-               return $token;\r
-       }\r
-\r
-       /**\r
-        * Get the authorize URL\r
-        *\r
-        * @returns a string\r
-        */\r
-       function getAuthorizeURL($token) {\r
-               if (is_array($token)) {\r
-                       $token = $token['oauth_token'];\r
-               }\r
-               return $this->authorizeURL() . "?oauth_token={$token}";\r
-       }\r
-\r
-       /**\r
-        * Exchange the request token and secret for an access token and\r
-        * secret, to sign API calls.\r
-        *\r
-        * @returns array("oauth_token" => the access token,\r
-        *                "oauth_token_secret" => the access secret)\r
-        */\r
-       function getAccessToken($oauth_verifier = FALSE) {\r
-               $parameters = array();\r
-               if (!empty($oauth_verifier)) {\r
-                       $parameters['oauth_verifier'] = $oauth_verifier;\r
-               }\r
-               $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);\r
-               $token = OAuthUtil::parse_parameters($request);\r
-               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);\r
-               return $token;\r
-       }\r
-\r
-       /**\r
-        * GET wrappwer for oAuthRequest.\r
-        */\r
-       function get($url, $parameters = array()) {\r
-               $response = $this->oAuthRequest($url, 'GET', $parameters);\r
-               if($response == false){\r
-                       return false;\r
-               }\r
-               if ($this->type == 'json' && $this->decode_json) {\r
-                       return json_decode($response);\r
-               }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){\r
-                       return simplexml_load_string($response);\r
-               }\r
-               return $response;\r
-       }\r
-\r
-       /**\r
-        * POST wreapper for oAuthRequest.\r
-        */\r
-       function post($url, $parameters = array(), $multipart = NULL) {\r
-               $response = $this->oAuthRequest($url, 'POST', $parameters, $multipart);\r
-               if($response === false){\r
-                       return false;\r
-               }\r
-               if ($this->type === 'json' && $this->decode_json) {\r
-                       return json_decode($response);\r
-               }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){\r
-                       return simplexml_load_string($response);\r
-               }\r
-               return $response;\r
-       }\r
-\r
-       /**\r
-        * DELTE wrapper for oAuthReqeust.\r
-        */\r
-       function delete($url, $parameters = array()) {\r
-               $response = $this->oAuthRequest($url, 'DELETE', $parameters);\r
-               if($response === false){\r
-                       return false;\r
-               }\r
-               if ($this->type === 'json' && $this->decode_json) {\r
-                       return json_decode($response);\r
-               }elseif($this->type == 'xml' && function_exists('simplexml_load_string')){\r
-                       return simplexml_load_string($response);\r
-               }\r
-               return $response;\r
-       }\r
-\r
-       /**\r
-        * Format and sign an OAuth / API request, then make an HTTP request\r
-        */\r
-       function oAuthRequest($url, $method, $parameters, $multipart=NULL) {\r
-               if ($url[0] == '/') { //non-twitter.com api shall offer the entire url.\r
-                       $url = "{$this->host}{$url}.{$this->type}";\r
-               }\r
-               $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);\r
-               $request->sign_request($this->sha1_method, $this->consumer, $this->token);\r
-               $request->set_http_header($multipart);\r
-               \r
-               $ci = curl_init();\r
-               /* Curl settings */\r
-               curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);\r
-               curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);\r
-               curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);\r
-               curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);\r
-\r
-               switch ($method) {\r
-               case 'GET':\r
-                       curl_setopt($ci, CURLOPT_URL, $request->to_url());\r
-                       curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));\r
-                       break;\r
-               case 'POST':\r
-                       $postfields = $multipart ? $multipart : $request->to_postdata();\r
-                       curl_setopt($ci, CURLOPT_URL, $request->get_normalized_http_url());\r
-                       curl_setopt($ci, CURLOPT_HTTPHEADER, $request->http_header);\r
-                       curl_setopt($ci, CURLOPT_POST, TRUE);\r
-                       if (!empty($postfields)) {\r
-                               curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);\r
-                       }\r
-                       break;\r
-               case 'DELETE':\r
-                       $postfields = $request->to_postdata($multipart);\r
-                       $url = $request->get_normalized_http_url();\r
-                       curl_setopt($ci, CURLOPT_CUSTOMREQUEST, 'DELETE');\r
-                       curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));\r
-                       if (!empty($postfields)) {\r
-                               $url = "{$url}?{$postfields}";\r
-                               curl_setopt($ci, CURLOPT_URL, $url);\r
-                       }\r
-               }\r
-\r
-               $response = curl_exec($ci);\r
-               $this->http_header = $request->http_header;\r
-               $this->curl_info = curl_getinfo($ci);\r
-               $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);\r
-               $this->last_api_call = curl_getinfo($ci, CURLINFO_EFFECTIVE_URL);\r
-               \r
-               curl_close ($ci);\r
-               \r
-               return $response;\r
-       }\r
-       \r
-\r
-       /* ---------- API METHODS ---------- */\r
-       /*                                   */\r
-       /* ---------- Block ---------- */\r
-       function blockingIDs(){\r
-               $url = '/blocks/blocking/ids';\r
-               return $this->get($url);\r
-       }\r
-\r
-       function blockingList($id, $cursor=-1, $skip_status = 1){\r
-               $url = '/blocks/list';\r
-               $args = array();\r
-               if($id)\r
-                       $args['user_id'] = $id;\r
-               if($cursor)\r
-                       $args['cursor'] = $cursor;\r
-               $args['skip_status'] = $skip_status;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function blockUser($id){\r
-               $url = "/blocks/create/$id";\r
-               return $this->post($url);\r
-       }\r
-\r
-       function isBlocked($id){\r
-               $url = "/blocks/exists/$id";\r
-               return $this->get($url);\r
-       }\r
-\r
-       function unblockUser($id){\r
-               $url = "/blocks/destroy/$id";\r
-               return $this->delete($url);\r
-       }\r
-\r
-       /* ---------- Messages ---------- */\r
-       function deleteDirectMessage($id){\r
-               $url = "/direct_messages/destroy/$id";\r
-               return $this->delete($url);\r
-       }\r
-\r
-       function directMessages($page = false, $since_id = false, $count = null, $include_entities = true){\r
-               $url = '/direct_messages';\r
-               $args = array();\r
-               if( $since_id )\r
-                       $args['since_id'] = $since_id;\r
-               if( $page )\r
-                       $args['page'] = $page;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function sendDirectMessage($user, $text){\r
-               $url = '/direct_messages/new';\r
-               $args = array();\r
-               $args['user'] = $user;\r
-               if($text)\r
-                       $args['text'] = $text;\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function sentDirectMessage($page = false, $since = false, $since_id = false){\r
-               $url = '/direct_messages/sent';\r
-               $args = array();\r
-               if($since)\r
-                       $args['since'] = $since;\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       /* ---------- List ---------- */\r
-       function addListMember($listid, $memberid){\r
-               $url = "/lists/members/create_all";\r
-               $args = array();\r
-               if($listid) \r
-                       $args['slug'] = $listid;\r
-               if($memberid)\r
-                       $args['user_id'] = $memberid;\r
-               \r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function beAddedLists($owner_screen_name = '', $cursor = false){\r
-               $url = "/lists/memberships";\r
-               $args = array();\r
-               if($owner_screen_name)\r
-                       $args['owner_screen_name'] = $owner_screen_name;\r
-               if($cursor){\r
-                       $args['cursor'] = $cursor;\r
-               }\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function createList($name, $description, $isPortect){\r
-               $url = "/lists/create";\r
-               $args = array();\r
-               if($name)\r
-                       $args['name'] = $name;\r
-               if($description)\r
-                       $args['description'] = $description;\r
-               if($isProtect)\r
-                       $args['mode'] = 'private';\r
-               \r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function createdLists($username = '', $cursor = false){\r
-               $url = "/lists/ownerships";\r
-               $args = array();\r
-               if($cursor)\r
-                       $args['cursor'] = $cursor;\r
-               \r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function deleteList($id){\r
-               $url = "/lists/destroy";\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function deleteListMember($id, $memberid){\r
-               $arr = explode("/", $id);\r
-               $url = "/lists/members/destroy_all";\r
-               $args = array();\r
-               $args['slug'] = $arr[1];\r
-               if($memberid)\r
-                       $args['id'] = $memberid;\r
-               \r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function editList($prename, $name, $description, $isProtect){\r
-               $url = "/lists/update";\r
-               $args = array();\r
-               if($prename)\r
-                       $args['slug'] = $prename;\r
-               if($name)\r
-                       $args['name'] = $name;\r
-               if($description)\r
-                       $args['description'] = $description;\r
-               if($isProtect)\r
-                       $args['mode'] = "private";\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function followedLists($username = '', $cursor = false){\r
-               $url = "/lists/subscriptions";\r
-               $args = array();\r
-               if($username) \r
-                       $args['user_id'] = $username;\r
-               if($cursor)\r
-                       $args['cursor'] = $cursor;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function followList($id){\r
-               $url = "/lists/subscribers/create";\r
-               $arr = explode("/", $id);\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function isFollowedList($id){\r
-               $url = "/lists/subscribers/show";\r
-               $arr = explode('/', $id);\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               $args['user_id'] = $this->username;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function listFollowers($id, $cursor = false, $skip_status = 1){\r
-               $url = "/lists/subscribers";\r
-               $arr = explode('/', $id);\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               if($cursor){\r
-                       $args['cursor'] = $cursor;\r
-               }\r
-               $args['skip_status'] = $skip_status;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function listInfo($id){\r
-               $arr = explode('/', $id);\r
-               $url = "/lists/show";\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function listMembers($id, $cursor = false, $skip_status = 1){\r
-               $arr = explode("/", $id);\r
-               $url = "/lists/members";\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               if($cursor){\r
-                       $args['cursor'] = $cursor;\r
-               }\r
-               $args['skip_status'] = $skip_status;\r
-               return $this->get($url, $args);\r
-\r
-       }\r
-\r
-       function listStatus($id, $page = false, $since_id = false,$include_rts = true, $include_entities = true){\r
-               $arr = explode('/', $id);\r
-               $url = '/lists/statuses';\r
-               $args = array();\r
-               $args['slug'] = $arr[1];\r
-               $args['owner_screen_name'] = $arr[0];\r
-               if($page){\r
-                       $args['page'] = $page;\r
-               }\r
-               if($since_id){\r
-                       $args['since_id'] = $since_id;\r
-               }\r
-               if($include_rts)\r
-                       $args['include_rts'] = $include_rts;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function unfollowList($id){\r
-               $arr = explode("/", $id);\r
-               $url = "/lists/subscribers/destroy";\r
-               $args = array();\r
-               $args['owner_screen_name'] = $arr[0];\r
-               $args['slug'] = $arr[1];\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       /* ---------- Friendship ---------- */\r
-       function destroyUser($id){\r
-               $url = "/friendships/destroy/$id";\r
-               return $this->delete($url);\r
-       }\r
-\r
-       function followers($id = false, $page = false, $skip_status = true){\r
-               $url = 'followers/list';\r
-               if( $id )\r
-                       $args['user_id'] = $id;\r
-               $args['cursor'] = $page ? $page : -1;\r
-               $args['skip_status'] = $skip_status;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function followUser($id, $notifications = false){\r
-               $url = "/friendships/create/$id";\r
-               $args = array();\r
-               if($notifications)\r
-                       $args['follow'] = true;\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       function friends($id = false, $page = false, $skip_status = true){\r
-               $url = '/friends/list';\r
-               $args = array();\r
-               if( $id )\r
-                       $args['user_id'] = $id;\r
-               $args['cursor'] = $page ? $page : -1;\r
-               $args['skip_status'] = $skip_status;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function isFriend($user_a, $user_b){\r
-               $url = '/friendships/exists';\r
-               $args = array();\r
-               $args['user_a'] = $user_a;\r
-               $args['user_b'] = $user_b;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function friendship($source_screen_name,$target_screen_name){\r
-               $url = '/friendships/show';\r
-               $args = array();\r
-               $args['source_screen_name'] = $source_screen_name;\r
-               $args['target_screen_name'] = $target_screen_name;\r
-               return $this->get($url, $args);\r
-       }\r
-       \r
-       function relationship($target, $source = false){\r
-               $url = '/friendships/show';\r
-               $args = array();\r
-               $args['target_screen_name'] = $target;\r
-               if($source){\r
-                       $args['source_screen_name'] = $source;\r
-               }\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function showUser($id = false, $email = false, $user_id = false, $screen_name = false,$include_entities = true){\r
-               $url = '/users/show';\r
-               $args = array();\r
-               if($id)\r
-                       $args['id'] = $id;\r
-               elseif($screen_name)\r
-                       $args['id'] = $screen_name;\r
-               else\r
-                       $args['id'] = $this->user_id;\r
-\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       /* ---------- Ratelimit ---------- */\r
-       function ratelimit(){\r
-               $url = '/account/rate_limit_status';\r
-               return $this->get($url,array(),false);\r
-       }\r
-\r
-       /* ---------- Retweet ---------- */\r
-       function getRetweeters($id, $count = false){\r
-               $url = "/statuses/retweets/$id";\r
-               if($count != false) {\r
-                       $url .= "?count=$count";\r
-               }\r
-               return $this->get($url);\r
-       }\r
-\r
-       function retweet($id){\r
-               $url = "/statuses/retweet/$id";\r
-               return $this->post($url);\r
-       }\r
-\r
-       function retweets($id, $count = 20,$include_entities = true){\r
-               if($count > 100){\r
-                       $count = 100;\r
-               }\r
-               $url = "/statuses/retweets/$id";\r
-               $args = array();\r
-               $args['count'] = unt;\r
-               if($include_ities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url,$args);\r
-       }\r
-\r
-       function retweets_of_me($page = false, $count = false, $since_id = false, $max_id = false,$include_entities = true){\r
-               $url = '/statuses/retweets_of_me';\r
-               $args = array();\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($max_id)\r
-                       $args['max_id'] = $max_id;\r
-               if($count)\r
-                       $args['count'] = $count;\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       /* ---------- Search ---------- */\r
-       function search($q = false, $max_id = false, $include_entities = true){\r
-               $url = "/search/tweets";\r
-               if(!$q) {\r
-                       return false;\r
-               } else {\r
-                       $args = array();\r
-                       $args['q'] = $q;\r
-               }\r
-               if($max_id)\r
-                       $args['max_id'] = $max_id;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       /* ---------- Spam ---------- */\r
-       function reportSpam($screen_name){\r
-               $url = '/report_spam';\r
-               $args = array();\r
-               $args['screen_name'] = $screen_name;\r
-               return $this->post($url, $args);\r
-       }\r
-\r
-       /* ---------- Timeline ---------- */\r
-       function deleteStatus($id){\r
-               $url = "/statuses/destroy/$id";\r
-               return $this->delete($url);\r
-       }\r
-\r
-       function homeTimeline($page = false, $since_id = false, $count = false, $include_entities = true) {\r
-               $url = '/statuses/home_timeline';\r
-               $args = array();\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($count)\r
-                       $args['count'] = $count;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-       \r
-       function friendsTimeline($page = false, $since_id = false, $count = false,$include_entities = true){\r
-               $url = '/statuses/friends_timeline';\r
-               $args = array();\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($count)\r
-                       $args['count'] = $count;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function getFavorites($page = false,$userid=false,$include_entities = true){\r
-               $url = '/favorites/list';\r
-               $args = array();\r
-               if($userid)\r
-                       $args['user_id'] = $userid;\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function makeFavorite($id){\r
-               $url = "/favorites/create/$id";\r
-               return $this->post($url);\r
-       }\r
-\r
-       function publicTimeline($sinceid = false,$include_entities = true){\r
-               $url = '/statuses/public_timeline';\r
-               $args = array();\r
-               if($sinceid){\r
-                       $args['since_id'] = $sinceid;\r
-               }\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function removeFavorite($id){\r
-               $url = "/favorites/destroy/$id";\r
-               return $this->post($url);\r
-       }\r
-\r
-       function replies($page = false, $since_id = false,$include_entities = true){\r
-               $url = '/statuses/mentions_timeline';\r
-               $args = array();\r
-               if($page)\r
-                       $args['page'] = (int) $page;\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url, $args);\r
-       }\r
-\r
-       function showStatus($id,$include_entities = true){\r
-               $url = "/statuses/show/";\r
-               $args = array();\r
-               if($id)\r
-                       $args['id'] = $id;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               return $this->get($url,$args);\r
-       }\r
-\r
-       function update($status, $replying_to = false,$include_entities = true){\r
-               try{\r
-                       $url = '/statuses/update';\r
-                       $args = array();\r
-                       $args['status'] = $status;\r
-                       if($replying_to)\r
-                               $args['in_reply_to_status_id'] = $replying_to;\r
-                       if($include_entities)\r
-                               $args['include_entities'] = $include_entities;\r
-                       return $this->post($url, $args);\r
-               }catch(Exception $ex){\r
-                       echo $ex->getLine." : ".$ex->getMessage();\r
-               }\r
-       }\r
-\r
-       function userTimeline($page = false, $id = false, $count = false, $since_id = false, $include_rts = true, $include_entities = true){\r
-               $url = '/statuses/user_timeline';\r
-               $args = array();\r
-               if($page)\r
-                       $args['page'] = $page;\r
-               if($id)\r
-                       $args['id'] = $id;\r
-               if($count)\r
-                       $args['count'] = $count;\r
-               if($since_id)\r
-                       $args['since_id'] = $since_id;\r
-               if($include_rts)\r
-                       $args['include_rts'] = $include_rts;\r
-               if($include_entities)\r
-                       $args['include_entities'] = $include_entities;\r
-               $response = $this->get($url, $args);\r
-               return $response;\r
-       }\r
-\r
-       function trends_closest($lat = false, $long=false) {\r
-               $url = "/trends/closest";\r
-               $args = array();\r
-               if ($lat)\r
-                       $args['lat'] = $lat;\r
-               if ($long)\r
-                       $args['long'] = $long;\r
-               return $this->get($url, $args);\r
-       }\r
-       \r
-       function trends_place($id = 1) {\r
-               $url = "/trends/place";\r
-               $args = array();\r
-               if ($id)\r
-                       $args['id'] = $id;\r
-               return $this->get($url, $args);\r
-       }\r
-       /* ---------- Misc. ---------- */\r
-       function twitterAvailable(){\r
-               $url = "/help/test";\r
-               if($this->get($url) == 'ok'){\r
-                       return true;\r
-               }\r
-               return false;\r
-       }\r
-\r
-       function veverify($skip_status = false){\r
-               $url = '/account/verify_credentials';\r
-               $args = array('skip_status' => $skip_status);\r
-               return $this->get($url,$args);\r
-       }\r
-       \r
-       function updateProfile($fields = array(), $skip_status = true){\r
-               $url = '/account/update_profile';\r
-               $args = array();\r
-               foreach( $fields as $pk => $pv ){\r
-                       switch( $pk ){\r
-                       case 'name' :\r
-                               $args[$pk] = (string) substr( $pv, 0, 20 );\r
-                               break;\r
-                       case 'url' :\r
-                               $args[$pk] = (string) substr( $pv, 0, 100 );\r
-                               break;\r
-                       case 'location' :\r
-                               $args[$pk] = (string) substr( $pv, 0, 30 );\r
-                               break;\r
-                       case 'description' :\r
-                               $args[$pk] = (string) substr( $pv, 0, 160 );\r
-                               break;\r
-                       default :\r
-                               break;\r
-                       }\r
-                       $args['skip_status'] = $skip_status;\r
-               }\r
-               return $this->post($url, $args);\r
-       }\r
-       \r
-       /* media */\r
-       function updateProfileImage($image, $skip_status=true) {\r
-               $url = '/account/update_profile_image';\r
-               $mul = array();\r
-               if($image){\r
-                       $mul['image']=$image;\r
-               }\r
-               if($skip_status) {\r
-                       $args['skip_status']=$skip_status;\r
-               }\r
-               return $this->post($url, $args, $mul);\r
-       }\r
-       \r
-       function updateProfileBackground($image, $skip_status=true) {\r
-               $url = '/account/update_profile_background_image';\r
-               $mul = array();\r
-               if($image){\r
-                       $mul['image']=$image;\r
-                       $mul['skip_status']=$skip_status;\r
-               }\r
-               return $this->post($url, NULL, $mul);\r
-       }\r
-       \r
-       function updateMedia($status,$image,$replying_to = false) {\r
-               $url = 'https://upload.twitter.com/1/statuses/update_with_media'.$this->type;\r
-               $args = array();\r
-               if($status) $args['status'] = $status;\r
-               if($replying_to) $args['in_reply_to_status_id'] = $replying_to;\r
-               $mul = array();\r
-               if($image) $mul['media'][] = $image;\r
-               return $this->post($url,$args,$mul);\r
-       }\r
-}\r
-\r
+<?php
+/*
+ * Abraham Williams (abraham@abrah.am) http://abrah.am
+ *
+ * Basic lib to work with Twitter's OAuth beta. This is untested and should not
+ * be used in production code. Twitter's beta could change at anytime.
+ *
+ * Code based on:
+ * Fire Eagle code - http://github.com/myelin/fireeagle-php-lib
+ * twitterlibphp - http://github.com/jdp/twitterlibphp
+ */
+
+//require_once('config.php');
+//require_once('oauth_lib.php');
+
+/**
+ * Twitter OAuth class
+ */
+class TwitterOAuth {
+       /* Contains the last HTTP status code returned */
+       public $http_code;
+       /* Contains the last API call */
+       public $last_api_call;
+       /* Set up the API root URL */
+       public $host = API_URL;
+       /* Set timeout default */
+       public $timeout = 5;
+       /* Set connect timeout */
+       public $connecttimeout = 30;
+       /* Verify SSL Cert */
+       public $ssl_verifypeer = FALSE;
+
+       public $source = 'embr';
+
+       // user info
+       public $username;
+       public $screen_name;
+       public $user_id;
+       
+       //for debug use
+       public $curl_info;
+       public $http_header;
+
+       /**
+        * Set API URLS
+        */
+       function accessTokenURL()  { return 'https://api.twitter.com/oauth/access_token'; }
+       function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }
+       function authorizeURL()    { return 'https://api.twitter.com/oauth/authorize'; }
+       function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }
+
+       /**
+        * Debug helpers
+        */
+       function lastStatusCode() { return $this->http_status; }
+       function lastAPICall() { return $this->last_api_call; }
+
+       /**
+        * construct TwitterOAuth object
+        */
+       function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
+               $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
+               $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
+               if (!empty($oauth_token) && !empty($oauth_token_secret)) {
+                       $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
+                       $this->screen_name = $_SESSION['access_token']['screen_name'];
+                       $this->username = $_SESSION['access_token']['screen_name'];
+                       $this->user_id = $_SESSION['access_token']['user_id'];
+               } else {
+                       $this->token = NULL;
+               }
+       }
+
+
+       /**
+        * Get a request_token from Twitter
+        *
+        * @returns a key/value array containing oauth_token and oauth_token_secret
+        */
+       function getRequestToken($oauth_callback = NULL) {
+               $parameters = array();
+               if (!empty($oauth_callback)) {
+                       $parameters['oauth_callback'] = $oauth_callback;
+               } 
+               $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
+               $token = OAuthUtil::parse_parameters($request);
+               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+               return $token;
+       }
+
+       /**
+        * Get the authorize URL
+        *
+        * @returns a string
+        */
+       function getAuthorizeURL($token) {
+               if (is_array($token)) {
+                       $token = $token['oauth_token'];
+               }
+               return $this->authorizeURL() . "?oauth_token={$token}";
+       }
+
+       /**
+        * Exchange the request token and secret for an access token and
+        * secret, to sign API calls.
+        *
+        * @returns array("oauth_token" => the access token,
+        *                "oauth_token_secret" => the access secret)
+        */
+       function getAccessToken($oauth_verifier = FALSE) {
+               $parameters = array();
+               if (!empty($oauth_verifier)) {
+                       $parameters['oauth_verifier'] = $oauth_verifier;
+               }
+               $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
+               $token = OAuthUtil::parse_parameters($request);
+               $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
+               return $token;
+       }
+
+       /**
+        * GET wrappwer for oAuthRequest.
+        */
+       function get($url, $parameters = array()) {
+               $response = $this->oAuthRequest($url, 'GET', $parameters);
+               if($response == false){
+                       return false;
+               }
+               return json_decode($response);
+       }
+
+       /**
+        * POST wreapper for oAuthRequest.
+        */
+       function post($url, $parameters = array(), $multipart = NULL) {
+               $response = $this->oAuthRequest($url, 'POST', $parameters, $multipart);
+               if($response === false){
+                       return false;
+               }
+               return json_decode($response);
+       }
+
+       /**
+        * Format and sign an OAuth / API request, then make an HTTP request
+        */
+       function oAuthRequest($url, $method, $parameters, $multipart=NULL) {
+               if ($url[0] == '/') { //non-twitter.com api shall offer the entire url.
+                       $url = "{$this->host}{$url}.json";
+               }
+               $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
+               $request->sign_request($this->sha1_method, $this->consumer, $this->token);
+               $request->set_http_header($multipart);
+               
+               $ci = curl_init();
+               /* Curl settings */
+               curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
+               curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
+               curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
+               curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
+
+               switch ($method) {
+               case 'GET':
+                       curl_setopt($ci, CURLOPT_URL, $request->to_url());
+                       curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
+                       break;
+               case 'POST':
+                       $postfields = $multipart ? $multipart : $request->to_postdata();
+                       curl_setopt($ci, CURLOPT_URL, $request->get_normalized_http_url());
+                       curl_setopt($ci, CURLOPT_HTTPHEADER, $request->http_header);
+                       curl_setopt($ci, CURLOPT_POST, TRUE);
+                       if (!empty($postfields)) {
+                               curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
+                       }
+               }
+
+               $response = curl_exec($ci);
+               $this->http_header = $request->http_header;
+               $this->curl_info = curl_getinfo($ci);
+               $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
+               $this->last_api_call = curl_getinfo($ci, CURLINFO_EFFECTIVE_URL);
+               
+               curl_close ($ci);
+               
+               return $response;
+       }
+       
+
+       /* ---------- API METHODS ---------- */
+       /*                                   */
+       /* ---------- Block ---------- */
+       function blockingList($id, $cursor=-1, $skip_status = true){
+               $url = '/blocks/list';
+               $args = array();
+               if($id)
+                       $args['screen_name'] = $id;
+               if($cursor)
+                       $args['cursor'] = $cursor;
+               $args['skip_status'] = $skip_status;
+               return $this->get($url, $args);
+       }
+
+       function blockUser($id){
+               $url = "/blocks/create";
+               $args = array();
+               $args['screen_name'] = $id;
+               return $this->post($url, $args);
+       }
+
+       function unblockUser($id){
+               $url = "/blocks/destroy";
+               $args = array();
+               $args['screen_name'] = $id;
+               return $this->post($url, $args);
+       }
+
+       /* ---------- Messages ---------- */
+       function deleteDirectMessage($id){
+               $url = "/direct_messages/destroy";
+               $args = array();
+               $args['id'] = $id;
+               return $this->post($url, $args);
+       }
+
+       function directMessages($since_id = false, $max_id = false, $count = false, $include_entities = true){
+               $url = '/direct_messages';
+               $args = array();
+               if( $since_id )
+                       $args['since_id'] = $since_id;
+               if( $max_id )
+                       $args['max_id'] = $max_id;
+               if( $count )
+                       $args['count'] = $count;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       function sentDirectMessages($since_id = false, $max_id = false, $count = false, $include_entities = true){
+               $url = '/direct_messages/sent';
+               $args = array();
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if( $max_id )
+                       $args['max_id'] = $max_id;
+               if( $count )
+                       $args['count'] = $count;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       /* ---------- List ---------- */
+       function addListMember($listid, $id, $memberid){
+               $url = "/lists/members/create_all";
+               $args = array();
+               if($listid)
+                       $args['slug'] = $listid;
+               if($id)
+                       $args['owner_screen_name'] = $id;
+               if($memberid){
+                       $args['screen_name'] = $memberid;
+               }
+               return $this->post($url, $args);
+       }
+
+       function beAddedLists($username = '', $cursor = false){
+               $url = "/lists/memberships";
+               $args = array();
+               if($username)
+                       $args['screen_name'] = $username;
+               if($cursor){
+                       $args['cursor'] = $cursor;
+               }
+               return $this->get($url, $args);
+       }
+
+       function createList($name, $description, $isPortect){
+               $url = "/lists/create";
+               $args = array();
+               if($name)
+                       $args['name'] = $name;
+               if($description)
+                       $args['description'] = $description;
+               if($isProtect)
+                       $args['mode'] = 'private';
+               
+               return $this->post($url, $args);
+       }
+
+       function myLists($username = false, $user_id = false, $count = false){
+               $url = "/lists/ownerships";
+               $args = array();
+               if($username){
+                       $args['screen_name'] = $username;
+               } else {
+                       $args['screen_name'] = $this->username;
+               }
+               
+               return $this->get($url, $args);
+       }
+
+       function deleteList($slug){
+               $url = "/lists/destroy";
+               $args = array();
+               $args['slug'] = $slug;
+               $args['owner_screen_name'] = $this->username;
+               return $this->post($url, $args);
+       }
+
+       function deleteListMember($slug, $owner, $memberid){
+               $url = "/lists/members/destroy_all";
+               $args = array();
+               $args['slug'] = $slug;
+               $args['owner_screen_name'] = $owner;
+               $args['user_id'] = $memberid;
+               
+               return $this->post($url, $args);
+       }
+
+       function editList($prename, $name, $description, $isProtect){
+               $url = "/lists/update";
+               $args = array();
+               if($prename)
+                       $args['slug'] = $prename;
+               if($name)
+                       $args['name'] = $name;
+               if($description)
+                       $args['description'] = $description;
+               if($isProtect)
+                       $args['mode'] = "private";
+               return $this->post($url, $args);
+       }
+
+       function followedLists($username = '', $cursor = false){
+               $url = "/lists/subscriptions";
+               $args = array();
+               if($username)
+                       $args['screen_name'] = $username;
+               if($cursor)
+                       $args['cursor'] = $cursor;
+               return $this->get($url, $args);
+       }
+
+       function followList($id){
+               $url = "/lists/subscribers/create";
+               $arr = explode("/", $id);
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               return $this->post($url, $args);
+       }
+
+       function isFollowedList($id){
+               $url = "/lists/subscribers/show";
+               $arr = explode('/', $id);
+               $args = array();
+               $args['owner_screen_name'] = $arr[0];
+               $args['slug'] = $arr[1];
+               $args['screen_name'] = $this->username;
+               return isset($this->get($url, $args)->screen_name);
+       }
+
+       function listFollowers($id, $cursor = false, $skip_status = true){
+               $url = "/lists/subscribers";
+               $arr = explode('/', $id);
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               if($cursor){
+                       $args['cursor'] = $cursor;
+               }
+               $args['skip_status'] = $skip_status;
+               return $this->get($url, $args);
+       }
+
+       function listInfo($id){
+               $arr = explode('/', $id);
+               $url = "/lists/show";
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               return $this->get($url, $args);
+       }
+
+       function listMembers($id, $cursor = false, $skip_status = true){
+               $url = "/lists/members";
+               $arr = explode("/", $id);
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               if($cursor){
+                       $args['cursor'] = $cursor;
+               }
+               $args['skip_status'] = $skip_status;
+               return $this->get($url, $args);
+
+       }
+
+       function listStatus($id, $since_id = false, $max_id = false, $include_rts = true, $include_entities = true){
+               $arr = explode('/', $id);
+               $url = "/lists/statuses";
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if($max_id)
+                       $args['max_id'] = $max_id;
+               if($include_rts)
+                       $args['include_rts'] = $include_rts;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       function unfollowList($id){
+               $url = "/lists/subscribers/destroy";
+               $arr = explode("/", $id);
+               $args = array();
+               $args['slug'] = $arr[1];
+               $args['owner_screen_name'] = $arr[0];
+               return $this->post($url, $args);
+       }
+
+       /* ---------- Friendship ---------- */
+       function destroyUser($id){
+               $url = "/friendships/destroy";
+               $args = array();
+               $args['screen_name'] = $id;
+               return $this->post($url, $args);
+       }
+
+       function followers($id = false, $cursor = -1, $skip_status = true){ // GET statuses/friends is removed, try GET followers/list instead
+               $url = '/followers/list';
+               $args = array();
+               if( $id )
+                       $args['screen_name'] = $id;
+               if($cursor)
+                       $args['cursor'] = $cursor;
+               $args['skip_status'] = $skip_status;
+               return $this->get($url, $args);
+       }
+
+       function followUser($id, $notifications = false){
+               $url = "/friendships/create";
+               $args = array();
+               $args['screen_name'] = $id;
+               if($notifications)
+                       $args['follow'] = true;
+               return $this->post($url, $args);
+       }
+
+       function friends($id = false, $cursor = -1, $skip_status = true){ // GET statuses/friends is removed, try GET friends/list instead
+               $url = '/friends/list';
+               $args = array();
+               if( $id )
+                       $args['screen_name'] = $id;
+               if($cursor)
+                       $args['cursor'] = $cursor;
+               $args['skip_status'] = $skip_status;
+               return $this->get($url, $args);
+       }
+       
+       function relationship($target_screen_name, $source_screen_name = false){
+               $url = '/friendships/show';
+               $args = array();
+               $args['target_screen_name'] = $target_screen_name;
+               $args['source_screen_name'] = $source_screen_name ? $source_screen_name : $this->username;
+               return $this->get($url, $args);
+       }
+
+       function showUser($screen_name = false, $user_id = false, $include_entities = true){
+               $url = '/users/show';
+               $args = array();
+               if($screen_name)
+                       $args['screen_name'] = $screen_name;
+               else
+                       $args['user_id'] = $user_id ? $user_id : $this->user_id;
+               return $this->get($url, $args);
+       }
+
+       /* ---------- Ratelimit ---------- */
+       /* this API changed a lot due to the
+        * update of twitter's limit policy,
+        * get only status limits here by
+        * default                        */
+       function ratelimit($resources = "statuses"){
+               $url = '/application/rate_limit_status';
+               $args = array();
+               $args['resources'] = $resources;
+               return $this->get($url, $args);
+       }
+
+       /* ---------- Retweet ---------- */
+       function retweet($id){
+               $url = "/statuses/retweet/$id";
+               return $this->post($url);
+       }
+
+       function retweets($id, $count = 20){
+               if($count > 100){
+                       $count = 100;
+               }
+               $url = "/statuses/retweets/$id";
+               $args = array();
+               $args['count'] = $count;
+               return $this->get($url,$args);
+       }
+
+       function retweets_of_me($count = false, $since_id = false, $max_id = false, $include_entities = true){
+               $url = '/statuses/retweets_of_me';
+               $args = array();
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if($max_id)
+                       $args['max_id'] = $max_id;
+               if($count)
+                       $args['count'] = $count;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       /* ---------- Search ---------- */
+       function savedSearches(){
+               $url = '/saved_searches/list';
+               return $this->get($url);
+       }
+
+       function deleteSavedSearch($ssid){
+               $url = "/saved_searches/destroy/{$ssid}";
+               return $this->post($url);
+       }
+
+       function saveSearch($query){
+               $url = "/saved_searches/create";
+               $args = array();
+               $args['query'] = $query;
+               return $this->post($url, $args);
+       }
+
+       function search($q = false, $since_id = false, $max_id = false, $include_entities = true){
+               $url = '/search/tweets';
+               if(!$q) {
+                       return false;
+               } else {
+                       $args = array();
+                       $args['q'] = $q;
+               }
+               if($since_id){
+                       $args['since_id'] = $since_id;
+               }
+               if($max_id){
+                       $args['max_id'] = $max_id;
+               }
+               if($include_entities){
+                       $args['include_entities'] = $include_entities;
+               }
+               return $this->get($url, $args);
+       }
+
+       /* ---------- Spam ---------- */
+       function reportSpam($screen_name){
+               $url = '/users/report_spam';
+               $args = array();
+               $args['screen_name'] = $screen_name;
+               return $this->post($url, $args);
+       }
+
+       /* ---------- Timeline ---------- */
+       function deleteStatus($id){
+               $url = "/statuses/destroy/$id";
+               return $this->post($url);
+       }
+
+       function homeTimeline($since_id = false, $max_id = false, $count = false, $include_entities = true) {
+               $url = '/statuses/home_timeline';
+               $args = array();
+               if($max_id)
+                       $args['max_id'] = $max_id;
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if($count)
+                       $args['count'] = $count;
+               else
+                       $args['count'] = 30;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+       
+       function getFavorites($userid = false, $sinceid = false, $maxid = false, $count = false, $include_entities = true){
+               $url = '/favorites/list';
+               $args = array();
+               if($userid)
+                       $args['screen_name'] = $userid;
+               if($sinceid)
+                       $args['since_id'] = $sinceid;
+               if($maxid)
+                       $args['max_id'] = $maxid;
+               if($count)
+                       $args['count'] = $count;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       function makeFavorite($id){
+               $url = "/favorites/create";
+               $args = array();
+               if($id)
+                       $args['id'] = $id;
+               return $this->post($url, $args);
+       }
+
+       function removeFavorite($id){
+               $url = "/favorites/destroy";
+               $args = array();
+               if($id)
+                       $args['id'] = $id;
+               return $this->post($url, $args);
+       }
+
+       function replies($since_id = false, $max_id = false, $count = false, $include_entities = true){
+               $url = '/statuses/mentions_timeline';
+               $args = array();
+               if($max_id)
+                       $args['max_id'] = $max_id;
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if($count)
+                       $args['count'] = $count;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url, $args);
+       }
+
+       function showStatus($id,$include_entities = true){
+               $url = "/statuses/show";
+               $args = array();
+               if($id)
+                       $args['id'] = $id;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               return $this->get($url,$args);
+       }
+
+       function update($status, $replying_to = false,$include_entities = true){
+               try{
+                       $url = '/statuses/update';
+                       $args = array();
+                       $args['status'] = $status;
+                       if($replying_to)
+                               $args['in_reply_to_status_id'] = $replying_to;
+                       if($include_entities)
+                               $args['include_entities'] = $include_entities;
+                       return $this->post($url, $args);
+               }catch(Exception $ex){
+                       echo $ex->getLine." : ".$ex->getMessage();
+               }
+       }
+
+       function userTimeline($id = false, $since_id = false, $max_id = false, $count = false, $include_rts = true, $include_entities = true){
+               $url = '/statuses/user_timeline';
+               $args = array();
+               if($max_id)
+                       $args['max_id'] = $max_id;
+               if($id)
+                       $args['screen_name'] = $id;
+               if($count)
+                       $args['count'] = $count;
+               if($since_id)
+                       $args['since_id'] = $since_id;
+               if($include_rts)
+                       $args['include_rts'] = $include_rts;
+               if($include_entities)
+                       $args['include_entities'] = $include_entities;
+               $response = $this->get($url, $args);
+               return $response;
+       }
+
+       function trends_closest($lat = false, $long=false) {
+               $url = "/trends/closest";
+               $args = array();
+               if ($lat)
+                       $args['lat'] = $lat;
+               if ($long)
+                       $args['long'] = $long;
+               return $this->get($url, $args);
+       }
+       
+       function trends_place($id = 1) {
+               $url = "/trends/place";
+               $args = array();
+               if ($id)
+                       $args['id'] = $id;
+               return $this->get($url, $args);
+       }
+       /* ---------- Misc. ---------- */
+       function veverify($skip_status = false){
+               $url = '/account/verify_credentials';
+               $args = array('skip_status' => $skip_status);
+               return $this->get($url,$args);
+       }
+       
+       function updateProfile($fields = array(), $skip_status = true){
+               $url = '/account/update_profile';
+               $args = array();
+               foreach( $fields as $pk => $pv ){
+                       switch( $pk ){
+                       case 'name' :
+                               $args[$pk] = (string) substr( $pv, 0, 20 );
+                               break;
+                       case 'url' :
+                               $args[$pk] = (string) substr( $pv, 0, 100 );
+                               break;
+                       case 'location' :
+                               $args[$pk] = (string) substr( $pv, 0, 30 );
+                               break;
+                       case 'description' :
+                               $args[$pk] = (string) substr( $pv, 0, 160 );
+                               break;
+                       default :
+                               break;
+                       }
+                       $args['skip_status'] = $skip_status;
+               }
+               return $this->post($url, $args);
+       }
+       
+       /* media */
+       function updateProfileImage($image, $skip_status = true) {
+               $url = '/account/update_profile_image';
+               $args = array();
+               if($image){
+                       $args['image']=$image;
+                       $args['skip_status']=$skip_status;
+               }
+               return $this->post($url, $args);
+       }
+       
+       function updateProfileBackground($image, $tile = false, $skip_status = true) {
+               $url = '/account/update_profile_background_image';
+               $args = array();
+               if($image){
+                       $args['image']=$image;
+               }
+               if($tile){
+                       $args['tile']=($tile === 'true');
+               }
+               $args['skip_status']=$skip_status;
+               return $this->post($url, $args);
+       }
+       
+       function updateMedia($status,$image,$replying_to = false) {
+               $url = 'statuses/update_with_media';
+               $args = array();
+               if($status) $args['status'] = $status;
+               if($replying_to) $args['in_reply_to_status_id'] = $replying_to;
+               $mul = array();
+               if($image) $mul['media'][] = $image;
+               return $this->post($url,$args,$mul);
+       }
+}
+