2015-09-18 47 views
1

經過兩天的研究,我沒有設法找到我的問題/問題的答案/解決方案。所以,我在這裏。對不起,如果它已經發布到某個地方,我會很感激鏈接。所以...Curl,file_get_contents和Instagram的CDN

我有一個應用程序,根據標籤獲取instagram內容/圖像。我需要將選擇的圖像從instagram cdn(imageurl)複製到我的服務器。

用來工作順利直到最近應用程序...問題在於內:

$img = "https://scontent.cdninstagram.com/hphotos-xaf1/t51.2885-15/s320x320/e35/11848968_1650345541876481_204433741_n.jpg" 
imagecreatefromjpeg($img); 

錯誤輸出是:未能打開流 - SSL連接超時

如果是使用 「http://distillery.s3.amazonaws.com/media/2010/07/16/4de37e03aa4b4372843a7eb33fa41cad_7.jpg 「作爲網址,沒有問題。

我也嘗試過其他解決方案,如使用curl:

function getSSLPage($url) { 
$ch = curl_init(); 
curl_setopt ($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1"); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 20); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // tried true/false 
curl_setopt($c, CURLOPT_SSL_VERIFYHOST, false); // tried true/false 
//curl_setopt($ch, CURLOPT_SSLVERSION,1); tried 1,2,3 

$retorno['arquivo'] = curl_exec($ch); 
$retorno['status'] = curl_getinfo($ch); 
$retorno['error'] = curl_error($ch); 

curl_close($ch); 
return $retorno; 
} 
var_dump(getSSLPage("https://scontent.cdninstagram.com/hphotos-xaf1/t51.2885-15/e35/11950482_1505223163123401_2062846740_n.jpg")); 

同樣的事情發生有兩個URL,scontent.cdinstragram回報未能打開流和亞馬遜網址工作正常。

另一種方法我試過:

function img_create($filename, $mime_type) 
{ 
    $content = file_get_contents($filename); 
    $base64 = base64_encode($content); 
    return ('data:' . $mime_type . ';base64,' . $base64); 
} 
?><img src="<?php print img_create('http://distillery.s3.amazonaws.com/media/2010/07/16/4de37e03aa4b4372843a7eb33fa41cad_7.jpg','jpeg'); ?>" alt="random logo" /> 

同樣的事情,適用於distillery.s3.amazonaws.comscontent.cdninstagram.com

我知道得到一個不工作通過php的圖像必須在服務器中禁用,但如果是這樣,我怎麼可能獲得這些圖像?

我試過認證和與用戶/用戶名/ media_id列出用戶的圖像和令牌提供訪問,所以我會得到amazonaws網址,但仍然我得到scontent.cdninstagram imageurls =/

非常感謝!

+0

這更可能是您的服務器上的問題,而不是Instagram的問題。似乎有東西阻塞了傳出的SSL連接。你有可以與之通話的服務器管理員嗎? –

+0

你好,是的。我有根,但機器有一個網絡管理員,我可以交談。任何提示哪裏/要檢查這個?你有沒有嘗試過,它的工作原理? – marciop

+0

我真的沒有想法。第二個例子中的curl調用是否返回相同的錯誤? –

回答

0

我確實嘗試了下面的代碼,即使在我的本地主機上它也能正常工作。

<?php 
    $data = file_get_contents('https://scontent.cdninstagram.com/hphotos-xaf1/t51.2885-15/s320x320/e35/11848968_1650345541876481_204433741_n.jpg'); 
    file_put_contents('test.jpg', $data); 

這和瀏覽器爲獲取數據而發送的任何其他HTTP請求非常相似。所以我也認爲它應該是你的服務器阻止域名,或者更可能是Facebook/Instagram的cdn阻止你的服務器IP。

我做了一個快速搜索,看看最終用戶是否面臨類似的問題。在Facebook上遇到this thread

正如其中一位人士暗示的那樣,從「scontent」更改爲「scontent-a」或「scontent-b」可能會讓人們再次正確地查看圖像。因此,作爲一個快速入門和臨時解決方案,我認爲您可以替換子域並嘗試運氣。

+0

你好,謝謝你的提示,我試過沒有成功。仍然在等待網絡管理員關於出站ssl 443的答案。 – marciop

1

問題出在我服務器的防火牆配置上。一旦網絡管理員在443(SSL端口)上打開出站流量,上面的所有示例都運行perfeclty。

感謝您的支持,希望它可以幫助人們面對同樣的問題。

0

在instagram開發人員站點中編輯您的客戶端並啓用
非方形媒體複選框。我可以使用file_get_contents將圖像下載到我的本地。 請檢查以下代碼:

<?php 

$content = file_get_contents ('https://api.instagram.com/v1/users/' . $id . '/media/recent/?access_token=' . $token); 
$ins_media = json_decode ($content, true); 
$i = 0; 
set_time_limit (0); 

foreach ($ins_media ['data'] as $vm) : 

    if ($count == $i) { 
     break; 
    } 
    $i ++; 
    $img = $vm ['images'] ['low_resolution'] ['url']; 
    $link = $vm ["link"]; 

    $path_parts = pathinfo ($img); 
    $imagData= explode("?",$path_parts ['basename']); 
    $content = file_get_contents($img); 

    file_put_contents("/xampp/htdocs/test/uploads/$imagData[0]",$content); 

    ?>