我正在尝试获取instagram帖子的json。提取数据的网址:
$url = "https://www.instagram.com/p/" . $_GET['media'] . "/?__a=1";
当我在浏览器中获得此 url时-一切正常,json返回。顺便说一句浏览器未登录instagram。但是,当我使用curl或file_get_contents($url);
时,它会将带有标头“位置”的http代码302返回登录页面。
代码示例:
$url = "https://www.instagram.com/p/" . $_GET['media'] . "/?__a=1";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/json') );
$data = curl_exec($ch);
curl_close($ch);
var_dump($data);
也许可以修改curl选项,使其看起来像浏览器。
我尝试过与浏览器中的标头相同,包括cookie,但是没有运气,这似乎是不可能的。我已经使用此hack编写了页面,但最近无法正常工作。使用API意味着重写所有内容,因为响应数据有所不同。
答案 0 :(得分:3)
原因很简单,您试图访问受身份验证保护的Web资源(这应该是显而易见的)或通过检测非标准行为来保护的。您的curl请求失败的原因是因为它缺少Cookie标头或将您识别为人类所需的某种形式的其他标头。通常,它是cookie,用于标识您和您的身份验证会话是否受服务器信任。在某个时候,您很可能已经使用浏览器登录了,这就是该请求在浏览器中起作用的原因-但curl / php逻辑不起作用,或者您缺少了User-Agent
这样的标头,这些标头掩盖了curl的使用
这是一个将我识别为我的cookie字符串的示例。没有它,我将无法在浏览器中执行这些请求。因此,只要服务器发送
Set-Cookie: ...
,浏览器就会接受它并保存它,跟踪并在每次请求时发送它。
要么从浏览器会话中借用cookie,然后将其临时实现到curl请求中,要么在发送curl请求之前实现登录逻辑。但是您应该做正确的事情,并开始使用Magnus Eriksson在评论中指出的Instagram API。
推荐使用后者,并且有一些旧的库。但是也许他们会让您知道如何执行此操作。
以use MetzWeb\Instagram\Instagram;
$instagram = new Instagram(array(
'apiKey' => 'YOUR_APP_KEY',
'apiSecret' => 'YOUR_APP_SECRET',
'apiCallback' => 'YOUR_APP_CALLBACK'
));
echo "<a href='{$instagram->getLoginUrl()}'>Login with Instagram</a>";
如果您想知道“ API到底是什么”,请here's (Tom Scott - This Video Has X Views)一段视频,很好地解释一下,为什么假装自己不是一个好主意-而是使用API。