views:

172

answers:

2

Hello

According to Facebook graph API we can request a user profile picture with this (example):

https://graph.facebook.com/1489686594/picture

We don't need any Token since it's a public information.

But the real image URL of the previous link is: http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg

If you type the first link on your browser, it will redirect you to the second link.

Is there any way to get the full URL (second link) with PHP, by only knowing the first link?

I have a function that gets the image from a URL to store it in the database, but it does work only if it get the full image URL.

Thanks

A: 

You can get it with FQL:

select pic_square from user where uid=1489686594

returns:

[
  {
    "pic_square": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg"
  }
]

Also you can just improve your function that gets picture by url. If you use curl it can automatically follow redirect headers.

serg
I tried a similar solution but the Facebook "pic_square" propertie returns a 50px*50px, in my case I need a slighter bigger to not loose quality.I can only do it with the graph API by requesting this form: https://graph.facebook.com/xxxxxxxxx/picture?type=largeBut thanks a lot got a good solution now.
kire
@kire there are 4 different pictures available, pick whichever you need: http://developers.facebook.com/docs/reference/fql/user
serg
Oh yeah true didn't find that page!Now the question for me is to know if it's better just request the Graph API URL and get the real picture URL, or use the FQL.Maybe the first solution would be more simple for me since I can add it to my Facebook class and call it anytime needed without need any Javascript or so over. You guys are really good in what you do :)
kire
Oh sorry I could get the same results by querying that page: https://api.facebook.com/method/fql.query?query=SELECT pic_big FROM user WHERE uid = 1489686594humm looks simpler...
kire
A: 

kire is right, but a better solution for your use case would be the following:

    // get the headers from the source without downloading anything
    // there will be a location header wich redirects to the actual url
    // you may want to put some error handling here in case the connection cant be established etc...
    // the second parameter gives us an assoziative array and not jut a sequential list so we can right away extract the location header
    $headers = get_headers('https://graph.facebook.com/1489686594/picture',1);
    // just a precaution, check whether the header isset...
    if(isset($headers['Location'])) {
        $url = $headers['Location']; // string
    } else {
        $url = false; // nothing there? .. weird, but okay!
    }
    // $url contains now the url of the profile picture, but be careful it might very well be only temporary! there's a reason why facebok does it this way ;)
    // the code is untested!
Joe Hopfgartner