Как получить URL большой фотографии за один вызов API? - PullRequest
39 голосов
/ 29 сентября 2011

Я хочу немедленно отобразить большие фотографии в режиме просмотра моего приложения Facebook.Можно ли получить URL-адрес большой фотографии из потока / канала с помощью одного вызова API?Идентификатор фотографии возвращается в потоке / ленте, и затем, конечно, можно предоставить этот идентификатор фотографии в дополнительном вызове API FQL или графика для получения всей информации об этой фотографии.Тем не менее, есть ли способ использовать несколько запросов или пакетные вызовы, чтобы получить более крупный URL-адрес src для фотографий, используя одну обратную передачу API?

Ответы [ 6 ]

85 голосов
/ 29 сентября 2011

Я не пробовал делать это с фотографиями в потоковом режиме / фидом, но общепринятый способ сделать это:

http://graph.facebook.com/{ID of object}/picture

Если вы хотите "большую" версию, вы должны сделать:

http://graph.facebook.com/{ID of object}/picture?type=large

Я не уверен на 100%, будет ли это работать для реальной фотографии (вместо изображения профиля пользователя или изображения профиля страницы), но у меня есть предчувствие - единственное предостережение в том, что вы, очевидно, должны иметь зарегистрированный у пользователя, которому разрешено просматривать фотографию (если она не является общедоступной).

31 голосов
/ 25 ноября 2013

Если кто-то смотрит на это и недостаточно большого шрифта, я нашел другие решения.

Тип large в любом случае немного (близко к 200px).Вы можете получить увеличенное изображение, добавив, например, ?width=1000 или ?height=1000.Facebook вернет картинку, ближайшую к данному размеру, и сохранит соотношение сторон.При прохождении обоих измерений, таких как ?width=1000&height=1000, Facebook будет обрезать изображение до заданных размеров (в данном случае квадрат).

2 голосов
/ 10 июля 2016

Используйте Facebook UserId (идентификатор объекта) для получения изображения.

https://graph.facebook.com/173xxxx8635/picture?type=large&redirect=false

, которое возвращает данные JSON с URL-адресом изображения.

{
   "data": {
      "is_silhouette": false,
      "url": "https://fbcdn-profile-a.akamaihd.net/xxx/xyz/1cc066a2cae3f301d"
   }
}
1 голос
/ 23 мая 2014

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

Если, например, я скачал все свои фотографии с запросом

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,picture&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"picture"] 
    }
}];

Я использую поиск по словарю по ключевому слову "картинка" так, как я хочу.

Это, однако, даст мне более низкое качество изображения, чем если бы я искал "источник" в этом поиске:

[FBRequestConnection startWithGraphPath:@"/me/photos?fields=created_time,name,source&type=tagged" parameters:nil HTTPMethod:@"GET" completionHandler:^(FBRequestConnection * connection, id result, NSError *error) {

    NSDictionary * userData = (NSDictionary *)result;
    NSMutableArray * array = [[NSMutableArray alloc] initWithArray:userData[@"data"]];

    for (NSDictionary * dict in eventsToAdd) {

        UIImage * image = dict[@"source"] 
    }
}];

Если вы зайдете в проводник Facebook API и начнете поиск фотографий, а затем перейдете по ссылкам на изображение и исходный файл jpg, вы увидите разницу в размере и качестве.

После измененияЭтот метод мне удалось избавиться от использования параметров типа, так как он, кажется, не меняет.

Примечание. Я использую iPhone, а не iPad или экран большего размера, поэтому не знаю, как это влияет на экраны большего размера.

1 голос
/ 18 июня 2013

Хороший трюк с новым API - это получить поле pic_cover из таблицы событий и обработать его в соответствии с размером, который вы хотите использовать

0 голосов
/ 12 января 2016

Ответ @streetlogics работает нормально, но только для изображений с {object_id}.

http://graph.facebook.com/{object_id}/picture

Но я также хотел большие картинки для общих ссылок канала, которые иногда не имеют {object_id},Наконец я понял, что миниатюрный URL {picture} содержит закодированный URL для большого изображения исходного сайта:

https://external.xx.fbcdn.net/safe_image.php?d=AQBe9UvGd0vPbAHP&w=130&h=130&url=http%3A%2F%2Fskift.com%2Fwp-content%2Fuploads%2F2015%2F12%2Fpollution.jpg&cfs=1

-> содержит ->

http://skift.com/wp-content/uploads/2015/12/pollution.jpg

Итак, я сделалцикл, который проверяет наличие {object_id} и, если его нет, извлекает URL из {picture}:

if(isset($post['object_id'])) {
    echo "http://graph.facebook.com/".$post['object_id']."/picture";
    }
    elseif(isset($post['picture'])) {
        echo urldecode(preg_replace('/&cfs.*/', '', preg_replace('/.*url=/', '', $post['picture'])));
    } 
    else {
        echo "no_large_image";
}
...