Facebook graph api 如何使用graph api从提要中获取大图片?

Facebook graph api 如何使用graph api从提要中获取大图片?,facebook-graph-api,Facebook Graph Api,当从一个页面加载Facebook提要时,如果提要中存在图片,我希望显示大图片 如何使用图形API?提要中的图片链接不是大链接 谢谢。对我有用的是: 从提要中获取图片链接并将“\u.jpg”替换为“\n.jpg”好的,我找到了一个更好的方法。使用graph API检索提要时,任何类型为photo的提要项都将有一个名为object\u id的字段,该字段不适用于普通状态类型的项。使用该ID查询图形API,例如https://graph.facebook.com/1234567890。请注意,对象ID

当从一个页面加载Facebook提要时,如果提要中存在图片,我希望显示大图片

如何使用
图形API
?提要中的图片链接不是大链接

谢谢。

对我有用的是:
从提要中获取图片链接并将“
\u.jpg
”替换为“
\n.jpg

好的,我找到了一个更好的方法。使用graph API检索提要时,任何类型为
photo
的提要项都将有一个名为
object\u id
的字段,该字段不适用于普通
状态
类型的项。使用该ID查询图形API,例如
https://graph.facebook.com/1234567890
。请注意,对象ID不像提要项的主ID那样是下划线分隔的值

object\u id
查询的结果将是一个新的JSON字典,其中有一个
source
属性,其中包含一个图像的URL,该图像到目前为止已经足够大,可以满足我的需要

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

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

有一个
图片
连接(类似于用户对象的连接):

“照片的相册大小视图。[…]返回:HTTP 302重定向到图片的URL。”

所以请求
https://graph.facebook.com/{object id from feed}/picture
将立即将您重定向到相册大小的照片版本。(不仅适用于在浏览器中显示图像,如果您想将图像下载到服务器上,还可以使用设置了cURL和follow_redirect选项的cURL。)


编辑:

从API v2.3开始,提要的
/picture
边缘已被弃用。
然而,作为一个字段,图片仍然可以被请求——但它将是一个小字段

但是
全图
也可用


因此,
/{object id from feed}fields=picture,full_picture
可以用于请求这些,或者可以直接与其他提要数据一起请求它们,如
/page id/feed?fields=picture,full_picture,
(必须以相同的方式指定消息等其他字段)。

对于来自以下站点的高分辨率图像链接:

  • 连接柱
  • 视频帖子
  • 照片贴
我使用以下方法:

注意:我之所以给出
\u s->\u o
hack优先于
object\u id/picture
方法,是因为object\u 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]);
        }
    }
}
var picture=result.picture;
如果(图片){
如果(result.type==='photo'){
if(picture.indexOf(“'s')!=-1){
console.log('CONVERTING');
图片=图片。替换(/_s/,'u o');
}else if(result.object\u id){
图画https://graph.facebook.com/“+result.object_id+”/picture?宽度=9999,高度=9999';
}
}否则{
var qps=结果.图片.分割('&');
对于(变量i=0;i0)picture=decodeURIComponent(qp.split(matches[0])[1]);
}
}
}

感谢@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'] ...
}

这是一种获得大图像的新方法。它是在previews方法不起作用之后产生的

     /**
     * 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] {object_id}/图片

此解决方案适用于发布到Facebook的图像和视频,但遗憾的是,如果原始图像文件没有直接上传到Facebook,它会返回小图像。(例如,在页面上发布指向其他站点的链接时)

2] FacebookGraphAPI提供了一种在提要中获取这些外部链接的完整图像的方法。如果在调用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  =   '';
}

在@Lachezar Todorov发表了积极的评论之后,我决定发布我目前的方法(包括分页和使用Json.NET):

见:


只要在URL后面加上“?type=large”就可以了解全局。

我也不得不这样做,但它感觉非常肮脏和脆弱。仍然在寻找更好的方法。很好,很有效。我觉得n代表正常,而我把b放在了更大的一个,我也不得不求助于这个。很遗憾,Facebook没有在其API中提供这种显然必要的功能。@user1105951我尝试了CBroe的答案。这已经不起作用了。它返回一个
OAutheException
,并显示消息
“(#100)未指定节点”
。\u o给出原始图像,如果您想要一个下拉式解决方案,请参阅下面的我的答案。如果“相册大小版本”适合您,那么有一个更简单的方法–请参阅我的答案。您是对的。这是最标准的方法。(打破的机会少了)谢谢,回答得真棒!最安全的方式,但是…性能损失。特别是当你喜欢在网站上以自定义方式显示提要/帖子,并且必须为“每篇”帖子执行额外的图形Api调用才能获得指向更大图片的链接时。从我这里开始。没有必要为每篇帖子都使用api facebook:)这才是真正的交易。不要弄乱绝对文件url’我希望有这样的设置。工作起来很有魅力。谢谢你太棒了!我已经浪费了几个小时的搜索时间,但是没有人提到这个神秘的密码
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;

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