OSDN Git Service

embrj
[embrj/master.git] / lib / twitteroauth.php
1 <?php
2 /*
3  * Abraham Williams (abraham@abrah.am) http://abrah.am
4  *
5  * Basic lib to work with Twitter's OAuth beta. This is untested and should not
6  * be used in production code. Twitter's beta could change at anytime.
7  *
8  * Code based on:
9  * Fire Eagle code - http://github.com/myelin/fireeagle-php-lib
10  * twitterlibphp - http://github.com/jdp/twitterlibphp
11  */
12
13 //require_once('config.php');
14 //require_once('oauth_lib.php');
15
16 /**
17  * Twitter OAuth class
18  */
19 class TwitterOAuth {
20         /* Contains the last HTTP status code returned */
21         public $http_code;
22         /* Contains the last API call */
23         public $last_api_call;
24         /* Set up the API root URL */
25         public $host = API_URL;
26         /* Set timeout default */
27         public $timeout = 5;
28         /* Set connect timeout */
29         public $connecttimeout = 30;
30         /* Verify SSL Cert */
31         public $ssl_verifypeer = FALSE;
32
33         public $source = 'embr';
34
35         // user info
36         public $username;
37         public $screen_name;
38         public $user_id;
39         
40         //for debug use
41         public $curl_info;
42         public $http_header;
43
44         /**
45          * Set API URLS
46          */
47         function accessTokenURL()  { return 'https://api.twitter.com/oauth/access_token'; }
48         function authenticateURL() { return 'https://api.twitter.com/oauth/authenticate'; }
49         function authorizeURL()    { return 'https://api.twitter.com/oauth/authorize'; }
50         function requestTokenURL() { return 'https://api.twitter.com/oauth/request_token'; }
51
52         /**
53          * Debug helpers
54          */
55         function lastStatusCode() { return $this->http_status; }
56         function lastAPICall() { return $this->last_api_call; }
57
58         /**
59          * construct TwitterOAuth object
60          */
61         function __construct($consumer_key, $consumer_secret, $oauth_token = NULL, $oauth_token_secret = NULL) {
62                 $this->sha1_method = new OAuthSignatureMethod_HMAC_SHA1();
63                 $this->consumer = new OAuthConsumer($consumer_key, $consumer_secret);
64                 if (!empty($oauth_token) && !empty($oauth_token_secret)) {
65                         $this->token = new OAuthConsumer($oauth_token, $oauth_token_secret);
66                         $this->screen_name = $_SESSION['access_token']['screen_name'];
67                         $this->username = $_SESSION['access_token']['screen_name'];
68                         $this->user_id = $_SESSION['access_token']['user_id'];
69                 } else {
70                         $this->token = NULL;
71                 }
72         }
73
74
75         /**
76          * Get a request_token from Twitter
77          *
78          * @returns a key/value array containing oauth_token and oauth_token_secret
79          */
80         function getRequestToken($oauth_callback = NULL) {
81                 $parameters = array();
82                 if (!empty($oauth_callback)) {
83                         $parameters['oauth_callback'] = $oauth_callback;
84                 } 
85                 $request = $this->oAuthRequest($this->requestTokenURL(), 'GET', $parameters);
86                 $token = OAuthUtil::parse_parameters($request);
87                 $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
88                 return $token;
89         }
90
91         /**
92          * Get the authorize URL
93          *
94          * @returns a string
95          */
96         function getAuthorizeURL($token) {
97                 if (is_array($token)) {
98                         $token = $token['oauth_token'];
99                 }
100                 return $this->authorizeURL() . "?oauth_token={$token}";
101         }
102
103         /**
104          * Exchange the request token and secret for an access token and
105          * secret, to sign API calls.
106          *
107          * @returns array("oauth_token" => the access token,
108          *                "oauth_token_secret" => the access secret)
109          */
110         function getAccessToken($oauth_verifier = FALSE) {
111                 $parameters = array();
112                 if (!empty($oauth_verifier)) {
113                         $parameters['oauth_verifier'] = $oauth_verifier;
114                 }
115                 $request = $this->oAuthRequest($this->accessTokenURL(), 'GET', $parameters);
116                 $token = OAuthUtil::parse_parameters($request);
117                 $this->token = new OAuthConsumer($token['oauth_token'], $token['oauth_token_secret']);
118                 return $token;
119         }
120
121         /**
122          * GET wrappwer for oAuthRequest.
123          */
124         function get($url, $parameters = array()) {
125                 $response = $this->oAuthRequest($url, 'GET', $parameters);
126                 if($response == false){
127                         return false;
128                 }
129                 return json_decode($response);
130         }
131
132         /**
133          * POST wreapper for oAuthRequest.
134          */
135         function post($url, $parameters = array(), $multipart = NULL) {
136                 $response = $this->oAuthRequest($url, 'POST', $parameters, $multipart);
137                 if($response === false){
138                         return false;
139                 }
140                 return json_decode($response);
141         }
142
143         /**
144          * Format and sign an OAuth / API request, then make an HTTP request
145          */
146         function oAuthRequest($url, $method, $parameters, $multipart=NULL) {
147                 if ($url[0] == '/') { //non-twitter.com api shall offer the entire url.
148                         $url = "{$this->host}{$url}.json";
149                 }
150                 $request = OAuthRequest::from_consumer_and_token($this->consumer, $this->token, $method, $url, $parameters);
151                 $request->sign_request($this->sha1_method, $this->consumer, $this->token);
152                 $request->set_http_header($multipart);
153                 
154                 $ci = curl_init();
155                 /* Curl settings */
156                 curl_setopt($ci, CURLOPT_CONNECTTIMEOUT, $this->connecttimeout);
157                 curl_setopt($ci, CURLOPT_TIMEOUT, $this->timeout);
158                 curl_setopt($ci, CURLOPT_RETURNTRANSFER, TRUE);
159                 curl_setopt($ci, CURLOPT_SSL_VERIFYPEER, $this->ssl_verifypeer);
160
161                 switch ($method) {
162                 case 'GET':
163                         curl_setopt($ci, CURLOPT_URL, $request->to_url());
164                         curl_setopt($ci, CURLOPT_HTTPHEADER, array('Expect:'));
165                         break;
166                 case 'POST':
167                         $postfields = $multipart ? $multipart : $request->to_postdata();
168                         curl_setopt($ci, CURLOPT_URL, $request->get_normalized_http_url());
169                         curl_setopt($ci, CURLOPT_HTTPHEADER, $request->http_header);
170                         curl_setopt($ci, CURLOPT_POST, TRUE);
171                         if (!empty($postfields)) {
172                                 curl_setopt($ci, CURLOPT_POSTFIELDS, $postfields);
173                         }
174                 }
175
176                 $response = curl_exec($ci);
177                 $this->http_header = $request->http_header;
178                 $this->curl_info = curl_getinfo($ci);
179                 $this->http_code = curl_getinfo($ci, CURLINFO_HTTP_CODE);
180                 $this->last_api_call = curl_getinfo($ci, CURLINFO_EFFECTIVE_URL);
181                 
182                 curl_close ($ci);
183                 
184                 return $response;
185         }
186         
187
188         /* ---------- API METHODS ---------- */
189         /*                                   */
190         /* ---------- Block ---------- */
191         function blockingList($id, $cursor=-1, $skip_status = true){
192                 $url = '/blocks/list';
193                 $args = array();
194                 if($id)
195                         $args['screen_name'] = $id;
196                 if($cursor)
197                         $args['cursor'] = $cursor;
198                 $args['skip_status'] = $skip_status;
199                 return $this->get($url, $args);
200         }
201
202         function blockUser($id){
203                 $url = "/blocks/create";
204                 $args = array();
205                 $args['screen_name'] = $id;
206                 return $this->post($url, $args);
207         }
208
209         function unblockUser($id){
210                 $url = "/blocks/destroy";
211                 $args = array();
212                 $args['screen_name'] = $id;
213                 return $this->post($url, $args);
214         }
215
216         /* ---------- Messages ---------- */
217         function deleteDirectMessage($id){
218                 $url = "/direct_messages/destroy";
219                 $args = array();
220                 $args['id'] = $id;
221                 return $this->post($url, $args);
222         }
223
224         function directMessages($since_id = false, $max_id = false, $count = false, $include_entities = true){
225                 $url = '/direct_messages';
226                 $args = array();
227                 if( $since_id )
228                         $args['since_id'] = $since_id;
229                 if( $max_id )
230                         $args['max_id'] = $max_id;
231                 if( $count )
232                         $args['count'] = $count;
233                 if($include_entities)
234                         $args['include_entities'] = $include_entities;
235                 return $this->get($url, $args);
236         }
237
238         function sentDirectMessages($since_id = false, $max_id = false, $count = false, $include_entities = true){
239                 $url = '/direct_messages/sent';
240                 $args = array();
241                 if($since_id)
242                         $args['since_id'] = $since_id;
243                 if( $max_id )
244                         $args['max_id'] = $max_id;
245                 if( $count )
246                         $args['count'] = $count;
247                 if($include_entities)
248                         $args['include_entities'] = $include_entities;
249                 return $this->get($url, $args);
250         }
251
252         /* ---------- List ---------- */
253         function addListMember($listid, $id, $memberid){
254                 $url = "/lists/members/create_all";
255                 $args = array();
256                 if($listid)
257                         $args['slug'] = $listid;
258                 if($id)
259                         $args['owner_screen_name'] = $id;
260                 if($memberid){
261                         $args['screen_name'] = $memberid;
262                 }
263                 return $this->post($url, $args);
264         }
265
266         function beAddedLists($username = '', $cursor = false){
267                 $url = "/lists/memberships";
268                 $args = array();
269                 if($username)
270                         $args['screen_name'] = $username;
271                 if($cursor){
272                         $args['cursor'] = $cursor;
273                 }
274                 return $this->get($url, $args);
275         }
276
277         function createList($name, $description, $isPortect){
278                 $url = "/lists/create";
279                 $args = array();
280                 if($name)
281                         $args['name'] = $name;
282                 if($description)
283                         $args['description'] = $description;
284                 if($isProtect)
285                         $args['mode'] = 'private';
286                 
287                 return $this->post($url, $args);
288         }
289
290         function myLists($username = false, $user_id = false, $count = false){
291                 $url = "/lists/ownerships";
292                 $args = array();
293                 if($username){
294                         $args['screen_name'] = $username;
295                 } else {
296                         $args['screen_name'] = $this->username;
297                 }
298                 
299                 return $this->get($url, $args);
300         }
301
302         function deleteList($slug){
303                 $url = "/lists/destroy";
304                 $args = array();
305                 $args['slug'] = $slug;
306                 $args['owner_screen_name'] = $this->username;
307                 return $this->post($url, $args);
308         }
309
310         function deleteListMember($slug, $owner, $memberid){
311                 $url = "/lists/members/destroy_all";
312                 $args = array();
313                 $args['slug'] = $slug;
314                 $args['owner_screen_name'] = $owner;
315                 $args['user_id'] = $memberid;
316                 
317                 return $this->post($url, $args);
318         }
319
320         function editList($prename, $name, $description, $isProtect){
321                 $url = "/lists/update";
322                 $args = array();
323                 if($prename)
324                         $args['slug'] = $prename;
325                 if($name)
326                         $args['name'] = $name;
327                 if($description)
328                         $args['description'] = $description;
329                 if($isProtect)
330                         $args['mode'] = "private";
331                 return $this->post($url, $args);
332         }
333
334         function followedLists($username = '', $cursor = false){
335                 $url = "/lists/subscriptions";
336                 $args = array();
337                 if($username)
338                         $args['screen_name'] = $username;
339                 if($cursor)
340                         $args['cursor'] = $cursor;
341                 return $this->get($url, $args);
342         }
343
344         function followList($id){
345                 $url = "/lists/subscribers/create";
346                 $arr = explode("/", $id);
347                 $args = array();
348                 $args['slug'] = $arr[1];
349                 $args['owner_screen_name'] = $arr[0];
350                 return $this->post($url, $args);
351         }
352
353         function isFollowedList($id){
354                 $url = "/lists/subscribers/show";
355                 $arr = explode('/', $id);
356                 $args = array();
357                 $args['owner_screen_name'] = $arr[0];
358                 $args['slug'] = $arr[1];
359                 $args['screen_name'] = $this->username;
360                 return isset($this->get($url, $args)->screen_name);
361         }
362
363         function listFollowers($id, $cursor = false, $skip_status = true){
364                 $url = "/lists/subscribers";
365                 $arr = explode('/', $id);
366                 $args = array();
367                 $args['slug'] = $arr[1];
368                 $args['owner_screen_name'] = $arr[0];
369                 if($cursor){
370                         $args['cursor'] = $cursor;
371                 }
372                 $args['skip_status'] = $skip_status;
373                 return $this->get($url, $args);
374         }
375
376         function listInfo($id){
377                 $arr = explode('/', $id);
378                 $url = "/lists/show";
379                 $args = array();
380                 $args['slug'] = $arr[1];
381                 $args['owner_screen_name'] = $arr[0];
382                 return $this->get($url, $args);
383         }
384
385         function listMembers($id, $cursor = false, $skip_status = true){
386                 $url = "/lists/members";
387                 $arr = explode("/", $id);
388                 $args = array();
389                 $args['slug'] = $arr[1];
390                 $args['owner_screen_name'] = $arr[0];
391                 if($cursor){
392                         $args['cursor'] = $cursor;
393                 }
394                 $args['skip_status'] = $skip_status;
395                 return $this->get($url, $args);
396
397         }
398
399         function listStatus($id, $since_id = false, $max_id = false, $include_rts = true, $include_entities = true){
400                 $arr = explode('/', $id);
401                 $url = "/lists/statuses";
402                 $args = array();
403                 $args['slug'] = $arr[1];
404                 $args['owner_screen_name'] = $arr[0];
405                 if($since_id)
406                         $args['since_id'] = $since_id;
407                 if($max_id)
408                         $args['max_id'] = $max_id;
409                 if($include_rts)
410                         $args['include_rts'] = $include_rts;
411                 if($include_entities)
412                         $args['include_entities'] = $include_entities;
413                 return $this->get($url, $args);
414         }
415
416         function unfollowList($id){
417                 $url = "/lists/subscribers/destroy";
418                 $arr = explode("/", $id);
419                 $args = array();
420                 $args['slug'] = $arr[1];
421                 $args['owner_screen_name'] = $arr[0];
422                 return $this->post($url, $args);
423         }
424
425         /* ---------- Friendship ---------- */
426         function destroyUser($id){
427                 $url = "/friendships/destroy";
428                 $args = array();
429                 $args['screen_name'] = $id;
430                 return $this->post($url, $args);
431         }
432
433         function followers($id = false, $cursor = -1, $skip_status = true){ // GET statuses/friends is removed, try GET followers/list instead
434                 $url = '/followers/list';
435                 $args = array();
436                 if( $id )
437                         $args['screen_name'] = $id;
438                 if($cursor)
439                         $args['cursor'] = $cursor;
440                 $args['skip_status'] = $skip_status;
441                 return $this->get($url, $args);
442         }
443
444         function followUser($id, $notifications = false){
445                 $url = "/friendships/create";
446                 $args = array();
447                 $args['screen_name'] = $id;
448                 if($notifications)
449                         $args['follow'] = true;
450                 return $this->post($url, $args);
451         }
452
453         function friends($id = false, $cursor = -1, $skip_status = true){ // GET statuses/friends is removed, try GET friends/list instead
454                 $url = '/friends/list';
455                 $args = array();
456                 if( $id )
457                         $args['screen_name'] = $id;
458                 if($cursor)
459                         $args['cursor'] = $cursor;
460                 $args['skip_status'] = $skip_status;
461                 return $this->get($url, $args);
462         }
463         
464         function relationship($target_screen_name, $source_screen_name = false){
465                 $url = '/friendships/show';
466                 $args = array();
467                 $args['target_screen_name'] = $target_screen_name;
468                 $args['source_screen_name'] = $source_screen_name ? $source_screen_name : $this->username;
469                 return $this->get($url, $args);
470         }
471
472         function showUser($screen_name = false, $user_id = false, $include_entities = true){
473                 $url = '/users/show';
474                 $args = array();
475                 if($screen_name)
476                         $args['screen_name'] = $screen_name;
477                 else
478                         $args['user_id'] = $user_id ? $user_id : $this->user_id;
479                 return $this->get($url, $args);
480         }
481
482         /* ---------- Ratelimit ---------- */
483         /* this API changed a lot due to the
484          * update of twitter's limit policy,
485          * get only status limits here by
486          * default                        */
487         function ratelimit($resources = "statuses"){
488                 $url = '/application/rate_limit_status';
489                 $args = array();
490                 $args['resources'] = $resources;
491                 return $this->get($url, $args);
492         }
493
494         /* ---------- Retweet ---------- */
495         function retweet($id){
496                 $url = "/statuses/retweet/$id";
497                 return $this->post($url);
498         }
499
500         function retweets($id, $count = 20){
501                 if($count > 100){
502                         $count = 100;
503                 }
504                 $url = "/statuses/retweets/$id";
505                 $args = array();
506                 $args['count'] = $count;
507                 return $this->get($url,$args);
508         }
509
510         function retweets_of_me($count = false, $since_id = false, $max_id = false, $include_entities = true){
511                 $url = '/statuses/retweets_of_me';
512                 $args = array();
513                 if($since_id)
514                         $args['since_id'] = $since_id;
515                 if($max_id)
516                         $args['max_id'] = $max_id;
517                 if($count)
518                         $args['count'] = $count;
519                 if($include_entities)
520                         $args['include_entities'] = $include_entities;
521                 return $this->get($url, $args);
522         }
523
524         /* ---------- Search ---------- */
525         function savedSearches(){
526                 $url = '/saved_searches/list';
527                 return $this->get($url);
528         }
529
530         function deleteSavedSearch($ssid){
531                 $url = "/saved_searches/destroy/{$ssid}";
532                 return $this->post($url);
533         }
534
535         function saveSearch($query){
536                 $url = "/saved_searches/create";
537                 $args = array();
538                 $args['query'] = $query;
539                 return $this->post($url, $args);
540         }
541
542         function search($q = false, $since_id = false, $max_id = false, $include_entities = true){
543                 $url = '/search/tweets';
544                 if(!$q) {
545                         return false;
546                 } else {
547                         $args = array();
548                         $args['q'] = $q;
549                 }
550                 if($since_id){
551                         $args['since_id'] = $since_id;
552                 }
553                 if($max_id){
554                         $args['max_id'] = $max_id;
555                 }
556                 if($include_entities){
557                         $args['include_entities'] = $include_entities;
558                 }
559                 return $this->get($url, $args);
560         }
561
562         /* ---------- Spam ---------- */
563         function reportSpam($screen_name){
564                 $url = '/users/report_spam';
565                 $args = array();
566                 $args['screen_name'] = $screen_name;
567                 return $this->post($url, $args);
568         }
569
570         /* ---------- Timeline ---------- */
571         function deleteStatus($id){
572                 $url = "/statuses/destroy/$id";
573                 return $this->post($url);
574         }
575
576         function homeTimeline($since_id = false, $max_id = false, $count = false, $include_entities = true) {
577                 $url = '/statuses/home_timeline';
578                 $args = array();
579                 if($max_id)
580                         $args['max_id'] = $max_id;
581                 if($since_id)
582                         $args['since_id'] = $since_id;
583                 if($count)
584                         $args['count'] = $count;
585                 else
586                         $args['count'] = 30;
587                 if($include_entities)
588                         $args['include_entities'] = $include_entities;
589                 return $this->get($url, $args);
590         }
591         
592         function getFavorites($userid = false, $sinceid = false, $maxid = false, $count = false, $include_entities = true){
593                 $url = '/favorites/list';
594                 $args = array();
595                 if($userid)
596                         $args['screen_name'] = $userid;
597                 if($sinceid)
598                         $args['since_id'] = $sinceid;
599                 if($maxid)
600                         $args['max_id'] = $maxid;
601                 if($count)
602                         $args['count'] = $count;
603                 if($include_entities)
604                         $args['include_entities'] = $include_entities;
605                 return $this->get($url, $args);
606         }
607
608         function makeFavorite($id){
609                 $url = "/favorites/create";
610                 $args = array();
611                 if($id)
612                         $args['id'] = $id;
613                 return $this->post($url, $args);
614         }
615
616         function removeFavorite($id){
617                 $url = "/favorites/destroy";
618                 $args = array();
619                 if($id)
620                         $args['id'] = $id;
621                 return $this->post($url, $args);
622         }
623
624         function replies($since_id = false, $max_id = false, $count = false, $include_entities = true){
625                 $url = '/statuses/mentions_timeline';
626                 $args = array();
627                 if($max_id)
628                         $args['max_id'] = $max_id;
629                 if($since_id)
630                         $args['since_id'] = $since_id;
631                 if($count)
632                         $args['count'] = $count;
633                 if($include_entities)
634                         $args['include_entities'] = $include_entities;
635                 return $this->get($url, $args);
636         }
637
638         function showStatus($id,$include_entities = true){
639                 $url = "/statuses/show";
640                 $args = array();
641                 if($id)
642                         $args['id'] = $id;
643                 if($include_entities)
644                         $args['include_entities'] = $include_entities;
645                 return $this->get($url,$args);
646         }
647
648         function update($status, $replying_to = false,$include_entities = true){
649                 try{
650                         $url = '/statuses/update';
651                         $args = array();
652                         $args['status'] = $status;
653                         if($replying_to)
654                                 $args['in_reply_to_status_id'] = $replying_to;
655                         if($include_entities)
656                                 $args['include_entities'] = $include_entities;
657                         return $this->post($url, $args);
658                 }catch(Exception $ex){
659                         echo $ex->getLine." : ".$ex->getMessage();
660                 }
661         }
662
663         function userTimeline($id = false, $since_id = false, $max_id = false, $count = false, $include_rts = true, $include_entities = true){
664                 $url = '/statuses/user_timeline';
665                 $args = array();
666                 if($max_id)
667                         $args['max_id'] = $max_id;
668                 if($id)
669                         $args['screen_name'] = $id;
670                 if($count)
671                         $args['count'] = $count;
672                 if($since_id)
673                         $args['since_id'] = $since_id;
674                 if($include_rts)
675                         $args['include_rts'] = $include_rts;
676                 if($include_entities)
677                         $args['include_entities'] = $include_entities;
678                 $response = $this->get($url, $args);
679                 return $response;
680         }
681
682         function trends_closest($lat = false, $long=false) {
683                 $url = "/trends/closest";
684                 $args = array();
685                 if ($lat)
686                         $args['lat'] = $lat;
687                 if ($long)
688                         $args['long'] = $long;
689                 return $this->get($url, $args);
690         }
691         
692         function trends_place($id = 1) {
693                 $url = "/trends/place";
694                 $args = array();
695                 if ($id)
696                         $args['id'] = $id;
697                 return $this->get($url, $args);
698         }
699         /* ---------- Misc. ---------- */
700         function veverify($skip_status = false){
701                 $url = '/account/verify_credentials';
702                 $args = array('skip_status' => $skip_status);
703                 return $this->get($url,$args);
704         }
705         
706         function updateProfile($fields = array(), $skip_status = true){
707                 $url = '/account/update_profile';
708                 $args = array();
709                 foreach( $fields as $pk => $pv ){
710                         switch( $pk ){
711                         case 'name' :
712                                 $args[$pk] = (string) substr( $pv, 0, 20 );
713                                 break;
714                         case 'url' :
715                                 $args[$pk] = (string) substr( $pv, 0, 100 );
716                                 break;
717                         case 'location' :
718                                 $args[$pk] = (string) substr( $pv, 0, 30 );
719                                 break;
720                         case 'description' :
721                                 $args[$pk] = (string) substr( $pv, 0, 160 );
722                                 break;
723                         default :
724                                 break;
725                         }
726                         $args['skip_status'] = $skip_status;
727                 }
728                 return $this->post($url, $args);
729         }
730         
731         /* media */
732         function updateProfileImage($image, $skip_status = true) {
733                 $url = '/account/update_profile_image';
734                 $args = array();
735                 if($image){
736                         $args['image']=$image;
737                         $args['skip_status']=$skip_status;
738                 }
739                 return $this->post($url, $args);
740         }
741         
742         function updateProfileBackground($image, $tile = false, $skip_status = true) {
743                 $url = '/account/update_profile_background_image';
744                 $args = array();
745                 if($image){
746                         $args['image']=$image;
747                 }
748                 if($tile){
749                         $args['tile']=($tile === 'true');
750                 }
751                 $args['skip_status']=$skip_status;
752                 return $this->post($url, $args);
753         }
754         
755         function updateMedia($status,$image,$replying_to = false) {
756                 $url = 'statuses/update_with_media';
757                 $args = array();
758                 if($status) $args['status'] = $status;
759                 if($replying_to) $args['in_reply_to_status_id'] = $replying_to;
760                 $mul = array();
761                 if($image) $mul['media'][] = $image;
762                 return $this->post($url,$args,$mul);
763         }
764 }
765