2015-09-18 49 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); 

    ?>