it-swarm.com.de

Abrufen der "echten" Facebook-Profilbild-URL von der Diagramm-API

Die Facebook-Grafik-API sagt mir, dass ich ein Profilbild eines Benutzers erhalten kann

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

das funktioniert gut. Wenn Sie jedoch die oben angegebene URL in einen Browser eingeben, lautet die tatsächliche Adresse des Bildes

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

Wie kann ich die zweite URL programmgesteuert abrufen?

75
ericbae

Die erste URL gibt eine HTTP 302 (temporäre Weiterleitung) an die zweite. Um die zweite URL programmatisch zu finden, können Sie eine HTTP-Anforderung für die erste URL absetzen und den Location-Header der Antwort abrufen.

Verlassen Sie sich nicht darauf, dass die zweite URL pemanent ist. Ein wenig im HTTP-Antwortcode (von 302 im Gegensatz zu einem permanenten 301-Code) liest Facebook diese URLs regelmäßig, um zu verhindern, dass Personen ihre Server zum Hosten von Bildern verwenden.


Edit: Beachten Sie, dass die CDN-URL, die das OP veröffentlicht hat, jetzt eine 404 ist. Wir wissen also, dass wir uns nicht darauf verlassen können, dass die URL langlebig ist. Auch wenn Sie von einem <img> auf einer SSL-gesicherten Seite auf die Graph-API zugreifen, es gibt einen Parameter Sie müssen hinzufügen Stellen Sie sicher, dass Sie https://graph.facebook.com verwenden.


Update: Die API hat einen Parameter hinzugefügt - redirect=false -, der dazu führt, dass JSON anstelle einer Weiterleitung zurückgegeben wird. Der neu gestartete JSON enthält die CDN-URL:

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

Auch hier würde ich mich nicht darauf verlassen, dass diese CDN-URL langlebig ist. Die JSON-Antwort wird mit zulässigen CORS-Headern gesendet, sodass Sie diese Client-Seite mit XHR-Anforderungen ausführen können.

72
josh3736
36
Adfsd

Mir ist klar, dass dies zu spät ist, aber es gibt einen anderen Weg, um die URL des Profilbildes 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, zu dem Sie normalerweise umgeleitet wurden. 

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

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

16
joanna

Für alle anderen, die das Profilbild unter iOS abrufen möchten:

Ich habe dies nur getan, um das Facebook-Bild des Benutzers zu erhalten:

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

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

Auf diese Weise kann ich immer die URL in profilePicURL aufrufen, um das Bild zu erhalten. Ich bekomme es immer, kein Problem. Wenn Sie bereits über eine Benutzer-ID verfügen, benötigen Sie keine API-Anforderungen. Geben Sie die ID einfach unter facebook.com/ in die URL ein.

FYI für alle, die suchen, wer die 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;
         }
     }];
}

Dazu benötigen Sie eine aktive FBSession (siehe die Dokumente von Facebook und das Beispiel "Scrumptious").

7
Fateh Khalsa

Wenn Sie die JSON eines qualitativ hochwertigen Profilbilds mit der URL wünschen, können Sie Folgendes verwenden:

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

wenn Sie nur das Bild benötigen, verwenden Sie es ohne die Parameterumleitung:

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

517267866 ist die Profil-ID eines der oben genannten Beispiele. Fügen Sie die Facebook-ID ein, die Sie benötigen

Ich hoffe das hilft

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

Dadurch wird die von Ihnen angeforderte URL zurückgegeben, und das Problem der Änderung der URL durch Facebook spielt keine Rolle, da Sie die URL dynamisch von der ursprünglichen URL aufrufen.

3
KAS

dies ist der einzige, der wirklich funktioniert:

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

dabei kannIHRTYPeine der folgenden sein: small, normal, album, large, square

2
Fabio Napodano

Für Android:

Laut dem neuesten SDK von Facebook

Zuerst müssen Sie GraphRequest API aufrufen, um alle Benutzerdaten zu erhalten, in denen API auch URL of current Profile Picture enthält.

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
Rajesh

Nun braucht Facebook SSL 

-> Wichtig hinzugefügt S, https -> https://graph.facebook.com/userId/?fields=picture&type=large

Arbeitet im Juni/2014

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

Hmm ... Ich habe alles versucht, um die URL zum Benutzerbild zu bekommen. Die perfekte Lösung war die Verwendung von fql wie folgt->

    $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 Sie pic durch big, pic_square, um andere gewünschte Ergebnisse zu erhalten .. Hoffen Sie, dass es geholfen hat ....

0
Priyanshu
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 eine ist Ihre Profil-ID .

0
madhu sudhan