Как получить большую картинку из ленты с графиком API? - PullRequest
20 голосов
/ 02 марта 2012

При загрузке каналов Facebook с одной страницы, если в канале существует изображение, я хочу отобразить большое изображение.

Как получить с graph API?Ссылка на изображение в ленте не большая.

Спасибо.

Ответы [ 9 ]

44 голосов
/ 28 августа 2012

Фотообъект Graph API имеет соединение picture (аналогично объекту пользователя):

«Просмотр фотографии в формате альбома. […] Возвращает: HTTP 302 перенаправляет на URL картинки. ”

Поэтому запрос https://graph.facebook.com/{object-id-from-feed}/picture немедленно перенаправит вас на версию фотографии размером с альбом. (Полезно не только для отображения в браузере, но также, если, например, вы хотите загрузить изображение на свой сервер, используя cURL с установленным параметром follow_redirect.)


Edit:

Начиная с API v2.3, край /picture для сообщений фида устарел.
Однако, в качестве поля можно по-прежнему запрашивать изображение, но оно будет небольшим.

Но full_picture также доступно.

Таким образом, /{object-id-from-feed}?fields=picture,full_picture может использоваться для запроса этих запросов, или они могут быть запрошены напрямую с остальными данными канала, как это /page-id/feed?fields=picture,full_picture,… (дополнительные поля, такие как сообщение и т. Д., Должны быть указаны таким же образом.)

23 голосов
/ 27 марта 2012

Что сработало для меня: получить ссылку на изображение из ленты и заменить "_s.jpg" на "_n.jpg"

16 голосов
/ 28 августа 2012

ОК, я нашел лучший способ. При извлечении канала с помощью API-интерфейса графа любой элемент канала с типом photo будет иметь поле с именем object_id, которого нет для простых элементов типа status. Запросите API Graph с этим идентификатором, например, https://graph.facebook.com/1234567890. Обратите внимание, что идентификатор объекта не является разделенным подчеркиванием значением, как основной идентификатор этого элемента фида.

Результатом запроса object_id будет новый словарь JSON, в котором у вас будет атрибут source, содержащий URL-адрес изображения, которое до сих пор было достаточно большим для моих нужд.

Кроме того, существует массив images, который содержит больше URL-адресов изображений для изображений разных размеров, но размеры там не кажутся предсказуемыми, и не все фактически соответствуют физическим размерам изображения позади. этот URL.

Я все еще хотел бы, чтобы был способ сделать это с помощью одного вызова API Graph, но не похоже, что он есть.

8 голосов
/ 06 апреля 2014

Для изображений с высоким разрешением от:

  • Ссылка сообщений
  • Видео сообщений
  • Фото сообщений

Я использую следующие:

Примечание: Причина, по которой я даю _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]);
        }
    }
}
7 голосов
/ 23 сентября 2014

Это новый метод получения большого изображения.он родился после того, как метод предварительного просмотра не работает

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

Наслаждайтесь большим изображением:)

4 голосов
/ 03 февраля 2015

На самом деле, вам нужно два разных решения, чтобы полностью это исправить.

1] https://graph.facebook.com/{object_id}/picture

Это решение отлично работает для изображений и видео, опубликованных в Facebook, но, к сожалению, оно возвращает небольшоеизображения, если исходный файл изображения не был загружен в Facebook напрямую.(Например, при публикации ссылки на другой сайт на вашей странице.)

2] API Graph Facebook позволяет получить полные изображения в самом фиде для этих внешних ссылок.Если при вызове 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  =   '';
}
1 голос
/ 30 апреля 2015

См .: http://api -portal.anypoint.mulesoft.com / facebook / api / facebook-graph-api / docs / reference / pictures

Просто поставьте "? Type =большой "после URL, чтобы получить большую картину.

0 голосов
/ 18 февраля 2015

После положительного комментария от @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; }
}
0 голосов
/ 09 мая 2014

Спасибо @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'] ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...