2010-07-27 7 views
71

Facebook Graph API sagt mir bekommen kann ichdie „echte“ Facebook Profilbild URL von Graph API

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

mit einem Profilbild eines Benutzers erhalten, der gut arbeitet. Wenn Sie jedoch über URL in einen Browser eingeben, die tatsächliche Adresse des Bildes ist

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

Wie kann ich die zweite URL unter Verwendung des ersten programm bekommen?

+5

Warum brauchen Sie die „echten“ one – dockeryZ

+2

auf diese Weise ich die URL speichern und nennen es direkt auf die API-Anfrage, ohne? – ericbae

+1

können Sie es immer noch direkt anrufen. es funktioniert immer noch – ufk

Antwort

67

Die erste URL gibt eine HTTP 302 (temporäre Weiterleitung) an die zweite. Um also die zweite URL programmatisch zu finden, könnten Sie eine HTTP-Anfrage für die erste URL ausgeben und den Header Location der Antwort erhalten.

Das gesagt, verlassen Sie sich nicht auf die zweite URL pemanent. Ein wenig in den HTTP-Response-Code (von 302 im Gegensatz zu einer permanenten 301) einlesen, ist es möglich, dass Facebook diese URLs regelmäßig ändert, um Leute von — zum Beispiel — zu verhindern, die ihre Server verwenden, um Bilder zu hosten.


Edit: Beachten Sie, dass die CDN URL der entsandte OP ist jetzt ein 404, so dass wir wissen, dass wir nicht auf der URL verlassen können langlebige zu sein. Auch, wenn Sie auf die Grafik-API von einem <img> auf einer SSL-gesicherten Seite verbindet, there's a parameter Sie müssen hinzufügen stellen Sie sicher, https://graph.facebook.com verwenden.


Update: Die API hat added a parameterredirect=false – die JSON verursacht eher als eine Umleitung zurückgeführt werden. Die retruned JSON umfasst die CDN URL:

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

Auch hier würde ich nicht auf dieser CDN URL langlebig sein verlassen. Die JSON-Antwort wird mit permissiven CORS-Headern gesendet, sodass Sie diese Clientseite mit XHR-Anforderungen ausführen können.

+2

macht Sinn. das habe ich erwartet. Danke für die Antwort! – ericbae

+1

Macht es Sinn, cdn-URLs vom Server herunter zu schicken, wenn Sie eine Game-Leader-Karte erstellen und nur ein Benutzerprofilbild und nicht ihre Benutzer-ID offenlegen wollen? Ich sage nicht, zählen Sie auf dem CDN, sondern nur die Call-Server-Seite, um fbID Details vom Client zu verbergen. –

3
$url = 'http://graph.facebook.com/100000771470028/picture?type=large'; 
$rray=get_headers($url); 
$hd = $rray[4]; 
echo(substr($hd,strpos($hd,'http'))); 

Dies wird die URL zurück, die Sie gefragt, und das Problem der URL von Facebook ändern spielt keine Rolle, weil Sie dynamisch die fordern URL von der ursprünglichen URL.

0

Hmm..i alles versucht URL Benutzer Bildes.Verfahren perfekte Lösung zu erhalten war wie this- FQL verwenden>

$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']; 

ersetzen pic von großen, pic_square andere gewünschte Ergebnisse zu erzielen. Hoffe, es half ....

+1

Warum nicht einfach 'https://graph.facebook.com/ [USER_ID]? Fields = picture'? – Igy

15

Ich weiß, das spät ist, aber es ist ein weiterer Weg, um die URL des Profilbild zu erhalten.

Zu Ihrer ursprünglichen URL können Sie den Parameter redirect=false hinzufügen, um die tatsächliche URL des Bildes zu erhalten, an das Sie normalerweise weitergeleitet werden.

So würde die neue Anfrage wie http://graph.facebook.com/517267866/picture?type=large&redirect=false aussehen. Dadurch wird ein JSON-Objekt zurückgegeben, das die URL des Bildes und eine boolesche is_silhouette enthält (true, wenn das Bild das Standard-Facebook-Bild ist).

Das Bild hat die von Ihnen angegebene Größe. Sie können dies testen zusätzlich durch Zugabe von Dimensionen: http://graph.facebook.com/517267866/picture?type=large&redirect=false&width=400&height=400

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); 
+0

Bild? Typ = groß war die einzige Antwort, die ich hier brauchte - danke. – pedromillers

+0

Das war 'Gott senden'. Ich habe tagelang versucht, das zu finden, und dann habe ich die Antwort hier gefunden. Danke @TheDayIsDone – user801347

7

Für alle anderen suchen das Profil pic in iOS zu erhalten:

ich dies nur habe die Benutzerfacebook pic zu bekommen:

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

wobei 'fbUserID' die Profil-ID des Facebook-Benutzers ist.

So kann ich immer nur die URL in ProfilPicURL aufrufen, um das Bild zu bekommen, und ich bekomme es immer, kein Problem. Wenn Sie bereits die Benutzer-ID haben, brauchen Sie keine API-Anfragen, stecken Sie die ID einfach nach facebook.com/ in die URL.

FYI an alle, die das fbUserID in iOS benötigt:

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

Sie werden eine aktive FBSession müssen für die (Facebook-docs und das "Scrumptious" Beispiel) arbeiten.

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

Wo ID ein Ihre Profil-ID ist.

2

das ist das einzige, das wirklich funktioniert:

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

wo Yourtype eine der folgenden sein kann: klein, normal, Album, große, quadratische

2

Für Android:

Nach aktuellem Facebook SDK,

Zuerst müssen Sie GraphRequest API anrufen, um alle Details des Benutzers zu erhalten, in dem API auch URL of current Profile Picture gibt.

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