2012-03-02 79 views
21

从一个页面加载Facebook供稿时,如果图片中存在图片,我想显示大图片。如何使用图形API从feed中获取大图片?

我该如何获得graph API? Feed中的图片链接不是最大的。

谢谢。

+0

当前的答案无效。请更新您选择的答案。 @Benjamin Kuijten现在有正确的答案。 – 2015-02-18 08:55:48

回答

6

这是一个新的方法来获得一个大的图像。它诞生的预览方法不适用

 /** 
    * 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; 
      } 
     } 
    } 

后享受您的大图像:)

+1

你的答案为我解决了这个问题,我推荐给大家 – TooCooL 2014-09-23 23:01:36

+1

我问了这个问题,现在看来,你的答案似乎是最好的解决方案。做得好。 – user1105951 2014-10-11 10:00:05

+0

所有使用此答案,并希望删除130x130无论它是130x130或s433x23或p43x43 检查此: http://stackoverflow.com/questions/26313382/remove-dynamic-substring-from-string/26313575 #26313575 – user1105951 2014-10-11 10:47:14

23

什么工作对我来说: 充分利用饲料中的图片链接,并以“_n.jpg

+0

我不得不诉诸于此,但它感觉真的很脏并且很脆弱。仍在寻找更好的方法。 – 2012-08-23 09:44:47

+0

不错,它的工作。我觉得n代表正常,而我把b我得到了更大的一个。 – 2013-08-10 09:49:27

+0

我不得不诉诸于此。 Facebook并没有在它的API中提供这种明显必要的功能,这真是令人遗憾。 – jokeefe 2013-12-06 03:18:51

17

OK取代“_s.jpg”,我发现了一个更好的办法。当您使用图API检索供稿时,任何类型为photo的供稿项目都将有一个名为object_id的字段,该字段不是纯粹的status类型项目。用该ID查询Graph API,例如https://graph.facebook.com/1234567890。请注意,对象ID不是下划线分隔的值,例如该Feed项目的主ID。

object_id查询的结果将是一个新的JSON字典,其中包含一个source属性,该属性包含的图像的URL至今足以满足我的需求。

另外还有一个images数组,其中包含更多用于图像大小不同的图像URL,但其中的大小看起来并不可预测,并且实际上并不都与图像后面的物理尺寸相对应URL。

我仍然希望有一种方法可以通过一个Graph API调用来实现,但看起来并不存在。

+0

如果“专辑大小版本”适合您,那么有一种更简单的方法 - 请参阅我的答案。 – CBroe 2012-08-28 13:20:25

+0

你是对的。这是这样做的最标准的方法。 (减少破发的机会) – Raptor 2013-03-26 09:01:31

+0

谢谢,真棒回答! – 2014-12-21 09:17:23

44

Graph API photo object具有picture连接(类似于用户对象具有):

“照片的专辑尺寸图。 [...]返回:HTTP 302重定向到图片的URL“

所以请求https://graph.facebook.com/{object-id-from-feed}/picture将立即重定向到照片的相册大小的版本。 (有用的不仅是在浏览器中显示出来,而且如果FE要图像下载到您的服务器,使用cURL与follow_redirect选项集。)


编辑:

与开始API v2.3,供稿帖子的/picture边缘已被弃用。
但是,作为字段仍然可以请求图片 - 但它会是一个小图片。

但是full_picture也可以使用。

所以/{object-id-from-feed}?fields=picture,full_picture可以用来请求那些,或者他们可以直接请求与其他的feed数据,就像这样/page-id/feed?fields=picture,full_picture,…(附加字段,如消息等,必须用相同的方式指定。)

+0

工作形式我。不需要每个帖子的api facebook :) – Marcelo 2013-07-31 21:00:41

+0

这是真正的交易。不要乱用绝对文件url的 – user1576978 2014-12-10 18:48:03

+0

这很奇妙 – 2015-01-20 17:38:47

8

对于来自高分辨率图像链接:

  • 链接的帖子
  • 视频帖子
  • 照片的帖子

我使用以下命令:

注:的我给了_s -> _o hack precedenc e通过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]); 
     } 
    } 
} 
+0

这非常有效。你可以建立一个检查,如果图片无法从_s更改为_o或_n(容易使用Picasso)加载,只需获取对象ID并通过另一个API调用从那里获取源代码。 – Wenger 2014-05-01 13:31:38

+0

好的建议!我并不真的需要这种功能,但对于真正需要最大图像的人来说,这是一个好主意。 – mattdlockyer 2014-05-01 23:40:30

+0

这很棒!非常感谢! – jokeefe 2014-06-04 20:55:38

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'] ... 
} 
4

其实,你需要两个不同的解决方案,以充分解决这个问题。

1] https://graph.facebook.com/ {OBJECT_ID} /图片

这个解决方案工作正常发布至Facebook的图片和视频,但遗憾的是,它的情况下,原始图像文件并没有直接上传至Facebook返回小图片。 (例如,在您的页面上发布指向其他网站的链接时)。

2] Facebook Graph API提供了一种获取Feed中的完整图像的方法,用于这些外部链接。如果您在调用API时将'full_picture'添加到以下示例中的字段中,则会提供指向更高分辨率版本的链接。

https://graph.facebook.com/your_facebook_id/posts?fields=id,link,full_picture,description,name&access_token=123456

结合这两个解决方案,我结束了在过滤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 = ''; 
} 
+0

试过这个,但是...不幸的是full_picture链接指向一个相当小的图像:( – 2015-02-03 20:51:24

+0

您的权利@YoupTube经过一些更多的实验后,我需要更新我的答案... – 2015-02-04 10:39:11

+3

从另一篇文章中我学会了使用“附件”。那个人正在为我工​​作。它包含一个带有图像和来源的媒体节点。自己试试! – 2015-02-04 10:40:29

0

从@Lachezar托多罗夫我决定后我目前的做法正面评论后(包括寻呼并使用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; 
} 

和辅助方法retieve个别项目:

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; } 
} 
相关问题