获取 Instagram 帖子的 JSON

Leo*_*Mew 2 php curl instagram-api

我正在尝试获取 Instagram 帖子的 json。获取数据的网址:

$url = "https://www.instagram.com/p/" . $_GET['media'] . "/?__a=1";
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中得到这个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);
Run Code Online (Sandbox Code Playgroud)

也许应该修改 curl 选项以使其看起来像浏览器。

更新

我尝试了与浏览器中相同的标题,包括 cookie,但没有运气,这似乎是不可能的。我已经使用这个 hack 编写了页面,最近停止工作了。使用 API 意味着重写所有内容,因为响应的数据是不同的。

Tor*_*xed 5

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

在此处输入图片说明 这是一个 cookie 字符串的示例,将我标识为我自己。没有它,我将无法在浏览器中执行这些请求。因为,只要服务器发送Set-Cookie: ...浏览器,浏览器就会尊重它并保存它,跟踪它并在每次请求时发送它。

您可以从浏览器会话中借用 cookie 并临时将其实施到您的 curl 请求中,或者您在发送 curl 请求之前实施登录逻辑。但是你应该做正确的事情并开始使用Instagram API,正如 Magnus Eriksson 在评论中所指出的那样。

后者是推荐的,并且有一些库虽然它们很旧。但也许他们会给你一个如何去做的想法。

以 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>";
Run Code Online (Sandbox Code Playgroud)

如果你想知道“API到底是什么”,这里有(Tom Scott - This Video Has X Views)一个很好的解释视频,以及为什么假装是一个人不是一个好主意 - 而是使用 API。