Подтвердить что ты не робот

Получите реальный профиль изображения в 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-адрес изображения.

Спасибо

4b9b3361

Ответ 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/