如何对来自 facebook api 的图像进行 base64 编码
Posted
技术标签:
【中文标题】如何对来自 facebook api 的图像进行 base64 编码【英文标题】:How to base64 encode an image from the facebook api 【发布时间】:2014-11-18 01:55:40 【问题描述】:我正在尝试使用 cURL 将 facebook api 提供的图像 url 转换为 base64 格式。
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只能与url字符串中包含的oh、oe和gda参数一起使用,没有直接的img url。删除参数会将您带到 facebook 错误页面。
使用参数化的 url,我的 curl_exec 没有得到正确的图像数据。有没有办法从 facebook 获取 base64 数据,或者我可以做些什么来访问给定参数化 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';
【问题讨论】:
您的 curl 命令很可能实际上并没有访问正确的 URL(即使用所有参数)——您排除了吗? 【参考方案1】:我有类似的问题。我的解决方案:
$url = urldecode($url);
return base64_encode(file_get_contents($url));
Graph API 的 URL:
https://graph.facebook.com/$user_id/picture?width=160
(你可能还想检查一下,如果 file_get_contents 返回了一些东西)
【讨论】:
【参考方案2】:也许这不会有太大帮助,但似乎原始图片(以_o
结尾)不需要gda也不需要oe oh参数
要获取原始个人资料图片,您可以这样做:
var username_or_id = "name.lastname" //Example
get_url ("http://graph.facebook.com/$username_or_id/picture?width=9999")
第
【讨论】:
【参考方案3】:为了解决您的具体问题,您的脚本可能会失败,因为所需的 oh
、oe
、__gda__
参数在 GET 请求期间被分开,因此未包含在 $_GET['url']
中。
确保您使用的是 URL 编码字符串,因此任何未编码的 &
字符都不会作为分隔符处理。然后在将字符串传递给 cURL 之前对字符串进行解码。
...
$url = urldecode($_GET['url']);
...
对于任何好奇的人,您仍然可以从他们的任何一个旧 CDN 加载任何 Facebook 图片,而无需新参数:
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。
免责声明:我不知道这个小技巧能持续多久,所以不要将它用于生产中的任何重要内容。
【讨论】:
【参考方案4】:您只需要添加 CURLOPT_SSL_VERIFYPEER 设置为 false 因为来自 facebook 的网址是 https 而不是 http。,或者您可以只是以及通过将 https 替换为 http 来请求不带 ssl 的 url。
试试下面的代码
$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 src="data:image/jpeg;charset=UTF-8;base64,'.base64_encode($result).'"/>';
echo $base64;
catch ( \ErrorException $e )
echo 'fail';
【讨论】:
如果这回答了你的问题,请接受这个答案CURLOPT_SSL_VERIFYPEER
与此无关。该选项的purpose 是绕过服务器 SSL 证书的验证。考虑到 Akamai 没有在其任何可公开访问的 CDN 上使用自签名证书,您是否验证它并不重要。
“有没有办法从 facebook 获取 base64 数据”,CURLOPT_SSL_VERIFYPEER 解决了问题,该选项可以解决问题,请阅读问题
这甚至没有意义。尝试设置任何一种方式的代码,您会发现它没有任何效果。
在对如何解决问题做出假设之前,我尝试了所有代码,我认为 stackoveflow 的人有编程经验,而不是一些新手左右给出意见......以上是关于如何对来自 facebook api 的图像进行 base64 编码的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Facebook 登录 API 对 XMPP 用户进行身份验证?
将 ios 或 Android 应用程序中的图像设置为 Facebook 个人资料图片(使用 Facebook API)[重复]