从一个页面加载Facebook Feed时,如果Feed中存在图片,我想显示大图片。
我如何使用graph API
? Feed中的图片链接不是很大的。
感谢。
答案 0 :(得分:44)
Graph API photo object有一个picture
连接(类似于用户对象的连接):
“相册大小的照片视图。 [...]返回:HTTP 302重定向到图片的网址。“
因此请求https://graph.facebook.com/{object-id-from-feed}/picture
会立即将您重定向到相册大小的照片版本。 (不仅可以在浏览器中显示它,而且如果你想将图像下载到你的服务器,使用cURL并设置了follow_redirect选项。)
修改强>
从API v2.3开始,不推荐使用Feed帖子的/picture
边缘
但是,作为字段,仍然可以请求图片 - 但它会很小。
但full_picture
也可用。
因此可以使用/{object-id-from-feed}?fields=picture,full_picture
来请求这些请求,或者可以直接使用其余的Feed数据请求它们,例如/page-id/feed?fields=picture,full_picture,…
(必须指定其他字段,例如消息等)同样的方式。)
答案 1 :(得分:23)
对我有用的东西:
从Feed中获取图片链接,并将“_s.jpg
”替换为“_n.jpg
”
答案 2 :(得分:16)
好的,我找到了更好的方法。当您使用图表API检索Feed时,任何类型为photo
的Feed项都会有一个名为object_id
的字段,而status
类型的字段则不存在。使用该ID查询Graph API,例如https://graph.facebook.com/1234567890
。请注意,对象ID不是下划线分隔的值,就像该Feed项的主ID一样。
object_id
查询的结果将是一个新的JSON字典,您将拥有一个source
属性,其中包含迄今为止满足我需求的图像的URL。
还有一个images
数组,其中包含了不同大小的图像的更多图像网址,但其中的大小似乎不可预测,并且并非所有图像都实际对应于图像的物理尺寸。该网址背后的图片。
我仍然希望有一种方法可以通过单个Graph API调用来完成此操作,但它看起来不像是有一个。
答案 3 :(得分:8)
来自:
的高分辨率图像链接我使用以下内容:
注意:我给_s -> _o
黑客优先于object_id/picture
方法的原因是因为object_id方法没有返回所有图像的结果。
var picture = result.picture;
if (picture) {
if (result.type === 'photo') {
if (picture.indexOf('_s') !== -1) {
console.log('CONVERTING');
picture = picture.replace(/_s/, '_o');
} else if (result.object_id) {
picture = 'https://graph.facebook.com/' + result.object_id + '/picture?width=9999&height=9999';
}
} else {
var qps = result.picture.split('&');
for (var i = 0; i < qps.length; i++) {
var qp = qps[i];
var matches = qp.match(/(url=|src=)/gi);
if (matches && matches.length > 0) picture = decodeURIComponent(qp.split(matches[0])[1]);
}
}
}
答案 4 :(得分:7)
这是一种获取大图像的新方法。它是在预览方法不起作用后诞生的
/**
* return a big url of facebook
* works onky for type PHOTO
* @param picture
* @param is a post type link
* @return url of image
*/
@Transactional
public String getBigImageByFacebookPicture(String pictrue,Boolean link){
if(link && pictrue.contains("url=http")){
String url = pictrue.substring(pictrue.indexOf("url=") + 4);
try {
url = java.net.URLDecoder.decode(url, "UTF-8");
} catch (UnsupportedEncodingException e) {
StringBuffer sb = new StringBuffer("Big image for Facebook link not found: ");
sb.append(link);
loggerTakePost.error(sb.toString());
return null;
}
return url;
}else{
try {
Document doc = Jsoup.connect(pictrue).get();
return doc.select("#fbPhotoImage").get(0).attr("src");
} catch (Exception e) {
StringBuffer sb = new StringBuffer("Big image for Facebook link not found: ");
sb.append(link);
loggerTakePost.error(sb.toString());
return null;
}
}
}
欣赏您的大图:)
答案 5 :(得分:4)
实际上,您需要两种不同的解决方案才能完全解决此问题。
1] https://graph.facebook.com/ {object_id} / picture
此解决方案适用于发布到Facebook的图像和视频,但遗憾的是,如果原始图像文件未直接上传到Facebook,它会返回小图像。 (例如,当您在页面上发布指向其他网站的链接时)。
2] Facebook Graph API提供了一种在源本身中为这些外部链接获取完整图像的方法。如果您在调用API时将“full_picture”添加到下面的示例中,则会向您提供指向更高分辨率版本的链接。
结合这两个解决方案,我最终在PHP中过滤输入,如下所示:
if ( isset( $post['object_id'] ) ){
$image_url = 'https://graph.facebook.com/'.$post['object_id'].'/picture';
}else if ( isset( $post['full_picture'] ) ) {
$image_url = $post['full_picture'];
}else{
$image_url = '';
}
答案 6 :(得分:1)
请参阅:http://api-portal.anypoint.mulesoft.com/facebook/api/facebook-graph-api/docs/reference/pictures
只需输入&#34;?type = large&#34;在URL之后获得全局。
答案 7 :(得分:0)
感谢@mattdlockyer提供的JS解决方案。这是PHP中的类似内容:
$posts = $facebook->api('/[page]/posts/', 'get');
foreach($posts['data'] as $post)
{
if(stristr(@$post['picture'], '_s.'))
{
$post['picture'] = str_replace('_s.', '_n.', @$post['picture']);
}
if(stristr(@$post['picture'], 'url='))
{
parse_str($post['picture'], $picturearr);
if($picturearr['url'])
$post['picture'] = $picturearr['url'];
}
//do more stuff with $post and $post['picture'] ...
}
答案 8 :(得分:0)
在@Lachezar Todorov的积极评论之后,我决定发布我当前的方法(包括分页并使用 Json.NET ;):
try
{
FacebookClient fbClient = new FacebookClient(HttpContext.Current.Session[SessionFacebookAccessToken].ToString());
JObject posts = JObject.Parse(fbClient.Get(String.Format("/{0}/posts?fields=message,picture,link,attachments", FacebookPageId)).ToString());
JArray newsItems = (JArray)posts["data"];
List<NewsItem> result = new List<NewsItem>();
while (newsItems.Count > 0)
{
result.AddRange(GetItemsFromJsonData(newsItems));
if (result.Count > MaxNewsItems)
{
result.RemoveRange(MaxNewsItems, result.Count - MaxNewsItems);
break;
}
JToken paging = posts["paging"];
if (paging != null)
{
if (paging["next"] != null)
{
posts = JObject.Parse(fbClient.Get(paging.Value<String>("next")).ToString());
newsItems = (JArray)posts["data"];
}
}
}
return result;
}
用于解除个别物品的辅助方法:
private static IEnumerable<NewsItem> GetItemsFromJsonData(IEnumerable<JToken> items)
{
List<NewsItem> newsItems = new List<NewsItem>();
foreach (JToken item in items.Where(item => item["message"] != null))
{
NewsItem ni = new NewsItem
{
Message = item.Value<String>("message"),
DateTimeCreation = item.Value<DateTime?>("created_time"),
Link = item.Value<String>("link"),
Thumbnail = item.Value<String>("picture"),
// http://stackoverflow.com/questions/28319242/simplify-looking-up-nested-json-values-with-json-net/28359155#28359155
Image = (String)item.SelectToken("attachments.data[0].media.image.src") ?? (String)item.SelectToken("attachments.data[0].subattachments.data[0].media.image.src")
};
newsItems.Add(ni);
}
return newsItems;
}
我使用的NewsItem类:
public class NewsItem
{
public String Message { get; set; }
public DateTime? DateTimeCreation { get; set; }
public String Link { get; set; }
public String Thumbnail { get; set; }
public String Image { get; set; }
}