2010-12-13 82 views
1

上傳圖像後,我試圖標記圖像,但上傳圖像後返回的「id」顯然沒有用處。Facebook使用Graph/REST API上傳後的標記圖像

我想知道是否有人能夠實現相同?

function upload_image($file,$session,$message) { 
    $args = array(
     'message' => $message, 
    ); 
    $args[basename($file)] = '@' . realpath($file); 
    $ch = curl_init(); 
    $url = 'https://graph.facebook.com/'.$album_id.'/photos?access_token='.$session['access_token']; 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $args); 
    $data = curl_exec($ch); 


    $result = json_decode($data,true); 

    $picture = $result['id']; 

    print_r($picture); 


    $json = 'https://api.facebook.com/method/photos.addTag?pid='.$picture.'&tag_text=Test&x=0&y=0&access_token='.$session['access_token']; 

    $ch = curl_init(); 
    $url = $json; 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_POST, true); 
    $data = curl_exec($ch); 

    print_r($data); 




} 

回答

1

這似乎是新Graph API的一個缺陷。通過一些實驗和閱讀,Facebook上的照片似乎有兩種ID。

  • 圖表API ID。此ID只能在Graph API調用中使用。由於photos.addTag是舊API的一部分,因此您傳遞的ID無效。
  • REST API ID。這個ID是通過REST API調用檢索,即photos.getphotos.upload

我還沒有找到一種方法來從一種ID的轉換爲另一種。如果你問我,這很愚蠢。

我能想到的兩種方式來上傳和標記照片通過現在的API調用:

  1. 使用photos.upload將圖像上傳和使用photos.addTag標記它。這可能是最乾淨的方式。
  2. 使用您在示例中使用的Graph API調用上傳圖像,然後使用photos.get獲取圖像列表,迭代查找剛剛上傳的圖像列表。這種方法可以讓你保持Graph API調用,但最好還是會出現黑客行爲。

此外,似乎無論我傳遞給Graph API上傳圖像調用的相冊ID是什麼,它都會將上傳的圖像放入名爲「[應用程序名稱]照片」的相冊中。

還有一件事,就範圍/請求權限而言,我似乎需要publish_stream有權將上傳的圖像立即投入用戶的帳戶。如果您沒有publish_stream訪問權限,則圖片在他或她的朋友可以看到之前需要獲得用戶的批准。您將需要user_photos訪問以獲取方法#2的用戶照片列表。

希望這些信息可以幫助你。

Relavent鏈接:

+0

輝煌的答覆。如果我可以多次讚揚這一點,我會。我會檢查一切,並嘗試一次,讓你知道。我唯一擔心的是舊的API很快就會被棄用。 – 2010-12-14 09:21:03

+0

完美的作品。謝謝。 – 2010-12-14 13:24:05

3

嘿, 您可以標記圖片直接與所述圖形API的上傳, 見下面的例子: 該方法創建的標籤信息的數組,在這個實施例中的方法變得與Facebook用戶ID的數組:

private function makeTagArray($userId) { 
    foreach($userId as $id) { 
      $tags[] = array('tag_uid'=>$id, 'x'=>$x,'y'=>$y); 
      $x+=10; 
      $y+=10; 
     } 
    $tags = json_encode($tags); 
    return $tags; 
} 

這裏是參數爲圖形API的調用來上傳圖片:

$arguments = array(
        'message' => 'The Comment on this Picture', 
        'tags'=>$this->makeTagArray($this->getRandomFriends($userId)), 
        'source' => '@' .realpath(BASEPATH . '/tmp/'.$imageName), 
      ); 

這裏是法圖API調用:

public function uploadPhoto($albId,$arguments) { 
    //https://graph.facebook.com/me/photos 
    try { 

     $fbUpload = $this->facebook->api('/'.$albId.'/photos?access_token='.$this->facebook->getAccessToken(),'post', $arguments); 
     return $fbUpload; 
    }catch(FacebookApiException $e) { 
     $e; 
     // var_dump($e); 
     return false; 
    } 
} 

參數$ albId包含來自Facebook相冊的ID。

如果您想爲相冊中現有的圖片添加標籤,您可以使用此方法: 首先,我們需要來自REST API的正確圖片ID,在此示例中,我們需要「應用」創建或使用此應用程序的用戶。 該方法返回的圖片ID從這張專輯的最後上傳的圖片:

public function getRestPhotoId($userId,$albumName) { 
    try { 
     $arguments = array('method'=>'photos.getAlbums', 
          'uid'=>$userId 
      ); 
     $fbLikes = $this->facebook->api($arguments); 
     foreach($fbLikes as $album) { 

      if($album['name'] == $albumName) { 
       $myAlbId = $album['aid']; 
      } 
     } 
     if(!isset($myAlbId)) 
      return FALSE; 
     $arguments = array('method'=>'photos.get', 
          'aid'=>$myAlbId 
      ); 
     $fbLikes = $this->facebook->api($arguments); 
     $anz = count($fbLikes); 
     var_dump($anz,$fbLikes[$anz-1]['pid']); 
     if(isset($fbLikes[$anz-1]['pid'])) 
      return $fbLikes[$anz-1]['pid']; 
     else 
      return FALSE; 
     //var_dump($fbLikes[$anz-1]['pid']); 
     //return $fbLikes; 
    }catch(FacebookApiException $e) { 
     $e; 
     // var_dump($e); 
     return false; 
    } 
} 

現在你有正確的圖片ID從REST API,你可以讓你的REST API調用來標記這個圖片$ pid是從方法getRestPhotoId圖片和$ tag_uid是一個Facebook的用戶名:

$json = 'https://api.facebook.com/method/photos.addTag?pid='.$pid.'&tag_uid='.$userId.'&x=50&y=50&access_token='.$this->facebook->getAccessToken(); 

    $ch = curl_init(); 
    $url = $json; 
    curl_setopt($ch, CURLOPT_URL, $url); 
    curl_setopt($ch, CURLOPT_HEADER, false); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    //curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_GET, true); 
    $data = curl_exec($ch); 

而此行是非常重要的: curl_setopt($ CH,CURLOPT_GET,真正的); 你必須使用CUROPT_GET而不是CUROPT_POST來添加一個Tag來拋出REST API。

我希望這可以幫助你。

斯圖爾特最好的問候凱

相關問題