经过两天的研究,我无法找到问题/问题的答案/解决方案。所以,我在这里。请原谅,如果它已经发布在某个地方,我会很感激这个链接。所以......
我有一个应用程序,可以根据主题标签获取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 = /
感谢很多!
答案 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);
?>