Я пытаюсь преобразовать URL-адрес изображения, предоставленный facebook api, в формат base64 с помощью cURL.
api предоставляет URL-адрес как таковой:
http://img.ruphp.com/php/72099_736078480783_68792122_n.jpg?oh=f3698c5eed12c1f2503b147d221f39d1&oe=54C5BA4E&__gda__=1418090980_c7af12de6b0dd8abe752f801c1d61e0d
Проблема в том, что URL-адрес работает только с параметрами oh, oe и gda, включенными в строку url, нет прямого 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 et voila .
Отказ от ответственности: я понятия не имею, как долго этот небольшой трюк будет работать, поэтому не используйте его ни на что важное в производстве.
Возможно, это не поможет, но кажется, что исходная картина (заканчивающаяся на _o
) не нуждается в параметрах gda или oe oh
чтобы получить исходное изображение профиля, которое вы можете сделать:
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 в значение false, поскольку URL-адрес из facebook равен https, а не http. , или вы можете просто запросить url без ssl, заменив https на http.
Попробуйте код ниже
$url = 'http://img.ruphp.com/php/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'; }