2014-09-23 46 views
2

我試圖將cURL轉換成facebook api提供的圖像URL爲base64格式。如何base64編碼從Facebook的圖像api

的API提供了一個網址爲這樣:

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字符串的哦,OE和GDA參數工作,沒有直接的圖像網址。刪除參數會將您發送到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'; 
} 
+0

它似乎最有可能你的curl命令ISN」實際上擊中正確的URL(即所有的參數) - 你有沒有排除? – Igy 2014-09-23 19:03:27

回答

-2

你只需要到CURLOPT_SSL_VERIFYPEER集作爲URL從Facebook添加到是HTTPS,而非HTTP。,或者你也可以通過用http替換https來請求沒有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'; 
} 
+0

如果這已回答了您的問題,請接受此答案 – CodeWriter 2014-09-29 11:45:03

+0

'CURLOPT_SSL_VERIFYPEER'與此無關。該選項的[purpose](http://curl.haxx.se/libcurl/c/CURLOPT_SSL_VERIFYPEER.html)將繞過服務器SSL證書的驗證。考慮到Akamai未在任何可公開訪問的CDN上使用自簽名證書,因此無論您是否驗證它都無關緊要。 – 2014-10-09 06:05:59

+0

「有沒有辦法從facebook獲取base64數據」,CURLOPT_SSL_VERIFYPEER解決了這個問題,該選項能夠解決問題,請閱讀 – CodeWriter 2014-10-18 06:49:42

0

代碼要滿足您的特定問題,你的腳本很可能失敗,因爲所需的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

聲明:我不知道這個小竅門能用多久,所以不要在生產中使用任何重要的東西。

0

也許這將幫助不大,但它似乎是原來的圖片(帶_o結束)不需要GDA也不OE哦參數

以獲得原始資料圖片,你可以這樣做:

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是圖形API:

https://graph.facebook.com/$user_id/picture?width=160 

(你可能還需要檢查,如果的file_get_contents返回的東西)