Curl,file_get_contents和Instagram的CDN

时间:2015-09-18 18:25:18

标签: php curl instagram file-get-contents remote-server

经过两天的研究,我无法找到问题/问题的答案/解决方案。所以,我在这里。请原谅,如果它已经发布在某个地方,我会很感激这个链接。所以......

我有一个应用程序,可以根据主题标签获取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"));

同样的事情发生在两个网址上,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.com 并且不适用于 scontent.cdninstagram.com

我知道必须在scontent服务器中禁用通过php获取图像,但如果是这样,我怎么能获得这些图像?

我尝试使用users / userid / media_id验证并列出用户的图像并提供访问令牌,这样我就可以获得amazonaws网址了但是我还是得到了scontent.cdninstagram imageurls = /

感谢很多!

3 个答案:

答案 0 :(得分:1)

问题出在我服务器的防火墙配置上。一旦网络管理员在443(SSL端口)上打开出站流量,上面的所有示例都可以完成。

感谢您的支持,希望它可以帮助人们面对同样的问题。

答案 1 :(得分: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”可以让人们再次正确地观看图像。因此,作为快速入侵和临时解决方案,我认为您可以更换子域并试试运气。

答案 2 :(得分: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);

    ?>