如何在facebook-api中标记照片?

时间:2010-08-14 16:23:47

标签: facebook

我想询问是否/如何使用FB API(图形或REST)标记照片。

我设法创建了一张专辑,并在其中上传了一张照片,但我坚持使用标记。

我已获得权限和正确的会话密钥。

我的代码到现在为止:

try {
    $uid = $facebook->getUser();
    $me = $facebook->api('/me');
    $token = $session['access_token'];//here I get the token from the $session array
    $album_id = $album[0];

    //upload photo
    $file= 'images/hand.jpg';
    $args = array(
        'message' => 'Photo from application',
    );
    $args[basename($file)] = '@' . realpath($file);

    $ch = curl_init();
    $url = 'https://graph.facebook.com/'.$album_id.'/photos?access_token='.$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);

    //returns the id of the photo you just uploaded
    print_r(json_decode($data,true));

    $search = array('{"id":', "}");
    $delete = array("", "");

    // picture id call with $picture
    $picture = str_replace($search, $delete, $data);

    //here should be the photos.addTag, but i don't know how to solve this
    //above code works, below i don't know what is the error / what's missing

    $json = 'https://api.facebook.com/method/photos.addTag?pid='.urlencode($picture).'&tag_text=Test&x=50&y=50&access_token='.urlencode($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);
    curl_exec($ch);
} catch(FacebookApiException $e){
    echo "Error:" . print_r($e, true);
}

我真的搜了很久,如果你知道一些可能对我有用的东西,请在这里发帖:) 感谢你的帮助, 卡米洛

3 个答案:

答案 0 :(得分:9)

嘿 您可以使用GRAPH 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;
}

以下是调用GRAPH API上传图片的参数:

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

以下是GRAPH 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 CALL来标记此图片$ pid是方法getRestPhotoId中的图片,$ tag_uid是Facebook userId:

    $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,true); 你必须使用CUROPT_GET而不是CUROPT_POST来添加标签抛出REST API。

我希望这可以帮到你。

最好的祝福来自Stuttart的凯

答案 1 :(得分:3)

照片ID对于每个用户都是唯一的,看起来像两个数字在中间用下划线连接。

获取此ID有点棘手。

您可以通过在photo表格上运行FQL来获取它,但您需要提供用户唯一的相册ID。您可以从album表中获取相册ID,但您需要提供所有者用户ID。

例如,我们的CocaCola用户使用用户ID 40796308305.要从此用户获取照片ID,我们可以运行FQL:

SELECT pid FROM photo WHERE aid IN ( SELECT aid FROM album WHERE owner="40796308305")

(您可以在this page上的测试控制台中运行)

这将返回我们的照片ID:

[
  {
    "pid": "40796308305_2298049"
  },
  {
    "pid": "40796308305_1504673"
  },
  {
    "pid": "40796308305_2011591"
  },
  ...
]

我没有使用很多照片,也许你不必经历所有这些过程来获取照片ID,它可能是一些简单的算法,如<OWNER_ID>_<PHOTO_ID>。但是尝试从FQL获取您的照片ID,看看标记是否有效。如果可能的话,您可以跳过FQL部分并根据现有数据构建照片ID。

希望这有帮助。

答案 2 :(得分:0)

我发现了问题,问题是当你使用curl发送数组时,post函数不会正确发送数组,它只是发送“数组”,这就是为什么图形API抱怨标签是一个阵列。为了解决这个问题,我做了以下几点:

$data = array(array('tag_uid' => $taguser,
                  'x' => rand() % 100,
                  'y' => rand() % 100
                  ));

$data = json_encode($data);

$photo_details = array(
 'message'=> $fnames,
 'tags' => $data
);

现在我只使用curl发送

curl_setopt($ch, CURLOPT_POSTFIELDS, $photo_details);