如何使用图形api从feed中获取大图?

时间:2012-03-02 03:21:49

标签: facebook-graph-api

从一个页面加载Facebook Feed时,如果Feed中存在图片,我想显示大图片。

我如何使用graph API? Feed中的图片链接不是很大的。

感谢。

9 个答案:

答案 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”添加到下面的示例中,则会向您提供指向更高分辨率版本的链接。

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  =   '';
}

答案 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; }
}