我想询问是否/如何使用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);
}
我真的搜了很久,如果你知道一些可能对我有用的东西,请在这里发帖:) 感谢你的帮助, 卡米洛
答案 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);