Abrufen der „echten“ Facebook-Profilbild-URL von der Grafik-API

74

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

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

das funktioniert gut. Wenn Sie jedoch die obige 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 über die erste URL abrufen?

ericbae
quelle
5
Warum brauchen Sie die „echten“ one
dockeryZ
2
Auf diese Weise kann ich die URL speichern und direkt aufrufen, ohne die API-Anfrage zu stellen.
Ericbae
1
Sie können es immer noch direkt anrufen. es wird immer noch funktionieren
ufk
@ufk, aber beide geben unterschiedliche Ergebnisse, wenn der Benutzer sein Bild ändert.
Rana Deep
Mir ist klar, dass es 10 Jahre später ist (wie erstaunlich ist Stackoverflow?), Aber diese URL gibt das Titelbild zurück, nicht das Profilbild des Benutzers.
Marcello Romani

Antworten:

72

Die erste URL gibt eine HTTP 302 (temporäre Umleitung) an die zweite weiter. Um die zweite URL programmgesteuert zu finden, können Sie eine HTTP-Anforderung für die erste URL ausgeben und den LocationHeader der Antwort abrufen.

Verlassen Sie sich jedoch nicht darauf, dass die zweite URL dauerhaft ist. Wenn Sie den HTTP-Antwortcode ein wenig lesen (von 302 im Gegensatz zu einem permanenten 301), ist es möglich, dass Facebook diese URLs regelmäßig ändert, um zu verhindern, dass Benutzer beispielsweise ihre Server zum Hosten von Bildern verwenden.


Bearbeiten: Beachten Sie, dass die vom OP veröffentlichte CDN-URL jetzt 404 ist. Wir wissen also, dass wir uns nicht darauf verlassen können, dass die URL langlebig ist. Wenn Sie <img>auf einer SSL-gesicherten Seite eine Verknüpfung zur Graph-API herstellen , müssen Sie einen Parameter hinzufügen, um sicherzustellen, dass Sie ihn verwenden .https://graph.facebook.com


Update: Die API hat einen Parameter - redirect=false- hinzugefügt, der bewirkt, dass JSON anstelle einer Umleitung zurückgegeben wird. Der neu abgestimmte 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 clientseitige Ausführung mit XHR-Anforderungen durchführen können.

josh3736
quelle
2
macht Sinn. das habe ich erwartet. Danke für die Antwort!
Ericbae
1
Ist es sinnvoll, CDN-URLs vom Server herunterzusenden, wenn Sie eine Rangliste für Spiele erstellen und nur ein Benutzerprofilbild und nicht dessen Benutzer-ID anzeigen möchten? Ich sage nicht, dass Sie auf dem CDN zählen sollen, sondern dass der Anrufserver nur die fbID-Details vor dem Client verbirgt.
Russell Asher
Wie vermeide ich das Herunterladen von Bilddateien? Es scheint, dass die Bild-URL bei der Rückgabe von 200 vom Browser heruntergeladen wird, anstatt angezeigt zu werden. Vielleicht, weil die Antwortheader content-disposition: attachmentund sind content-type: image/jpeg.
Loretoparisi
36

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

Würde die URL in JSON zurückgeben

Adfsd
quelle
2
Gibt die URL des kleinen Bildes zurück.
Vaiden
7
Ditto - dies gibt das kleine Bild zurück
Schrägstrich, was auch immer
23
Wenn Sie es wirklich auf diese Weise abrufen
andi
1
@andi Sie sollten dies als separate Antwort aufschreiben: Die spezifische Syntax 'fields = picture.type (large)' war für mich die einzige Lösung, um eine URL zu einem großen Profilbild als JSON-Antwort von Facebook zu erhalten.
Visionscaper
<page_or_user_id> / picture? type = large oder <page_or_user_id>? fields = picture.type (large) funktionieren beide für mich ... aber das zurückgegebene Bild unterscheidet sich vollständig von dem Profilbild, das ich sehe, wenn ich die Seite tatsächlich besuche.
Phpguru
16

Mir ist klar, dass dies zu spät ist, aber es gibt noch eine andere Möglichkeit, die URL des Profilbilds abzurufen.

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

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

Das Bild hat ebenfalls 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

Joanna
quelle
7

Für alle anderen, die das Profilbild in iOS erhalten 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 nur die URL in profilePicURL aufrufen, um das Bild zu erhalten, und ich bekomme es immer, kein Problem. Wenn Sie die Benutzer-ID bereits haben, benötigen Sie keine API-Anforderungen. Stecken Sie die ID einfach in die URL nach facebook.com/.

Zu Ihrer Information an alle, die die fbUserID in iOS benötigen:

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

Damit dies funktioniert, benötigen Sie eine aktive FBSession (siehe Facebook-Dokumente und das Beispiel "Scrumptious").

Fateh Khalsa
quelle
6

Wenn Sie den 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 obigen Beispiele. Geben Sie die Facebook-ID ein, die Sie benötigen

Ich hoffe das hilft

Kasas
quelle
Ich bin mir nicht sicher, ob dies für alle Grafikbildobjekte funktioniert. In einigen Fällen https://graph.facebook.com/XXXXX/picture?height=1024lädt der Browser für die URL das Bild herunter, anstatt es anzuzeigen. Irgendeine Idee warum?
Loretoparisi
Ich denke, das hängt von dem Browser ab, den Sie verwenden. Sie können jedoch die Facebook-Bild-URL in jeder Bildkomponente Ihres Frameworks (IOS, Android, HTTP-Bild ...) verwenden
Kasas
3
$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, die URL über Facebook zu ändern, spielt keine Rolle, da Sie die URL dynamisch von der ursprünglichen URL aufrufen.

KAS
quelle
2

Dies ist die einzige, die wirklich funktioniert:

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

wo Yourtype klein, normal, Album, groß, quadratisch: kann einer der folgenden sein

Fabio Napodano
quelle
2

Für Android:

Laut aktuellem Facebook SDK,

Zuerst müssen Sie anrufen GraphRequest API, um alle Details des Benutzers zu erhalten, in dem APIauch angegeben ist 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();
Rajesh
quelle
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);
TheDayIsDone
quelle
Bild? Typ = groß war die einzige Antwort, die ich hier brauchte - danke.
Pedromiller
Dies war 'Gott senden'. Ich habe tagelang versucht, dies zu tun, dann habe ich hier die Antwort gefunden. Danke @TheDayIsDone
user801347
0

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 erzielen. Hoffe, es hat geholfen ...

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

Wobei ID eine Ihrer Profil-IDs ist .

madhu527
quelle