Получите реальный профиль изображения в Facebook

Согласно графическому API Facebook, мы можем запросить изображение профиля пользователя с этим (примером):

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

Нам не нужен токен, так как это общедоступная информация.

Но реальный URL изображения предыдущей ссылки: http://img.ruphp.com/php/41721_1489686594_527_q.jpg

Если вы наберете первую ссылку в своем браузере, она перенаправит вас ко второй ссылке.

Есть ли способ получить полный URL (вторая ссылка) с PHP, зная только первую ссылку?

У меня есть функция, которая получает изображение из URL-адреса, чтобы сохранить его в базе данных, но он работает, только если он получает полный URL-адрес изображения.

благодаря

kire является правильным, но лучшим решением для вашего случая использования будет следующее:

// 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! 

Вы можете получить его с помощью FQL:

 select pic_square from user where uid=1489686594 

возвращает:

 [ { "pic_square": "http://img.ruphp.com/php/41721_1489686594_527_q.jpg" } ] 

Также вы можете просто улучшить свою функцию, которая получает изображение по URL-адресу. Если вы используете завиток, он может автоматически следовать заголовкам переадресации.

Обратите внимание, что ответ The Surrican (и, возможно, другие) может значительно увеличить время отклика вашего сценария (около 500 мс для меня на моем сервере). Это связано с тем, что сервер выдает запрос на facebook (из-за get_headers() ), и время выполнения (исключение вычислений) распространяется на это:

  • браузер -> сервер
  • сервер -> браузер

к этому:

  • браузер -> сервер
  • сервер -> facebook (запрос: get_headers)
  • facebook -> сервер (ответ: get_headers)
  • сервер -> браузер

Это добавляет упомянутую задержку в 500 мс. Вероятно, вам следует рассмотреть возможность кэширования реального URL-адреса вашего сервера или загрузки изображения профиля через JavaScript. По крайней мере, взгляните на свое время ответа до и после;)

@ Surrican,
Хороший код! Вот как это делается для кода!

 function get_raw_facebook_avatar_url($uid) { $array = get_headers('https://graph.facebook.com/'.$uid.'/picture?type=large', 1); return (isset($array['Location']) ? $array['Location'] : FALSE); } 

Это вернет URL изображения аватара в формате RAW. Не стесняйтесь делать то, что вы хотите с этим!

Вы также можете добавить ?redirect=false в конец вашего URL-адреса, а затем разобрать ответ JSON напрямую.

В вашем примере: https://graph.facebook.com/1489686594/picture?redirect=false

Дополнительная информация здесь https://developers.facebook.com/docs/graph-api/reference/user/picture/