Получите реальный профиль изображения в Facebook
В соответствии с графическим API Facebook мы можем запросить изображение профиля пользователя с этим (примером):
https://graph.facebook.com/1489686594/picture
Нам не нужен токен, поскольку он является общедоступной информацией.
Но реальный URL изображения предыдущей ссылки: http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg
Если вы наберете первую ссылку в своем браузере, она перенаправит вас ко второй ссылке.
Есть ли способ получить полный URL (вторая ссылка) с PHP, только зная первую ссылку?
У меня есть функция, которая получает изображение из URL-адреса, чтобы сохранить его в базе данных, но оно работает, только если оно получает полный URL-адрес изображения.
Спасибо
Ответы
Ответ 1
Кир прав, но лучшим решением для вашего случая использования будет следующее:
// 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 a reason why facebok does it this way ;)
// the code is untested!
Ответ 2
Вы можете получить его с помощью FQL:
select pic_square from user where uid=1489686594
возвращает:
[
{
"pic_square": "http://profile.ak.fbcdn.net/hprofile-ak-snc4/hs356.snc4/41721_1489686594_527_q.jpg"
}
]
Также вы можете просто улучшить свою функцию, которая получает изображение по URL-адресу. Если вы используете curl, он может автоматически следовать заголовкам переадресации.
Ответ 3
Обратите внимание, что ответ Surrican (и, возможно, другие) может значительно увеличить время отклика script (около 500 мс для меня на моем сервере). Это связано с тем, что сервер выдает запрос на facebook (из-за get_headers()
), и время выполнения (исключение вычислений) распространяется на это:
- браузер → сервер
- сервер → браузер
:
- браузер → сервер
- сервер → facebook (запрос: get_headers)
- facebook → server (response: get_headers)
- сервер → браузер
Это добавляет упомянутую задержку в 500 мкс. Вероятно, вам следует рассмотреть возможность кэширования реального URL-адреса вашего сервера или загрузки изображения профиля через JavaScript. По крайней мере, посмотрите время ответа до и после;)
Ответ 4
@The 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. Не стесняйтесь делать то, что вы хотите с ним!
Ответ 5
Вы также можете добавить ?redirect=false
в конец вашего URL-адреса, а затем разобрать ответ JSON напрямую.
В вашем примере: https://graph.facebook.com/1489686594/picture?redirect=false
Подробнее здесь https://developers.facebook.com/docs/graph-api/reference/user/picture/