OSDN Git Service

9dedf59f8700fa97e069d7ee86fde7fcfc4b1381
[embrj/master.git] / lib / twitteroauth.php
1 <?php\r
2 /*\r
3  * Abraham Williams (abraham@abrah.am) http://abrah.am\r
4  *\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
7  *\r
8  * Code based on:\r
9  * Fire Eagle code - http://github.com/myelin/fireeagle-php-lib\r
10  * twitterlibphp - http://github.com/jdp/twitterlibphp\r
11  */\r
12 \r
13 //require_once('config.php');\r
14 //require_once('oauth_lib.php');\r
15 \r
16 /**\r
17  * Twitter OAuth class\r
18  */\r
19 class TwitterOAuth {\r
20         /* Contains the last HTTP status code returned */\r
21         public $http_code;\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
33         /* Response type */\r
34         public $type = 'json';\r
35         /* Decode return json data */\r
36         public $decode_json = TRUE;\r
37 \r
38         public $source = 'embr';\r
39 \r
40         // user info\r
41         public $username;\r
42         public $screen_name;\r
43         public $user_id;\r
44         \r
45         //for debug use\r
46         public $curl_info;\r
47         public $http_header;\r
48 \r
49         /**\r
50          * Set API URLS\r
51          */\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
56 \r
57         /**\r
58          * Debug helpers\r
59          */\r
60         function lastStatusCode() { return $this->http_status; }\r
61         function lastAPICall() { return $this->last_api_call; }\r
62 \r
63         /**\r
64          * construct TwitterOAuth object\r
65          */\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
74                 } else {\r
75                         $this->token = NULL;\r
76                 }\r
77         }\r
78 \r
79 \r
80         /**\r
81          * Get a request_token from Twitter\r
82          *\r
83          * @returns a key/value array containing oauth_token and oauth_token_secret\r
84          */\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
89                 } \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
93                 return $token;\r
94         }\r
95 \r
96         /**\r
97          * Get the authorize URL\r
98          *\r
99          * @returns a string\r
100          */\r
101         function getAuthorizeURL($token) {\r
102                 if (is_array($token)) {\r
103                         $token = $token['oauth_token'];\r
104                 }\r
105                 return $this->authorizeURL() . "?oauth_token={$token}";\r
106         }\r
107 \r
108         /**\r
109          * Exchange the request token and secret for an access token and\r
110          * secret, to sign API calls.\r
111          *\r
112          * @returns array("oauth_token" => the access token,\r
113          *                "oauth_token_secret" => the access secret)\r
114          */\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
119                 }\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
123                 return $token;\r
124         }\r
125 \r
126         /**\r
127          * GET wrappwer for oAuthRequest.\r
128          */\r
129         function get($url, $parameters = array()) {\r
130                 $response = $this->oAuthRequest($url, 'GET', $parameters);\r
131                 if($response == false){\r
132                         return false;\r
133                 }\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
138                 }\r
139                 return $response;\r
140         }\r
141 \r
142         /**\r
143          * POST wreapper for oAuthRequest.\r
144          */\r
145         function post($url, $parameters = array(), $multipart = NULL) {\r
146                 $response = $this->oAuthRequest($url, 'POST', $parameters, $multipart);\r
147                 if($response === false){\r
148                         return false;\r
149                 }\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
154                 }\r
155                 return $response;\r
156         }\r
157 \r
158         /**\r
159          * DELTE wrapper for oAuthReqeust.\r
160          */\r
161         function delete($url, $parameters = array()) {\r
162                 $response = $this->oAuthRequest($url, 'DELETE', $parameters);\r
163                 if($response === false){\r
164                         return false;\r
165                 }\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
170                 }\r
171                 return $response;\r
172         }\r
173 \r
174         /**\r
175          * Format and sign an OAuth / API request, then make an HTTP request\r
176          */\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
180                 }\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
184                 \r
185                 $ci = curl_init();\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
191 \r
192                 switch ($method) {\r
193                 case 'GET':\r
194                         curl_setopt($ci, CURLOPT_URL, $request->to_url());\r
195                         curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));\r
196                         break;\r
197                 case 'POST':\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
204                         }\r
205                         break;\r
206                 case 'DELETE':\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
214                         }\r
215                 }\r
216 \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
222                 \r
223                 curl_close ($ci);\r
224                 \r
225                 return $response;\r
226         }\r
227         \r
228 \r
229         /* ---------- API METHODS ---------- */\r
230         /*                                   */\r
231         /* ---------- Block ---------- */\r
232         function blockingIDs(){\r
233                 $url = '/blocks/blocking/ids';\r
234                 return $this->get($url);\r
235         }\r
236 \r
237         function blockingList($id, $cursor=-1, $skip_status = 1){\r
238                 $url = '/blocks/list';\r
239                 $args = array();\r
240                 if($id)\r
241                         $args['user_id'] = $id;\r
242                 if($cursor)\r
243                         $args['cursor'] = $cursor;\r
244                 $args['skip_status'] = $skip_status;\r
245                 return $this->get($url, $args);\r
246         }\r
247 \r
248         function blockUser($id){\r
249                 $url = "/blocks/create/$id";\r
250                 return $this->post($url);\r
251         }\r
252 \r
253         function isBlocked($id){\r
254                 $url = "/blocks/exists/$id";\r
255                 return $this->get($url);\r
256         }\r
257 \r
258         function unblockUser($id){\r
259                 $url = "/blocks/destroy/$id";\r
260                 return $this->delete($url);\r
261         }\r
262 \r
263         /* ---------- Messages ---------- */\r
264         function deleteDirectMessage($id){\r
265                 $url = "/direct_messages/destroy/$id";\r
266                 return $this->delete($url);\r
267         }\r
268 \r
269         function directMessages($page = false, $since_id = false, $count = null, $include_entities = true){\r
270                 $url = '/direct_messages';\r
271                 $args = array();\r
272                 if( $since_id )\r
273                         $args['since_id'] = $since_id;\r
274                 if( $page )\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
279         }\r
280 \r
281         function sendDirectMessage($user, $text){\r
282                 $url = '/direct_messages/new';\r
283                 $args = array();\r
284                 $args['user'] = $user;\r
285                 if($text)\r
286                         $args['text'] = $text;\r
287                 return $this->post($url, $args);\r
288         }\r
289 \r
290         function sentDirectMessage($page = false, $since = false, $since_id = false){\r
291                 $url = '/direct_messages/sent';\r
292                 $args = array();\r
293                 if($since)\r
294                         $args['since'] = $since;\r
295                 if($since_id)\r
296                         $args['since_id'] = $since_id;\r
297                 if($page)\r
298                         $args['page'] = $page;\r
299                 return $this->get($url, $args);\r
300         }\r
301 \r
302         /* ---------- List ---------- */\r
303         function addListMember($listid, $memberid){\r
304                 $url = "/lists/members/create_all";\r
305                 $args = array();\r
306                 if($listid) \r
307                         $args['slug'] = $listid;\r
308                 if($memberid)\r
309                         $args['user_id'] = $memberid;\r
310                 \r
311                 return $this->post($url, $args);\r
312         }\r
313 \r
314         function beAddedLists($owner_screen_name = '', $cursor = false){\r
315                 $url = "/lists/memberships";\r
316                 $args = array();\r
317                 if($owner_screen_name)\r
318                         $args['owner_screen_name'] = $owner_screen_name;\r
319                 if($cursor){\r
320                         $args['cursor'] = $cursor;\r
321                 }\r
322                 return $this->get($url, $args);\r
323         }\r
324 \r
325         function createList($name, $description, $isPortect){\r
326                 $url = "/lists/create";\r
327                 $args = array();\r
328                 if($name)\r
329                         $args['name'] = $name;\r
330                 if($description)\r
331                         $args['description'] = $description;\r
332                 if($isProtect)\r
333                         $args['mode'] = 'private';\r
334                 \r
335                 return $this->post($url, $args);\r
336         }\r
337 \r
338         function createdLists($username = '', $cursor = false){\r
339                 $url = "/lists/ownerships";\r
340                 $args = array();\r
341                 if($cursor)\r
342                         $args['cursor'] = $cursor;\r
343                 \r
344                 return $this->get($url, $args);\r
345         }\r
346 \r
347         function deleteList($id){\r
348                 $url = "/lists/destroy";\r
349                 $args = array();\r
350                 $args['owner_screen_name'] = $arr[0];\r
351                 $args['slug'] = $arr[1];\r
352                 return $this->post($url, $args);\r
353         }\r
354 \r
355         function deleteListMember($id, $memberid){\r
356                 $arr = explode("/", $id);\r
357                 $url = "/lists/members/destroy_all";\r
358                 $args = array();\r
359                 $args['slug'] = $arr[1];\r
360                 if($memberid)\r
361                         $args['id'] = $memberid;\r
362                 \r
363                 return $this->post($url, $args);\r
364         }\r
365 \r
366         function editList($prename, $name, $description, $isProtect){\r
367                 $url = "/lists/update";\r
368                 $args = array();\r
369                 if($prename)\r
370                         $args['slug'] = $prename;\r
371                 if($name)\r
372                         $args['name'] = $name;\r
373                 if($description)\r
374                         $args['description'] = $description;\r
375                 if($isProtect)\r
376                         $args['mode'] = "private";\r
377                 return $this->post($url, $args);\r
378         }\r
379 \r
380         function followedLists($username = '', $cursor = false){\r
381                 $url = "/lists/subscriptions";\r
382                 $args = array();\r
383                 if($username) \r
384                         $args['user_id'] = $username;\r
385                 if($cursor)\r
386                         $args['cursor'] = $cursor;\r
387                 return $this->get($url, $args);\r
388         }\r
389 \r
390         function followList($id){\r
391                 $url = "/lists/subscribers/create";\r
392                 $arr = explode("/", $id);\r
393                 $args = array();\r
394                 $args['owner_screen_name'] = $arr[0];\r
395                 $args['slug'] = $arr[1];\r
396                 return $this->post($url, $args);\r
397         }\r
398 \r
399         function isFollowedList($id){\r
400                 $url = "/lists/subscribers/show";\r
401                 $arr = explode('/', $id);\r
402                 $args = array();\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
407         }\r
408 \r
409         function listFollowers($id, $cursor = false, $skip_status = 1){\r
410                 $url = "/lists/subscribers";\r
411                 $arr = explode('/', $id);\r
412                 $args = array();\r
413                 $args['owner_screen_name'] = $arr[0];\r
414                 $args['slug'] = $arr[1];\r
415                 if($cursor){\r
416                         $args['cursor'] = $cursor;\r
417                 }\r
418                 $args['skip_status'] = $skip_status;\r
419                 return $this->get($url, $args);\r
420         }\r
421 \r
422         function listInfo($id){\r
423                 $arr = explode('/', $id);\r
424                 $url = "/lists/show";\r
425                 $args = array();\r
426                 $args['owner_screen_name'] = $arr[0];\r
427                 $args['slug'] = $arr[1];\r
428                 return $this->get($url, $args);\r
429         }\r
430 \r
431         function listMembers($id, $cursor = false, $skip_status = 1){\r
432                 $arr = explode("/", $id);\r
433                 $url = "/lists/members";\r
434                 $args = array();\r
435                 $args['owner_screen_name'] = $arr[0];\r
436                 $args['slug'] = $arr[1];\r
437                 if($cursor){\r
438                         $args['cursor'] = $cursor;\r
439                 }\r
440                 $args['skip_status'] = $skip_status;\r
441                 return $this->get($url, $args);\r
442 \r
443         }\r
444 \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
448                 $args = array();\r
449                 $args['slug'] = $arr[1];\r
450                 $args['owner_screen_name'] = $arr[0];\r
451                 if($page){\r
452                         $args['page'] = $page;\r
453                 }\r
454                 if($since_id){\r
455                         $args['since_id'] = $since_id;\r
456                 }\r
457                 if($include_rts)\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
462         }\r
463 \r
464         function unfollowList($id){\r
465                 $arr = explode("/", $id);\r
466                 $url = "/lists/subscribers/destroy";\r
467                 $args = array();\r
468                 $args['owner_screen_name'] = $arr[0];\r
469                 $args['slug'] = $arr[1];\r
470                 return $this->post($url, $args);\r
471         }\r
472 \r
473         /* ---------- Friendship ---------- */\r
474         function destroyUser($id){\r
475                 $url = "/friendships/destroy/$id";\r
476                 return $this->delete($url);\r
477         }\r
478 \r
479         function followers($id = false, $page = false, $skip_status = true){\r
480                 $url = 'followers/list';\r
481                 if( $id )\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
486         }\r
487 \r
488         function followUser($id, $notifications = false){\r
489                 $url = "/friendships/create/$id";\r
490                 $args = array();\r
491                 if($notifications)\r
492                         $args['follow'] = true;\r
493                 return $this->post($url, $args);\r
494         }\r
495 \r
496         function friends($id = false, $page = false, $skip_status = true){\r
497                 $url = '/friends/list';\r
498                 $args = array();\r
499                 if( $id )\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
504         }\r
505 \r
506         function isFriend($user_a, $user_b){\r
507                 $url = '/friendships/exists';\r
508                 $args = array();\r
509                 $args['user_a'] = $user_a;\r
510                 $args['user_b'] = $user_b;\r
511                 return $this->get($url, $args);\r
512         }\r
513 \r
514         function friendship($source_screen_name,$target_screen_name){\r
515                 $url = '/friendships/show';\r
516                 $args = array();\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
520         }\r
521         \r
522         function relationship($target, $source = false){\r
523                 $url = '/friendships/show';\r
524                 $args = array();\r
525                 $args['target_screen_name'] = $target;\r
526                 if($source){\r
527                         $args['source_screen_name'] = $source;\r
528                 }\r
529                 return $this->get($url, $args);\r
530         }\r
531 \r
532         function showUser($id = false, $email = false, $user_id = false, $screen_name = false,$include_entities = true){\r
533                 $url = '/users/show';\r
534                 $args = array();\r
535                 if($id)\r
536                         $args['id'] = $id;\r
537                 elseif($screen_name)\r
538                         $args['id'] = $screen_name;\r
539                 else\r
540                         $args['id'] = $this->user_id;\r
541 \r
542                 return $this->get($url, $args);\r
543         }\r
544 \r
545         /* ---------- Ratelimit ---------- */\r
546         function ratelimit(){\r
547                 $url = '/account/rate_limit_status';\r
548                 return $this->get($url,array(),false);\r
549         }\r
550 \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
556                 }\r
557                 return $this->get($url);\r
558         }\r
559 \r
560         function retweet($id){\r
561                 $url = "/statuses/retweet/$id";\r
562                 return $this->post($url);\r
563         }\r
564 \r
565         function retweets($id, $count = 20,$include_entities = true){\r
566                 if($count > 100){\r
567                         $count = 100;\r
568                 }\r
569                 $url = "/statuses/retweets/$id";\r
570                 $args = array();\r
571                 $args['count'] = unt;\r
572                 if($include_ities)\r
573                         $args['include_entities'] = $include_entities;\r
574                 return $this->get($url,$args);\r
575         }\r
576 \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
579                 $args = array();\r
580                 if($since_id)\r
581                         $args['since_id'] = $since_id;\r
582                 if($max_id)\r
583                         $args['max_id'] = $max_id;\r
584                 if($count)\r
585                         $args['count'] = $count;\r
586                 if($page)\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
591         }\r
592 \r
593         /* ---------- Search ---------- */\r
594         function search($q = false, $max_id = false, $include_entities = true){\r
595                 $url = "/search/tweets";\r
596                 if(!$q) {\r
597                         return false;\r
598                 } else {\r
599                         $args = array();\r
600                         $args['q'] = $q;\r
601                 }\r
602                 if($max_id)\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
607         }\r
608 \r
609         /* ---------- Spam ---------- */\r
610         function reportSpam($screen_name){\r
611                 $url = '/report_spam';\r
612                 $args = array();\r
613                 $args['screen_name'] = $screen_name;\r
614                 return $this->post($url, $args);\r
615         }\r
616 \r
617         /* ---------- Timeline ---------- */\r
618         function deleteStatus($id){\r
619                 $url = "/statuses/destroy/$id";\r
620                 return $this->delete($url);\r
621         }\r
622 \r
623         function homeTimeline($page = false, $since_id = false, $count = false, $include_entities = true) {\r
624                 $url = '/statuses/home_timeline';\r
625                 $args = array();\r
626                 if($page)\r
627                         $args['page'] = $page;\r
628                 if($since_id)\r
629                         $args['since_id'] = $since_id;\r
630                 if($count)\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
635         }\r
636         \r
637         function friendsTimeline($page = false, $since_id = false, $count = false,$include_entities = true){\r
638                 $url = '/statuses/friends_timeline';\r
639                 $args = array();\r
640                 if($page)\r
641                         $args['page'] = $page;\r
642                 if($since_id)\r
643                         $args['since_id'] = $since_id;\r
644                 if($count)\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
649         }\r
650 \r
651         function getFavorites($page = false,$userid=false,$include_entities = true){\r
652                 $url = '/favorites/list';\r
653                 $args = array();\r
654                 if($userid)\r
655                         $args['user_id'] = $userid;\r
656                 if($page)\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
661         }\r
662 \r
663         function makeFavorite($id){\r
664                 $url = "/favorites/create/$id";\r
665                 return $this->post($url);\r
666         }\r
667 \r
668         function publicTimeline($sinceid = false,$include_entities = true){\r
669                 $url = '/statuses/public_timeline';\r
670                 $args = array();\r
671                 if($sinceid){\r
672                         $args['since_id'] = $sinceid;\r
673                 }\r
674                 if($include_entities)\r
675                         $args['include_entities'] = $include_entities;\r
676                 return $this->get($url, $args);\r
677         }\r
678 \r
679         function removeFavorite($id){\r
680                 $url = "/favorites/destroy/$id";\r
681                 return $this->post($url);\r
682         }\r
683 \r
684         function replies($page = false, $since_id = false,$include_entities = true){\r
685                 $url = '/statuses/mentions_timeline';\r
686                 $args = array();\r
687                 if($page)\r
688                         $args['page'] = (int) $page;\r
689                 if($since_id)\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
694         }\r
695 \r
696         function showStatus($id,$include_entities = true){\r
697                 $url = "/statuses/show/";\r
698                 $args = array();\r
699                 if($id)\r
700                         $args['id'] = $id;\r
701                 if($include_entities)\r
702                         $args['include_entities'] = $include_entities;\r
703                 return $this->get($url,$args);\r
704         }\r
705 \r
706         function update($status, $replying_to = false,$include_entities = true){\r
707                 try{\r
708                         $url = '/statuses/update';\r
709                         $args = array();\r
710                         $args['status'] = $status;\r
711                         if($replying_to)\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
718                 }\r
719         }\r
720 \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
723                 $args = array();\r
724                 if($page)\r
725                         $args['page'] = $page;\r
726                 if($id)\r
727                         $args['id'] = $id;\r
728                 if($count)\r
729                         $args['count'] = $count;\r
730                 if($since_id)\r
731                         $args['since_id'] = $since_id;\r
732                 if($include_rts)\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
737                 return $response;\r
738         }\r
739 \r
740         function trends_closest($lat = false, $long=false) {\r
741                 $url = "/trends/closest";\r
742                 $args = array();\r
743                 if ($lat)\r
744                         $args['lat'] = $lat;\r
745                 if ($long)\r
746                         $args['long'] = $long;\r
747                 return $this->get($url, $args);\r
748         }\r
749         \r
750         function trends_place($id = 1) {\r
751                 $url = "/trends/place";\r
752                 $args = array();\r
753                 if ($id)\r
754                         $args['id'] = $id;\r
755                 return $this->get($url, $args);\r
756         }\r
757         /* ---------- Misc. ---------- */\r
758         function twitterAvailable(){\r
759                 $url = "/help/test";\r
760                 if($this->get($url) == 'ok'){\r
761                         return true;\r
762                 }\r
763                 return false;\r
764         }\r
765 \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
770         }\r
771         \r
772         function updateProfile($fields = array(), $skip_status = true){\r
773                 $url = '/account/update_profile';\r
774                 $args = array();\r
775                 foreach( $fields as $pk => $pv ){\r
776                         switch( $pk ){\r
777                         case 'name' :\r
778                                 $args[$pk] = (string) substr( $pv, 0, 20 );\r
779                                 break;\r
780                         case 'url' :\r
781                                 $args[$pk] = (string) substr( $pv, 0, 100 );\r
782                                 break;\r
783                         case 'location' :\r
784                                 $args[$pk] = (string) substr( $pv, 0, 30 );\r
785                                 break;\r
786                         case 'description' :\r
787                                 $args[$pk] = (string) substr( $pv, 0, 160 );\r
788                                 break;\r
789                         default :\r
790                                 break;\r
791                         }\r
792                         $args['skip_status'] = $skip_status;\r
793                 }\r
794                 return $this->post($url, $args);\r
795         }\r
796         \r
797         /* media */\r
798         function updateProfileImage($image, $skip_status=true) {\r
799                 $url = '/account/update_profile_image';\r
800                 $mul = array();\r
801                 if($image){\r
802                         $mul['image']=$image;\r
803                 }\r
804                 if($skip_status) {\r
805                         $args['skip_status']=$skip_status;\r
806                 }\r
807                 return $this->post($url, $args, $mul);\r
808         }\r
809         \r
810         function updateProfileBackground($image, $skip_status=true) {\r
811                 $url = '/account/update_profile_background_image';\r
812                 $mul = array();\r
813                 if($image){\r
814                         $mul['image']=$image;\r
815                         $mul['skip_status']=$skip_status;\r
816                 }\r
817                 return $this->post($url, NULL, $mul);\r
818         }\r
819         \r
820         function updateMedia($status,$image,$replying_to = false) {\r
821                 $url = 'https://upload.twitter.com/1/statuses/update_with_media'.$this->type;\r
822                 $args = array();\r
823                 if($status) $args['status'] = $status;\r
824                 if($replying_to) $args['in_reply_to_status_id'] = $replying_to;\r
825                 $mul = array();\r
826                 if($image) $mul['media'][] = $image;\r
827                 return $this->post($url,$args,$mul);\r
828         }\r
829 }\r
830 \r