Получение «реального» URL-адреса изображения профиля Facebook из Graph API - PullRequest
75 голосов
/ 27 июля 2010

API графа Facebook говорит мне, что я могу получить фотографию профиля пользователя, используя

http://graph.facebook.com/517267866/picture?type=large

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

http://profile.ak.fbcdn.net/profile-ak-snc1/v227/560/83/n517267866_1928.jpg

Как я могу получить второй URL-адрес, используя первый программно?

Ответы [ 12 ]

73 голосов
/ 27 июля 2010

Первый URL дает HTTP 302 (временное перенаправление) ко второму. Таким образом, чтобы найти второй URL-адрес программно, вы можете выполнить HTTP-запрос для первого URL-адреса и получить заголовок Location ответа.

Тем не менее, не полагайтесь на то, что второй URL-адрес является постоянным. Немного читая код ответа HTTP (из 302 в отличие от постоянного 301), возможно, Facebook регулярно меняет эти URL-адреса, чтобы люди не могли & mdash; например & mdash; использовать свои серверы для размещения изображений.


Редактировать: Обратите внимание, что URL CDN, который опубликовал ОП, теперь 404, поэтому мы знаем, что мы не можем полагаться на долгоживущий URL. Кроме того, если вы ссылаетесь на Graph API из <img> на странице, защищенной SSL, есть параметр , вам нужно добавить , убедитесь, что вы используете http<b>s</b>://graph.facebook.com.


Обновление: В API добавлен параметр & ndash; redirect=false - что вызывает возвращение JSON, а не перенаправление. Перезапущенный JSON включает URL CDN:

{
   "data": {
      "url": "http://profile.ak.fbcdn.net/...",
      "is_silhouette": false
   }
}

Опять же, я бы не стал полагать, что этот URL-адрес CDN будет долгоживущим. Ответ JSON отправляется с разрешающими заголовками CORS, поэтому вы можете делать это на стороне клиента с запросами XHR.

36 голосов
/ 10 апреля 2011
16 голосов
/ 04 октября 2012

Я понимаю, что уже поздно, но есть другой способ получить URL изображения профиля.

К исходному URL вы можете добавить параметр redirect=false, чтобы получить фактический URL-адрес изображения, на которое вы обычно будете перенаправлены.

Таким образом, новый запрос будет выглядеть как http://graph.facebook.com/517267866/picture?type=large&redirect=false. Это вернет объект JSON, содержащий URL-адрес изображения и логическое значение is_silhouette (true, если изображение является изображением по умолчанию на Facebook).

Изображение будет также указанного вами размера. Вы можете проверить это дополнительно, добавив размеры: http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400

7 голосов
/ 03 апреля 2013

Для всех, кто хочет получить изображение профиля в iOS:

Я только что сделал это, чтобы получить изображение пользователя на Facebook:

NSString *profilePicURL = [NSString stringWithFormat:@"http://graph.facebook.com/%@/picture?type=large", fbUserID];

где 'fbUserID'- это идентификатор профиля пользователя Facebook.

Таким образом, я всегда могу просто вызвать URL в profilePicURL, чтобы получить изображение, и я всегда получаю его, без проблем.Если у вас уже есть идентификатор пользователя, вам не нужны никакие запросы API, просто вставьте этот идентификатор в URL после facebook.com/.

К вашему сведению всем, кто ищет, кому нужен fbUserID в iOS:

if (FBSession.activeSession.isOpen) {
    [[FBRequest requestForMe] startWithCompletionHandler:
     ^(FBRequestConnection *connection,
       NSDictionary<FBGraphUser> *user,
       NSError *error) {
         if (!error) {
             self.userName = user.name;
             self.fbUserID = user.id;
         }
     }];
}

Для этого вам потребуется активная сессия FBS (см. Документацию Facebook и пример «Потрясающе»).

6 голосов
/ 18 января 2017

Если вы хотите получить JSON изображения профиля хорошего качества с URL-адресом, вы можете использовать его:

http://graph.facebook.com/517267866/picture?height=1024&redirect=false

, если вам просто нужно изображение, используйте его без параметра redirect:

http://graph.facebook.com/517267866/picture?height=1024

517267866 - идентификатор профиля одного из приведенных выше примеров.Поставьте нужный идентификатор в фейсбуке

Надеюсь, это поможет

3 голосов
/ 13 июля 2011
$url = 'http://graph.facebook.com/100000771470028/picture?type=large';
$rray=get_headers($url);
$hd = $rray[4];
echo(substr($hd,strpos($hd,'http')));

Это вернет URL-адрес, который вы просили, и проблема изменения URL-адреса на Facebook не имеет значения, потому что вы динамически вызываете URL-адрес из исходного URL-адреса.

2 голосов
/ 26 ноября 2015

Для Android:

Согласно последнему SDK Facebook,

Сначала вам нужно позвонить GraphRequest API, чтобы получить все данные пользователя, у которого APIтакже дает URL of current Profile Picture.

Bundle params = new Bundle();
params.putString("fields", "id,email,gender,cover,picture.type(large)");
new GraphRequest(token, "me", params, HttpMethod.GET,
        new GraphRequest.Callback() {
            @Override
            public void onCompleted(GraphResponse response) {
                if (response != null) {
                    try {
                        JSONObject data = response.getJSONObject();
                        if (data.has("picture")) {
                            String profilePicUrl = data.getJSONObject("picture").getJSONObject("data").getString("url");
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
}).executeAsync();
2 голосов
/ 19 октября 2015

это единственное, что действительно работает:

me?fields=picture.type(*YOURTYPE*)

, где YOURTYPE может быть одним из следующих: маленький, нормальный, альбом, большой, квадратный

1 голос
/ 30 июня 2014

Теперь Facebook нужно SSL

-> Важное добавлено S, https -> https://graph.facebook.com/userId/?fields=picture&type=large

Работает в июне / 2014

1 голос
/ 04 декабря 2012
function getFacebookImageFromURL($url)
{
  $headers = get_headers($url, 1);
  if (isset($headers['Location']))
  {
    return $headers['Location'];
  }
}

$url = 'https://graph.facebook.com/zuck/picture?type=large';
$imageURL = getFacebookImageFromURL($url);
...