【问题标题】:Get JSON of instagram post获取 Instagram 帖子的 JSON
【发布时间】:2020-05-22 08:37:20
【问题描述】:

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

$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 意味着重写一切,因为响应的数据不同。

【问题讨论】:

  • 您应该改用instagram API。他们专门为开发人员开发了它,以便能够与他们的服务进行交互。你这样做的方式很老套(甚至可能违反他们的服务条款)。在 API 保持不变的情况下,对其 UI/URL 和您的代码的任何更改都可能会中断。
  • 你最好使用他们的 API,而不是用你自己的方式破解它
  • @MagnusEriksson 这只是昨天的一个问题。它以前工作过。不幸的是,我也需要一个不使用 API 的解决方案,所以我对解决方案非常感兴趣!
  • “这只是昨天的一个问题。它以前工作过。” - 这正是您应该使用 API 的原因。该站点可以随时更改而不会发出任何警告,这意味着您将需要不断地“修复”您的代码。这很可能也违反了他们的服务条款。

标签: php curl instagram-api


【解决方案1】:

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

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

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

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

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。

【讨论】:

  • +1 感谢您的解释。但是我提到我没有登录,并且使用 api 不能回答问题,因为在这种情况下必须重写页面。
  • 那么这可能是因为他们已经确定您没有使用浏览器(如果您复制浏览器中显示的所有标头,我有 99.9% 的把握该请求将在 curl 中作为好)。我还是要说,使用 API 或“适当的”scrape 库,它已经经历了你正在经历的所有坑。
  • @Torxed 供参考,截至 2 天前,这还不是问题。这是新事物。我也无法让它工作,我需要一个不使用 API 的解决方案,所以如果你有一些工作,我会对代码示例非常感兴趣!
  • @WilliamHampshire 如果是这样的话,我敢肯定他们已经引入了某种形式的人工验证以使抓取更加困难。如果是这样的话,那就更有理由使用 API,因为这就是他们打算使用它的方式 :) 我可能是错的,但 API 应该“总是”工作。
  • @LeonidMew - 最后,您将需要更长的时间来继续修复您的代码以解决对其网站的更改。您的代码每次发生时也会被破坏,直到您每次都修复它。你现在已经从很多人那里得到了同样的建议。使用他们的 API。你为什么这么反对?这是解决您问题的最佳方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多