Я пытаюсь преобразовать URL изображения, предоставленный API Facebook, в формат base64 с помощью cURL.
API предоставляет URL как таковой:
https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xfp1/v/t1.0-9/p180x540/72099_736078480783_68792122_n.jpg?oh=f3698c5eed12c1f2503b147d221f39d1&oe=54C5BA4E&__gda__=1418090980_c7af12de6b0dd8abe752f801c1d61e0d
Проблема в том, что URL работает только с о, о и GDA параметры, включенные в строку URL, прямой ссылки img отсутствуют. Удаление параметров приводит вас к странице ошибки facebook.
С параметризованным URL мой curl_exec не получает правильные данные изображения. Есть ли способ получить данные base64 из Facebook или я могу что-то сделать, чтобы получить доступ к чистому URL-адресу изображения с помощью параметризованного URL-адреса?
Вот как выглядит мой скрипт декодирования:
header('Access-Control-Allow-Origin: *');
$url = $_GET['url'];
try {
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 3);
$result = curl_exec($c);
curl_close ($c);
if(false===$result) {
echo 'fail';
} else {
$base64 = "data:image/jpeg;charset=UTF-8;base64,".base64_encode($result);
echo $base64;
}
} catch ( \ErrorException $e ) {
echo 'fail';
}
Чтобы решить вашу конкретную проблему, ваш сценарий, скорее всего, не работает, потому что необходимый oh
, oe
, __gda__
параметры разделяются во время запроса GET и поэтому не включаются в $_GET['url']
,
Убедитесь, что вы используете строку в кодировке URL, поэтому любой кодированный &
символы не обрабатываются как разделители. Затем просто декодируйте строку, прежде чем передать ее в cURL.
...
$url = urldecode($_GET['url']);
...
Для всех, кто интересуется, вы все равно можете загрузить любое изображение Facebook с любого из их устаревших CDN, не используя новые параметры:
https://scontent-a-iad.xx.fbcdn.net/hphotos-frc3/
https://scontent-b-iad.xx.fbcdn.net/hphotos-frc3/
https://scontent-c-iad.xx.fbcdn.net/hphotos-frc3/
Просто добавьте оригинальное имя файла изображения в URL и вуаля.
Отказ от ответственности: я понятия не имею, как долго будет работать этот маленький трюк, поэтому не используйте его для чего-то важного в производстве.
Может быть, это не очень поможет, но кажется, что оригинальная картина (заканчивается _o
) не требуется GDA ни о, о, о параметры
чтобы получить оригинальное изображение профиля вы можете сделать:
var username_or_id = "name.lastname" //Example
get_url ("http://graph.facebook.com/$username_or_id/picture?width=9999")
НТН
У меня была похожая проблема. Мое решение:
$url = urldecode($url);
return base64_encode(file_get_contents($url));
Где находится URL к Graph API:
https://graph.facebook.com/$user_id/picture?width=160
(Вы, вероятно, хотите также проверить, возвращает ли file_get_contents что-то)
Вам просто нужно добавить CURLOPT_SSL_VERIFYPEER установлен в ложный как URL от facebook это https, а не http., или вы также можете запросить URL без ssl, заменив https на http.
Попробуйте код ниже
$url = 'https://fbcdn-sphotos-g-a.akamaihd.net/hphotos-ak-xfp1/v/t1.0-9/p180x540/72099_736078480783_68792122_n.jpg?oh=f3698c5eed12c1f2503b147d221f39d1&oe=54C5BA4E&__gda__=1418090980_c7af12de6b0dd8abe752f801c1d61e0d';
try {
$c = curl_init($url);
curl_setopt($c, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($c, CURLOPT_CONNECTTIMEOUT, 3);
/***********************************************/
// you need the curl ssl_opt_verifypeer
curl_setopt($c, CURLOPT_SSL_VERIFYPEER, false);
/***********************************************/
$result = curl_exec($c);
curl_close ($c);
if(false===$result) {
echo 'fail';
} else {
$base64 = '<img alt="Embedded Image" src="data:image/jpeg;charset=UTF-8;base64,'.base64_encode($result).'"/>';
echo $base64;
}
}
catch ( \ErrorException $e ) {
echo 'fail';
}