Получение" реального " URL-адреса профиля Facebook из graph API
Facebook graph API говорит мне, что я могу получить фотографию профиля пользователя с помощью
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 ответов:
первый URL-адрес дает HTTP 302 (временное перенаправление) на второй. Таким образом, чтобы найти второй URL программно, вы можете выдать HTTP-запрос для первого URL и получить
Location
заголовок ответа.тем не менее, не полагайтесь на второй URL-адрес, являющийся pemanent. Читая немного в код ответа HTTP (302 в отличие от постоянного 301), возможно, Facebook изменяет эти URL-адреса на регулярной основе, чтобы люди не могли, например, использовать свои серверы для хост изображений.
Edit: обратите внимание, что URL CDN, опубликованный OP, теперь является 404, поэтому мы знаем, что мы не можем полагаться на то, что URL-адрес долговечен. Кроме того, если вы ссылаетесь на API Graph из
<img>
на защищенной SSL странице,есть параметр вы должны добавитьубедитесь, что вы используетеhttps://graph.facebook.com
.
обновление: API имеет добавлен параметр -
redirect=false
- что заставляет JSON быть возвращается, а не перенаправление. В retruned в JSON включает в себя URL-адрес CDN:{ "data": { "url": "http://profile.ak.fbcdn.net/...", "is_silhouette": false } }
опять же, я бы не стал полагаться на то, что этот URL-адрес CDN является долгоживущим. Ответ JSON отправляется с разрешительными заголовками CORS, поэтому вы можете сделать это на стороне клиента с запросами XHR.
http://graph.facebook.com/517267866/?fields=picture&type=large
вернет URL в JSON
Я понимаю, что это поздно, но есть еще один способ получить 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
для тех, кто хочет получить фотографию профиля в iOS:
Я просто сделал это, чтобы получить Facebook pic пользователя:
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; } }]; }
для этого вам понадобится активная FBSession (см. документы Facebook и пример" восхитительный").
Если вы хотите JSON хорошего качества изображения профиля с URL вы можете использовать это:
http://graph.facebook.com/517267866/picture?height=1024&redirect=false
Если вам просто нужно изображение использовать его без параметра redirect:
http://graph.facebook.com/517267866/picture?height=1024
517267866 - это идентификатор профиля одного из приведенных выше примеров. Поместите идентификатор facebook, который вы нужно
Я надеюсь, что это поможет
$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-адреса.
это единственный, который действительно работает:
me?fields=picture.type(*YOURTYPE*)
здесь YOURTYPE может быть одним из следующих: маленький, нормальный, альбом, большой, квадратный
Для 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();
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);
теперь Facebook нужен SSL
-> важно добавил S, https -> https://graph.facebook.com/userId/?fields=picture&type=large
Работает В Июне / 2014
Мда..я пробовал все, чтобы получить 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 на big, pic_square, чтобы получить другие желаемые результаты. Надеюсь, это помогло....
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);
где ID-один ваш профиль.