【问题标题】:How to base64 encode an image from the facebook api如何对来自 facebook api 的图像进行 base64 编码
【发布时间】: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(即使用所有参数)——您排除了吗?

标签: php facebook curl


【解决方案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】:

      为了解决您的具体问题,您的脚本可能会失败,因为所需的 ohoe__gda__ 参数在 GET 请求期间被分开,因此未包含在 $_GET['url'] 中。

      确保您使用的是 URL 编码字符串,因此任何未编码的 & 字符都不会作为分隔符处理。然后在将字符串传递给 cURL 之前对字符串进行解码。

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

      对于任何好奇的人,您仍然可以从他们的任何一个旧 CDN 加载任何 Facebook 图片,而无需新参数:

      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 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 alt="Embedded Image" 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 的人有编程经验,而不是一些新手左右给出意见......
        猜你喜欢
        • 2018-10-26
        • 2012-10-26
        • 1970-01-01
        • 2013-05-30
        • 1970-01-01
        • 1970-01-01
        • 2014-04-04
        • 2021-10-06
        • 2011-08-29
        相关资源
        最近更新 更多