2010-07-27 33 views
71

Facebook API gráfica me dice que puede obtener una imagen de perfil de un usuario que utilizaObtener la URL de imagen "real" perfil de Facebook de la API gráfica

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

que funciona muy bien. Sin embargo, cuando se escribe por encima de URL en un explorador, la dirección real de la imagen es

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

¿Cómo puedo obtener la segunda dirección URL con el primero mediante programación?

+5

¿Por qué necesita el "verdadero" uno – dockeryZ

+2

de esa manera puedo guardar la URL y llamar directamente sin hacer la solicitud de la API? – ericbae

+1

todavía puede llamarlo directamente. todavía funcionará – ufk

Respuesta

67

La primera URL da un HTTP 302 (redirección temporal) a la segunda. Entonces, para encontrar la segunda URL programáticamente, podría emitir una solicitud HTTP para la primera URL y obtener el encabezado Location de la respuesta.

Dicho esto, no confíe en que la segunda URL sea permanente. Leyendo un poco en el código de respuesta HTTP (de 302 frente a un 301 permanente), es posible que Facebook cambie esas URL de forma regular para evitar que personas de —, por ejemplo, — utilicen sus servidores para alojar imágenes.


Editar: en cuenta que la URL de CDN el PO publicado ahora es 404, por lo que sabemos que no podemos confiar en la URL de ser de larga duración. Además, si está enlazando a Graph API desde <img> en una página segura de SSL, there's a parameter tiene que agregar, asegúrese de usar https://graph.facebook.com.


Actualización: La API tiene added a parameterredirect=false – que causa JSON para ser devuelto en lugar de una redirección. El JSON retruned incluye la URL de CDN:

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

Una vez más, no me confiar en esta URL CDN ser vivido largo. La respuesta JSON se envía con encabezados permisibles CORS, por lo que puede hacer este lado del cliente con solicitudes XHR.

+2

tiene sentido. esto es lo que esperaba ¡Gracias por la respuesta! – ericbae

+1

¿Tiene sentido enviar urls cdn desde el servidor si está haciendo una tabla de clasificación de juegos y solo desea exponer una imagen de perfil de usuario, no su ID de usuario? No estoy diciendo que cuente con el CDN sino que simplemente haga que el lado del servidor de llamadas oculte los detalles de fbID del cliente. –

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

Esto devolverá la dirección URL que usted pidió, y el problema de cambiar la URL de Facebook no importa porque se está llamando dinámicamente el url de la url original.

0

Hmm..i intentó todo para conseguir url para solución perfecta image.The usuario fue FQL utilizar como this->

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

sustituir por pic grande, pic_square para obtener otros resultados deseados. Espero AYUDÓ ...

+1

¿Por qué no simplemente hacer 'https://graph.facebook.com/ [USER_ID]? Fields = picture'? – Igy

15

Me doy cuenta de que esto es tarde, pero hay otra manera de obtener la URL de la imagen del perfil.

A su URL original, puede agregar el parámetro redirect=false para obtener la URL real de la imagen a la que normalmente se le redirigiría.

Por lo tanto, la nueva solicitud se vería como http://graph.facebook.com/517267866/picture?type=large&redirect=false. Esto devolverá un objeto JSON que contiene la URL de la imagen y una booleana is_silhouette (verdadera si la imagen es la imagen predeterminada de Facebook).

La imagen será del tamaño que usted especificó, también. Esto se comprueba, además, por las dimensiones de la adición: 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

imagen? Type = large fue la única respuesta que necesitaba aquí - gracias. – pedromillers

+0

Esto fue 'enviado por dios'. Estuve tratando de encontrar cómo hacerlo durante días, luego encontré la respuesta aquí. Gracias @TheDayIsDone – user801347

7

Para una persona que quiere obtener la foto de perfil en iOS:

que acabo de hacer esto para conseguir del usuario de Facebook pic:

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

donde 'fbUserID' es el ID de perfil del usuario de Facebook.

De esta manera siempre puedo llamar a la url en profilePicURL para obtener la imagen, y siempre la entiendo, no hay problema. Si ya tiene la ID de usuario, no necesita ninguna solicitud de API, solo inserte la ID en la url después de facebook.com/.

su información a cualquier persona que busca que necesita la fbUserID en 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; 
     } 
    }]; 
} 

Tendrá un FBSession activo para que eso funcione (ver documentos de Facebook, y el ejemplo "deliciosos").

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

donde ID es una su ID de perfil.

2

este es el único que realmente funciona:

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

donde YOURTYPE puede ser uno de los siguientes: pequeña, normal, álbum, grande y cuadrada

2

Para Android:

Según el último SDK de Facebook,

Primero debe llamar al GraphRequest API para obtener todos los detalles del usuario en el que API también da 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(); 
Cuestiones relacionadas