Как Base64 кодировать изображение из API Facebook

Я пытаюсь преобразовать 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';
}

2

Решение

Чтобы решить вашу конкретную проблему, ваш сценарий, скорее всего, не работает, потому что необходимый oh, oe, __gda__ параметры разделяются во время запроса GET и поэтому не включаются в $_GET['url'],

Убедитесь, что вы используете строку в кодировке URL, поэтому любой кодированный & символы не обрабатываются как разделители. Затем просто декодируйте строку, прежде чем передать ее в cURL.

...

$url = urldecode($_GET['url']);

...

Для всех, кто интересуется, вы все равно можете загрузить любое изображение Facebook с любого из их устаревших CDN, не используя новые параметры:

  1. https://scontent-a-iad.xx.fbcdn.net/hphotos-frc3/
  2. https://scontent-b-iad.xx.fbcdn.net/hphotos-frc3/
  3. https://scontent-c-iad.xx.fbcdn.net/hphotos-frc3/

Просто добавьте оригинальное имя файла изображения в URL и вуаля.

Отказ от ответственности: я понятия не имею, как долго будет работать этот маленький трюк, поэтому не используйте его для чего-то важного в производстве.

0

Другие решения

Может быть, это не очень поможет, но кажется, что оригинальная картина (заканчивается _o) не требуется GDA ни о, о, о параметры

чтобы получить оригинальное изображение профиля вы можете сделать:

var username_or_id = "name.lastname" //Example
get_url ("http://graph.facebook.com/$username_or_id/picture?width=9999")

НТН

0

У меня была похожая проблема. Мое решение:

$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 что-то)

0

Вам просто нужно добавить 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';
}
-2
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector