【发布时间】:2014-02-08 08:52:40
【问题描述】:
我正在编写一个将照片上传到 facebook 的应用程序。我没有提供专辑 ID,因此代表我的应用创建了专辑。
我的问题是:如何获取照片上传到的相册 ID?
当我GET 时,相册中的照片信息不存在于 JSON 中,这是我的希望。
【问题讨论】:
标签: facebook facebook-graph-api
我正在编写一个将照片上传到 facebook 的应用程序。我没有提供专辑 ID,因此代表我的应用创建了专辑。
我的问题是:如何获取照片上传到的相册 ID?
当我GET 时,相册中的照片信息不存在于 JSON 中,这是我的希望。
【问题讨论】:
标签: facebook facebook-graph-api
Jimmy Sawczuk 的答案很接近,但不起作用,因为 FQL 照片表列 aid 和 pid 是 Rest/FQL API id,而不是 Graph API id。
幸运的是,此表中的 object_id 和 album_object_id 列是可索引的 (contrary to the documentation),因此这应该为您提供专辑的 Rest/FQL 和 Graph id:
select aid, album_object_id from photo where object_id = ${GRAPH_PHOTO_ID}
通常,Rest/FQL API 响应中的 object_id 字段是 Graph API id(照片通知除外,它是 Rest/FQL id)。
回复HonkyHonk的回答:并非所有照片link url 都有set 参数;在这种情况下,我认为您可以从其他参数中找到 Rest/FQL API 照片 id,然后使用 Rest/FQL API 获取相册 id:
(id << 32) | pid
2360873244068853905
id、_和pid
100002937903251_155052
如果 Facebook 能够记录有关这两种类型的 id 的信息,那将大有帮助。此外,Graph API Photo 架构应包含相册的 Graph API id。
【讨论】:
link 的 set 参数(如果存在)包含 Graph API 专辑 ID。
link 网址,其中set 的格式为at.${ALBUMID}.${REST}。哇,这很复杂。
这是获得它的简单方法:
【讨论】:
这个问题也困扰了我一段时间,但我想我已经破解了。
相册 ID 隐藏在链接值中,因此如果您有来自 Graph API 的照片发布对象,您可以像这样检索相册 ID:
NSString *link = [item valueForKey:@"link"];
NSString *album_id = nil;
NSRange fRange = [link rangeOfString:@"set=a."];
if(fRange.location != NSNotFound) {
NSInteger firstPos = fRange.location + 6;
NSInteger endPos = [link rangeOfString:@"." options:NSLiteralSearch range:NSMakeRange(firstPos, 25)].location;
album_id = [[link substringWithRange:NSMakeRange(firstPos, endPos - firstPos)] copy];
}
它可能都可以简化为一行代码,但我认为这更具可读性。 要获取专辑信息,请使用:
[facebook requestWithGraphPath:album_id andDelegate:delegate];
要获取相册中的所有照片,请使用:
[facebook requestWithGraphPath:[NSString stringWithFormat:@"%@/photos", album_id] andDelegate:delegate];
希望这可以帮助某人。
【讨论】:
如果我的理解正确,您有照片 ID,但需要相册 ID。您可以尝试通过以下查询使用the photo FQL table:
SELECT aid, pid FROM photo WHERE pid = '<your photo id>'
【讨论】:
user_photos 权限吗?
冗长、笨重但理论上有效的方法:
http://graph.facebook.com/userid/albums将为您提供用户允许您查看的所有相册的列表,然后您可以搜索与您创建相册的时间相匹配的相册对象 (api here) for created_times,您可以在创建时存储专辑。
这几乎可以肯定是一种可怕的方法,但它应该可以工作。
【讨论】:
Richard Barnett 的解决方案对我来说效果很好,我将其用作通过 Graph API 的 FQL 查询来获得 JSON 响应,就像我对任何其他 Graph API 查询一样:
https://graph.facebook.com/fql?q=select+album_object_id+FROM+photo+WHERE+object_id='[PHOTOID]'
这会返回:
{
"data": [
{
"album_object_id": "10150531092908837"
}
]
}
然后您可以使用以下方式访问专辑 ID:
<?php
$strPhotoAlbumID = $objFacebookAPI->data[0]->album_object_id;
?>
这是我发现的最干净的解决方案,因为 Facebook 会不断更改其照片和相册 URL 的格式,因此使用 RegEx 解析这些不会作为长期解决方案。
【讨论】:
我最终只使用了旧版 REST api,因为专辑 ID 是通过服务器响应中的图像链接传递的。然后我使用正则表达式将 id 提取出来。
不是最好的解决方案,我不会推荐它,但我觉得它比在代码中添加另外几个服务器请求更好。
【讨论】:
function get_album_id_by_album_name($album_name){//return array of data
$fql = 'SELECT aid, owner, name, object_id FROM album WHERE owner=me() and name="'.$album_name.'"';
$param = array(
'method' => 'fql.query',
'query' => $fql,
'callback' => ''
);
$fqlResult = $this->facebook->api($param);
return $fqlResult;
}
【讨论】:
String albumID = "https://www.facebook.com/photo.php?fbid=192570127478130&set=a.135556629846147.24342.100001754323389&type=1";
albumID = albumID.split("&set=a.")[1];
albumID = albumID.split("\\.")[0];
System.out.println(albumID);
【讨论】: