获取Instagram帖子的JSON

时间:2020-05-22 08:37:20

标签: php curl instagram-api

我正在尝试获取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​​意味着重写所有内容,因为响应数据有所不同。

1 个答案:

答案 0 :(得分:3)

原因很简单,您试图访问受身份验证保护的Web资源(这应该是显而易见的)或通过检测非标准行为来保护的。您的curl请求失败的原因是因为它缺少Cookie标头或将您识别为人类所需的某种形式的其他标头。通常,它是cookie,用于标识您和您的身份验证会话是否受服务器信任。在某个时候,您很可能已经使用浏览器登录了,这就是该请求在浏览器中起作用的原因-但curl / php逻辑不起作用,或者您缺少了User-Agent这样的标头,这些标头掩盖了curl的使用

enter image description here 这是一个将我识别为我的cookie字符串的示例。没有它,我将无法在浏览器中执行这些请求。因此,只要服务器发送Set-Cookie: ...,浏览器就会接受它并保存它,跟踪并在每次请求时发送它。

要么从浏览器会话中借用cookie,然后将其临时实现到curl请求中,要么在发送curl请求之前实现登录逻辑。但是您应该做正确的事情,并开始使用Magnus Eriksson在评论中指出的Instagram API

推荐使用后者,并且有一些旧的库。但是也许他们会让您知道如何执行此操作。

Instagram-PHP-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​​。