Отримання „справжньої” URL-адреси зображення профілю Facebook із API графіків


74

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-адресу, використовуючи першу програмно?


5
Навіщо вам "справжній"
dockeryZ

2
таким чином я можу зберегти URL-адресу і викликати її безпосередньо, не роблячи запит API?
ericbae

1
Ви все ще можете зателефонувати йому безпосередньо. це все одно буде працювати
ufk

@ufk, але обидва дають різні результати, коли користувач змінює своє зображення.
Rana Deep

Я усвідомлюю, що це відбулося через 10 років (наскільки дивовижно stackoverflow?), Але ця URL-адреса повертає обкладинку, а не зображення профілю користувача.
Марчелло Романі

Відповіді:


72

Перша URL-адреса надає HTTP 302 (тимчасове перенаправлення) на другу. Отже, щоб програмно знайти другу URL-адресу, ви можете надіслати запит HTTP для першої URL-адреси та отримати Locationзаголовок відповіді.

Тим не менш, не покладайтесь на те, що друга URL-адреса є важливою. Прочитавши трохи код відповіді HTTP (302, на відміну від постійного 301), можливо, Facebook регулярно змінює ці URL-адреси, щоб люди не могли, наприклад, використовувати свої сервери для розміщення зображень.


Редагувати: Зверніть увагу, що URL-адреса CDN, яку опублікував ОП, тепер є 404, тому ми знаємо, що не можемо покладатися на те, що URL-адреса є довгожителем. Крім того, якщо ви посилаєтесь на API Graph із <img>сторінки, захищеної SSL, є параметр, який потрібно додати, обов’язково використовуючи .https://graph.facebook.com


Оновлення: API додав параметр - redirect=false- який призводить до повернення JSON, а не до перенаправлення. Оновлений JSON містить URL-адресу CDN:

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

Знову ж таки, я б не покладався на те, що ця URL-адреса CDN є довгожителем. Відповідь JSON надсилається із дозвільними заголовками CORS, тому ви можете вільно робити цю сторону клієнта із запитами XHR.


2
має сенс. це те, що я очікував. дякую за відповідь!
ericbae

1
Чи є сенс надсилати з сервера URL-адреси cdn, якщо ви робите дошку лідерів гри і хочете виставити лише зображення профілю користувачів, а не їх ідентифікатор користувача? Я не кажу, що розраховуйте на CDN, але просто змусіть сторону сервера викликів приховати деталі fbID від клієнта.
Рассел Ашер,

Як уникнути завантаження файлу зображення? Здається, що URL-адреса зображення під час повернення 200 завантажується браузером, а не відображається. Можливо тому, що заголовками відповідей є content-disposition: attachmentі content-type: image/jpeg.
loretoparisi

36

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

Поверне URL-адресу у форматі JSON


2
Повертає URL-адресу невеликого зображення.
Vaiden

7
Так само - це повертає маленьке зображення
коса риса незалежно від

23
якщо ви дійсно хочете , щоб принести його таким чином, використання graph.facebook.com/517267866/?fields=picture.type(large)
Анді

1
@andi Ви повинні написати це як окрему відповідь: конкретний синтаксис 'fields = picture.type (large)' був для мене єдиним рішенням отримати URL-адресу великого зображення профілю як відповідь JSON від Facebook.
Visionscaper

<page_or_user_id> / picture? type = large або <page_or_user_id>? fields = picture.type (large) обидва працюють для мене ... але повернене зображення абсолютно відрізняється від зображення профілю, яке я бачу, якщо я фактично відвідую сторінку.
phpguru

16

Я усвідомлюю, що це пізно, але є інший спосіб отримати URL-адресу зображення профілю.

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

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

Зображення також матиме розмір, який ви вказали. Ви можете перевірити це додатково, додавши розміри: http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400


7

Для тих, хто хоче отримати фотографію профілю в iOS:

Я просто зробив це, щоб отримати фотографію користувача у Facebook:

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

де 'fbUserID' - ідентифікатор профілю користувача Facebook.

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

FYI для тих, хто шукає, хто потребує 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

Якщо вам потрібен JSON якісного зображення профілю з URL-адресою, ви можете використовувати це:

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

якщо вам просто потрібна картинка, використовуйте її без перенаправлення параметра:

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

517267866 - це ідентифікатор профілю одного з наведених вище прикладів. Введіть потрібний ідентифікатор facebook

Я сподіваюся, що це допоможе


Не впевнений, що це працює для всіх об’єктів графічного зображення. У деяких випадках для URL-адреси https://graph.facebook.com/XXXXX/picture?height=1024браузер завантажує зображення, а не відображає його. Будь-яка ідея чому?
loretoparisi

Я думаю, що це залежить від браузера, яким ви користуєтесь. Однак ви можете використовувати URL-адресу зображення facebook у будь-якому компоненті зображення вашого фреймворку (IOS, Android, HTTP Image ...)
Касас,

3
$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

це єдине, що справді працює:

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

де YOURTYPE може бути одним із наступних: маленький, звичайний, альбомний, великий, квадратний


2

Для Android:

Відповідно до останнього Facebook SDK,

Спочатку потрібно зателефонувати, 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();

1
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);

picture? type = large була тут єдиною відповіддю - дякую.
pedromillers

Це було "бог пошли". Я намагався знайти, як це зробити, цілими днями, тоді я знайшов відповідь тут. Дякую @TheDayIsDone
user801347


0

Хм ... я спробував все, щоб отримати url до зображення користувача. Ідеальним рішенням було використання fql, як це ->

    $fql_b = 'SELECT pic from user where uid = ' . $user_id;
    $ret_obj_b = $facebook->api(array(
                               'method' => 'fql.query',
                               'query' => $fql_b,
                             ));


             $dp_url =$ret_obj_b[0]['pic'];

замініть pic великим, pic_square, щоб отримати інші бажані результати. Сподіваюся, це допомогло ....


0
ImageView user_picture;
userpicture=(ImageView)findViewById(R.id.userpicture);
URL img_value = null;
img_value = new URL("http://graph.facebook.com/"+id+"/picture?type=large");
Bitmap mIcon1 = BitmapFactory.decodeStream(img_value.openConnection().getInputStream());
userpicture.setImageBitmap(mIcon1);

Де ідентифікатор - це ідентифікатор вашого профілю .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.