| Viewing file:  flickr_api.php (22.15 KB)      -rwxrwxr-x Select action/file-type:
 
  (+) |  (+) |  (+) | Code (+) | Session (+) |  (+) | SDB (+) |  (+) |  (+) |  (+) |  (+) |  (+) | 
 
<?php//
 // PHP5 Flickr_API
 // Should be mostly API compatible with Cal Henderson's PEAR::Flickr_API
 // but uses Curl and SimpleXML
 //
 // Rasmus Lerdorf, August 2005
 //
 
 class Flickr_API {
 private $_cfg = array('api_key'         => '',
 'api_secret'      => '',
 'endpoint'        => 'http://www.flickr.com/services/rest/',
 'auth_endpoint'   => 'http://www.flickr.com/services/auth/?',
 'upload_endpoint' => 'http://www.flickr.com/services/upload/',
 'conn_timeout'    => 20,
 'io_timeout'      => 60 );
 
 function __construct($params = array()) {
 if(isset($params['token'])) $this->token = $params['token'];
 foreach($params as $k => $v) {
 $this->_cfg[$k] = $v;
 }
 if(!$this->_cfg['api_key'] || !$this->_cfg['api_secret']) {
 throw new Exception("You must supply an api_key and an api_secret");
 }
 }
 
 function callMethod($method, $params = array()) {
 $this->_err_code = 0;
 $this->_err_msg = '';
 
 $req = curl_init();
 
 if($method=='upload') {
 $photo = $params['photo'];
 unset($params['photo']);
 } else {
 $params['method'] = $method;
 }
 $params['api_key'] = $this->_cfg['api_key'];
 $params['api_sig'] = $this->signArgs($params);
 
 if($method=='upload') {
 $params['photo'] = '@'.$photo;
 curl_setopt($req, CURLOPT_URL, $this->_cfg['upload_endpoint']);
 curl_setopt($req, CURLOPT_TIMEOUT, 0);
 #            curl_setopt($req, CURLOPT_INFILESIZE, filesize($photo));
 } else {
 curl_setopt($req, CURLOPT_URL, $this->_cfg['endpoint']);
 curl_setopt($req, CURLOPT_TIMEOUT, $this->_cfg['io_timeout']);
 curl_setopt($req, CURLOPT_POST, 1);
 }
 
 // Sign and build request parameters
 curl_setopt($req, CURLOPT_POSTFIELDS, $params);
 curl_setopt($req, CURLOPT_CONNECTTIMEOUT, $this->_cfg['conn_timeout']);
 curl_setopt($req, CURLOPT_FOLLOWLOCATION, 1);
 curl_setopt($req, CURLOPT_HEADER, 0);
 curl_setopt($req, CURLOPT_RETURNTRANSFER, 1);
 $this->_http_body = curl_exec($req);
 
 if (curl_errno($req)) {
 throw new Exception(curl_error($req));
 }
 
 curl_close($req);
 //file_put_contents('/tmp/curl.log',print_r($params,true)."\n".$this->_http_body."\n\n",FILE_APPEND);
 
 $xml = simplexml_load_string($this->_http_body);
 $this->xml = $xml;
 
 if((string)$xml['stat'] == 'fail') {
 $this->_err_code = (int)$xml->err['code'];
 $this->_err_msg  = (string)$xml->err['msg'];
 return 0;
 }
 
 if ((string)$xml['stat'] != 'ok') {
 $this->_err_code = 0;
 $this->_err_msg = "Unrecognised REST response status";
 return 0;
 }
 
 return $xml;
 }
 
 function getErrorCode() {
 return $this->_err_code;
 }
 
 function getErrorMessage() {
 return $this->_err_msg;
 }
 
 function showError() {
 echo "<br />ErrorCode: {$this->_err_code}<br />ErrorMessage: {$this->_err_msg}<br />\n";
 }
 
 function getAuthUrl($perms, $frob='') {
 $args = array('api_key'=>$this->_cfg['api_key'],'perms'=>$perms);
 
 if (strlen($frob)) { $args['frob'] = $frob; }
 
 $args['api_sig'] = $this->signArgs($args);
 
 $fields =  '';
 foreach($args as $k => $v) {
 if($fields) $fields.='&';
 $fields .= urlencode($k).'='.urlencode($v);
 }
 
 return $this->_cfg['auth_endpoint'].$fields;
 }
 
 
 function signArgs($args){
 ksort($args);
 $a = '';
 foreach($args as $k => $v) {
 $a .= $k . $v;
 }
 return md5($this->_cfg['api_secret'].$a);
 }
 }
 
 class Flickr extends Flickr_API {
 function __construct($params = array()) {
 parent::__construct($params);
 }
 
 function getFrobToken($frob) {
 $xml = $this->callMethod('flickr.auth.getToken',array('frob'=>$frob));
 if(!$xml) { $this->showError(); return FALSE; }
 
 $this->token = $ret['token'] = (string)$xml->auth->token;
 $this->perms = $ret['perms'] = (string)$xml->auth->perms;
 $uattr = $xml->auth->user->attributes();
 foreach($xml->auth->user->attributes() as $k=>$v) {
 // Sets token,perms,nsid,username and fullname
 $this->$k = $ret[$k] = (string)$v;
 }
 return $ret;
 }
 
 function getPhotoURL($p, $size='s', $ext='jpg') {
 return "http://static.flickr.com/{$p['server']}/{$p['id']}_{$p['secret']}_{$size}.{$ext}";
 }
 
 function authCheckToken($token) {
 $params = array('auth_token'  => $this->token);
 
 $xml = $this->callMethod('flickr.auth.checkToken',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->auth->children() as $k=>$v) {
 $ret[(string)$k] = (string)$v;
 foreach($v->attributes() as $kk=>$vv) {
 $ret[(string)$kk] = (string)$vv;
 }
 }
 return $ret;
 }
 // Contacts
 
 function contactsGetList($filter='') {
 $params = array('auth_token'=>$this->token);
 if($filter) $params['filter'] = $filter;
 
 $xml = $this->callMethod('flickr.contacts.getList',$params);
 if(!$xml) { return FALSE; }
 
 $i = 0;
 foreach($xml->contacts->contact as $contact) {
 foreach($contact->attributes() as $k=>$v) {
 $ret[$i][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function contactsGetPublicList($id) {
 $params = array('user_id'=>$id);
 $xml = $this->callMethod('flickr.contacts.getPublicList',$params);
 if(!$xml) { return FALSE; }
 
 $i=0;
 foreach($xml->contacts->contact as $contact) {
 foreach($contact->attributes() as $k=>$v) {
 $ret[$i][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 // Blogs
 
 function blogsGetList() {
 $params = array('auth_token'=>$this->token);
 $xml = $this->callMethod('flickr.blogs.getList',$params);
 if(!$xml) { return FALSE; }
 
 $i = 0;
 foreach($xml->blogs->blog as $blog) {
 foreach($blogs->attributes() as $k=>$v) {
 $ret[(string)$blog['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function blogsPostPhoto($blog_id, $photo_id, $title, $description, $blog_password='') {
 $params = array('auth_token'  => $this->token,
 'blog_id'     => $blog_id,
 'photo_id'    => $photo_id,
 'title'       => $title,
 'description' => $description);
 if($blog_password) $params['blog_password'] = $blog_password;
 $ret = $this->callMethod('flickr.blogs.postPhoto',$params);
 return $ret;
 }
 
 // Favorites
 
 function favoritesAdd($photo_id) {
 $params = array('auth_token'  => $this->token,
 'photo_id'    => $photo_id);
 $ret = $this->callMethod('flickr.favorites.add',$params);
 return $ret;
 }
 
 function favoritesRemove($photo_id) {
 $params = array('auth_token'  => $this->token,
 'photo_id'    => $photo_id);
 $ret = $this->callMethod('flickr.favorites.remove',$params);
 return $ret;
 }
 
 function favoritesGetList($user_id='',$extras='',$per_page='',$page='') {
 $params = array('auth_token'  => $this->token);
 if($user_id)  $params['user_id']  = $user_id;
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['per_page'] = $per_page;
 if($page)     $params['page']     = $page;
 $xml = $this->callMethod('flickr.favorites.getList',$params);
 if(!$xml) { return FALSE; }
 
 $i = 0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret[(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function favoritesGetPublicList($user_id='',$extras='',$per_page='',$page='') {
 $params = array();
 if($user_id)  $params['user_id']  = $user_id;
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['per_page'] = $per_page;
 if($page)     $params['page']     = $page;
 $xml = $this->callMethod('flickr.favorites.getPublicList',$params);
 if(!$xml) { return FALSE; }
 
 $i = 0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret[(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 // People
 
 function peopleFindByUsername($username) {
 $params = array('username'=>$username);
 $xml = $this->callMethod('flickr.people.findByUsername',$params);
 if(!$xml) { return FALSE; }
 
 $attr = $xml->user->attributes();
 return (string)$attr['nsid'];
 }
 
 function peopleGetInfo($nsid) {
 $params = array('user_id'=>$nsid);
 $xml = $this->callMethod('flickr.people.getInfo',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->person->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 foreach($xml->person->children() as $k=>$v) {
 if($k=='photos') {
 foreach($v as $kk=>$vv) {
 $ret['photos'][$kk] = (string)$vv;
 }
 } else $ret[$k] = (string)$v;
 }
 return $ret;
 }
 
 function peopleGetPublicPhotos($nsid,$extras='',$per_page='',$page='') {
 $params = array('user_id'=>$nsid);
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['per_page'] = $per_page;
 if($page)     $params['page']     = $page;
 $xml = $this->callMethod('flickr.people.getPublicPhotos',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photos->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 $i=0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret['photos'][(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function peopleFindByEmail($email, &$username='') {
 $params = array('find_email'=>$email);
 $xml = $this->callMethod('flickr.people.findByEmail',$params);
 if(!$xml) { return FALSE; }
 $attr = $xml->user->attributes();
 if(func_num_args()>1) $username = (string)$xml->user->username;
 return (string)$attr['nsid'];
 }
 
 function urlsLookupUser($url, &$username='') {
 $params = array('url'=>$url);
 $xml = $this->callMethod('flickr.urls.lookupUser',$params);
 if(!$xml) { return FALSE; }
 $attr = $xml->user->attributes();
 if(func_num_args()>1) $username = (string)$xml->user->username;
 return (string)$attr['id'];
 }
 
 // Sets
 
 // Indices of the photoset arrays are set to the individual photoset ids.
 function photosetsGetList($nsid='') {
 $params = array();
 if($this->token) $params['auth_token'] = $this->token;
 if($nsid) $params['user_id']=$nsid;
 $xml = $this->callMethod('flickr.photosets.getList',$params);
 if(!$xml) { return FALSE; }
 foreach($xml->photosets->attributes() as $k=>$v) $ret[$k] = (string)$v;
 $i=0;
 foreach($xml->photosets->photoset as $k=>$v) {
 foreach($v->attributes() as $kk=>$vv) $ret['photosets'][(string)$v['id']][$kk] = (string)$vv;
 foreach($v->children() as $kk=>$vv) $ret['photosets'][(string)$v['id']][$kk] = (string)$vv;
 $i++;
 }
 return $ret;
 }
 
 function photosetsGetInfo($photoset_id) {
 $params = array('photoset_id' => $photoset_id);
 $xml = $this->callMethod('flickr.photosets.getInfo',$params);
 if(!$xml) { return FALSE; }
 foreach($xml->photoset->attributes() as $k=>$v) $ret[$k] = (string)$v;
 foreach($xml->photoset as $key=>$val) {
 $ret[$key] = $val;
 }
 return $ret;
 }
 
 function photosetsCreate($title, $primary_photo_id, $description='') {
 $params = array('auth_token'  => $this->token);
 $params['title'] = $title;
 $params['primary_photo_id'] = $primary_photo_id;
 if($description) $params['description'] = $description;
 
 $xml = $this->callMethod('flickr.photosets.create',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photoset->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 return $ret;
 }
 
 function photosetsDelete($photoset_id) {
 $params = array('auth_token'  => $this->token);
 $params['photoset_id'] = $photoset_id;
 
 $xml = $this->callMethod('flickr.photosets.delete',$params);
 if(!$xml) { return FALSE; }
 return TRUE;
 }
 
 function photosetsGetPhotos($photoset_id) {
 $params = array('photoset_id' => $photoset_id);
 $xml = $this->callMethod('flickr.photosets.getPhotos',$params);
 if(!$xml) { return FALSE; }
 foreach($xml->photoset->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 $i=0;
 foreach($xml->photoset->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret['photos'][(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function photosetsAddPhoto($photoset_id, $photo_id) {
 $params = array('auth_token'  => $this->token);
 $params['photoset_id'] = $photoset_id;
 $params['photo_id'] = $photo_id;
 
 $xml = $this->callMethod('flickr.photosets.addPhoto',$params);
 if(!$xml) { return FALSE; }
 return TRUE;
 }
 
 function photosetsRemovePhoto($photoset_id, $photo_id) {
 $params = array('auth_token'  => $this->token);
 $params['photoset_id'] = $photoset_id;
 $params['photo_id'] = $photo_id;
 
 $xml = $this->callMethod('flickr.photosets.removePhoto',$params);
 if(!$xml) { return FALSE; }
 return TRUE;
 }
 
 function photosGetNotInSet($extras='',$perpage='',$page='') {
 $params = array('auth_token'  => $this->token);
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['perpage']  = $per_page;
 if($page)     $params['page']     = $page;
 $xml = $this->callMethod('flickr.photos.getNotInSet',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photos->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 $i=0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret['photos'][(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function photosGetRecent($extras='',$per_page='',$page='') {
 $params = array();
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['per_page'] = $per_page;
 if($page)     $params['page']     = $page;
 $xml = $this->callMethod('flickr.photos.getRecent',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photos->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 $i=0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret['photos'][(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 function photosGetInfo($photo_id, $secret='') {
 $params = array();
 if($this->token) $params['auth_token'] = $this->token;
 $params['photo_id'] = $photo_id;
 if($secret) $params['secret'] = $secret;
 
 $xml = $this->callMethod('flickr.photos.getInfo',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photo->attributes() as $k=>$v) {
 $ret[(string)$k] = (string)$v;
 }
 foreach($xml->photo->children() as $k=>$v) {
 foreach($v->attributes() as $kk=>$vv) $ret[(string)$k][(string)$kk] = (string)$vv;
 $id = -1;
 foreach($v->children() as $kk=>$vv) {
 $typed = false;
 if(isset($vv['id'])) $id = (string)$vv['id'];
 else if(isset($vv['type'])) { $id = (string)$vv['type']; $typed = true; }
 else $id++;
 foreach($vv->attributes() as $kkk=>$vvv) $ret[(string)$k][$id][(string)$kkk] = (string)$vvv;
 if($typed) $ret[(string)$k][$id] = (string)$vv;
 else $ret[(string)$k][$id]['text'] = (string)$vv;
 }
 if(!count($ret[(string)$k])) $ret[(string)$k] = (string)$v;
 }
 return $ret;
 }
 
 function upload($photo, $title='', $description='', $tags='', $perms='', $async=1, &$info=NULL) {
 $tmpf = false;
 $params = array('auth_token'  => $this->token);
 $url = parse_url($photo);
 if(isset($url['scheme'])) {
 $stream = fopen($photo,'r');
 $tmpf = tempnam('/var/tmp','G2F');
 file_put_contents($tmpf, $stream);
 fclose($stream);
 $params['photo'] = $tmpf;
 } else $params['photo'] = $photo;
 $info = filesize($params['photo']);
 if($title)       $params['title']       = $title;
 if($description) $params['description'] = $description;
 if($tags)        $params['tags']        = $tags;  // Space-separated string
 if($perms) {
 if(isset($perms['is_public'])) $params['is_public'] = $perms['is_public'];
 if(isset($perms['is_friend'])) $params['is_friend'] = $perms['is_friend'];
 if(isset($perms['is_family'])) $params['is_family'] = $perms['is_family'];
 }
 if($async)       $params['async']       = $async;
 $xml = $this->callMethod('upload',$params);
 if($tmpf) unlink($tmpf);
 if(!$xml) { return FALSE; }
 
 if($async) return((string)$xml->ticketid);
 else return((string)$xml->photoid);
 }
 
 function photosUploadCheckTickets($tickets) {
 if(is_array($tickets)) {
 foreach($tickets as $k=>$v) {
 if($k) $params['tickets'] .= ' ';
 $params['tickets'] .= $v;
 }
 } else {
 $params['tickets'] = $tickets;
 }
 $xml = $this->callMethod('flickr.photos.upload.checkTickets',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->uploader->ticket as $ticket) {
 foreach($ticket->attributes() as $k=>$v) {
 $ret[(string)$ticket['id']][$k] = (string)$v;
 }
 }
 return $ret;
 }
 
 // Notes
 
 function photosNotesAdd($photo_id,$x,$y,$w,$h,$text) {
 $params = array('auth_token'  => $this->token);
 $params['photo_id'] = $photo_id;
 $params['note_x'] = $x;
 $params['note_y'] = $y;
 $params['note_w'] = $w;
 $params['note_h'] = $h;
 $params['note_text'] = $text;
 
 $xml = $this->callMethod('flickr.photos.notes.add',$params);
 if(!$xml) { return FALSE; }
 
 return $xml->note['id'];
 }
 
 function photosNotesEdit($node_id,$x,$y,$w,$h,$text) {
 $params = array('auth_token'  => $this->token);
 $params['note_id'] = $note_id;
 $params['note_x'] = $x;
 $params['note_y'] = $y;
 $params['note_w'] = $w;
 $params['note_h'] = $h;
 $params['note_text'] = $text;
 
 $xml = $this->callMethod('flickr.photos.notes.edit',$params);
 if(!$xml) { return FALSE; }
 
 return $xml->note['id'];
 }
 
 function photosNotesDelete($note_id) {
 $params = array('auth_token'  => $this->token);
 $params['note_id'] = $node_id;
 
 $xml = $this->callMethod('flickr.photos.notes.delete',$params);
 if(!$xml) { return FALSE; }
 
 return TRUE;
 }
 
 function photosSearch($user_id='',$tags='',$tag_mode='',$text='',$min_upload_date='',
 $max_upload_date='',$min_taken_date='',$max_taken_date='',
 $license='',$extras='',$per_page='',$page='',$sort='') {
 if(is_array($user_id)) $params = $user_id;
 else {
 $params = array();
 if($user_id)  $params['user_id']  = $user_id;
 if($tags)     $params['tags']     = $tags;
 if($tag_mode) $params['tag_mode'] = $tag_mode;
 if($text)     $params['text']     = $text;
 if($min_upload_date) $params['min_upload_date'] = $min_upload_date;
 if($max_upload_date) $params['max_upload_date'] = $max_upload_date;
 if($min_taken_date)  $params['min_taken_date']  = $min_taken_date;
 if($max_taken_date)  $params['max_taken_date']  = $max_taken_date;
 if($license)  $params['license']  = $license;
 if($extras)   $params['extras']   = $extras;
 if($per_page) $params['per_page'] = $per_page;
 if($page)     $params['page']     = $page;
 if($sort)     $params['sort']     = $sort;
 }
 
 $xml = $this->callMethod('flickr.photos.search',$params);
 if(!$xml) { return FALSE; }
 
 foreach($xml->photos->attributes() as $k=>$v) {
 $ret[$k] = (string)$v;
 }
 $i=0;
 foreach($xml->photos->photo as $photo) {
 foreach($photo->attributes() as $k=>$v) {
 $ret['photos'][(string)$photo['id']][$k] = (string)$v;
 }
 $i++;
 }
 return $ret;
 }
 
 // Reflection
 
 function reflectionGetMethods() {
 $params = array();
 $xml = $this->callMethod('flickr.reflection.getMethods',$params);
 if(!$xml) { return FALSE; }
 
 $ret = (array)$xml->methods->method;
 return $ret;
 }
 
 }
 /*
 * Local variables:
 * tab-width: 4
 * c-basic-offset: 4
 * End:
 * vim600: sw=4 ts=4 fdm=marker
 * vim<600: sw=4 ts=4
 */
 ?>
 
 
 |