Instagram ?__a=1 url 不再工作 & 使用 graphql/query 获取数据的问题

IT技术 javascript instagram instagram-api
2021-02-20 23:07:37

4 月 19 日更新

两天前使用 cookieig_pr几天后被阻止。看起来现在获取数据的唯一方法是使用sessionid特定值

原来的

我正在使用 instagram ?__a=1 url 来阅读 instagram 用户的所有帖子。

几个小时前,响应发生了变化,现在不允许我使用max_id分页。

在我通常发送请求之前

https://www.instagram.com/{{username}}/?__a=1

graphql.edge_owner_to_timeline_media.page_info.end_cursor在响应中使用我用新的 max_id 调用了同一个页面

https://www.instagram.com/{{username}}/?__a=1&max_id={{end_cursor}}

现在end_cursor每次调用和 max_id 中更改不起作用。

请帮忙 :)

6个回答

query_hash 没有改变,至少在过去几天中如此。它表明它是什么类型的查询。

下面列出了我知道的 4 种查询类型,希望这些有帮助。

https://www.instagram.com/someone/?__a=1加载更多媒体

https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={"id":"93024","first":12,"after":"XXXXXXXX"}

(Instagram 自 2018-04-12 起阻止了上述访问。您必须删除 __a=1 并提取块内的 JSON。在 HTML 中查找“window._sharedData”)

https://www.instagram.com/explore/tags/iphone/?__a=1加载更多媒体

https://www.instagram.com/graphql/query/?query_hash=298b92c8d7cad703f7565aa892ede943&variables={"tag_name":"iphone","first":12,"after":"XXXXXXXX"}

https://www.instagram.com/explore/locations/703629436462521/?__a=1加载更多媒体

https://www.instagram.com/graphql/query/?query_hash=ac38b90f0f3981c42092016a37c59bf7&variables={"id":"703629436462521","first":12,"after":"XXXXXXXX"}

https://www.instagram.com/p/Bf-I2P6grhd/加载更多评论

https://www.instagram.com/graphql/query/?query_hash=33ba35852cb50da46f5b5e889df7d159&variables={"shortcode":"Bf-I2P6grhd","first":20,"after":"XXXXXXXX"}

其中 XXXXXXXX 是原始请求中的 end_cursor

截至 2018 年 4 月 12 日,仅加载更多 api 失败而未设置 Cookie 标头
2021-04-16 23:07:37
上面的 query_hash 给出{ message: 'forbidden', status: 'fail' }了我的请求https://www.instagram.com/graphql/query/?query_hash=298b92c8d7cad703f7565aa892ede943&variables=%7B%22tag_name%22%3A%22nasa%22%2C%22first%22%3A50%2C%22after%22%3A%22AQB0kona4PHJNMYAdLC4F4vPROUjIH47lawQ2Kx_sbq6KgE8p9hTkJu-V2LlMlzbS5gCZ4Uks3APKeBZ5SCnf9L_ovpvxzJPmYaG0o8EVF5Jgg%22%7D
2021-04-23 23:07:37
@ArbazAbid 您可以在下面的答案中看到我的代码。似乎 Instagram 在世界不同地区有不同的 API 身份验证流程。除了简单的Cookie头之外,我没有传递任何 csrftoken 或其他标头也许此链接会对您有所帮助
2021-04-27 23:07:37
您知道用于加载更多位置探索/位置 api 的 query_hash 吗?
2021-04-28 23:07:37
@ArbazAbid:我所做的是登录到我的 Instagram 并加载了一些页面,然后在开发者控制台中检查了网络选项卡以查看网络调用。您可以在每个请求中看到他们发送一个带有变量的名为 Cookie 的标头。因此,我使用该值通过在请求标头中设置相同的标头值对来进行 api 调用。我只用了 Cookies 头,没有别的
2021-05-12 23:07:37

编辑 15/03 不再 工作 似乎 instagram 再次更改了他们的 API,现在它给出了 CORS 错误。

截至 2021 年 2 月 2 日,我找到了解决方案

而不是使用 要求登录的https://www.instagram.com/username/?__a=1

只是添加一个 /channel 似乎可以使它工作,如下所示:

https://www.instagram.com/username/channel/?__a=1

instagram.com/username/channel/?__a=1也无法正常工作并询问登录详细信息
2021-04-17 23:07:37
也为我工作。但是当我使用instagram.com/pawanlakhera77/?__a=1&access_token= {mytoken} 时,我仍然看到登录页面。我需要有 instagram_graph_user_profile 和 instagram_graph_user_media 用于 instagram 基本显示 api 吗?没有这些许可我不能测试吗?
2021-04-24 23:07:37
我希望他们仍然有这个活动:(你们有没有找到任何解决方法?
2021-05-10 23:07:37
您在 2-3 天前,正在触发 CORS 问题。我可以从本地系统上的节点环境执行该查询,但是当我使用 lamda 函数时,我认为它试图将我重定向到登录页面,从而导致 JSON 响应无效。
2021-05-15 23:07:37
此解决方案是否仍然适用于您?我还在 /username/channel 端点上收到 CORS 错误
2021-05-16 23:07:37

我刚刚遇到了同样的问题。

看起来他们只是通过删除max_id 来更改他们的私有 api 他们的网站似乎已经用 graphql api 替换了旧的 api。

https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables= {"id":"111","first":12,"after":"xxx"}

  • id : 用户 ID,
  • 第一:要获得的节点数量,
  • after:'end_cursor' 你可以从 data['user']['edge_owner_to_timeline_media']['page_info']['end_cursor']

使用 query_hash 或 query_id

  • query_hash:472f257a40c653c64c666ce877d59d2b
  • 查询ID:17888483320059182

我不知道 query_id/query_hash 能用多久,这取决于 Instagram。他们最终会改变它。

2018年 4 月 8 日更新- 在 FB 没有检查任何 cookie 之前,但看起来他们添加了快速验证。尝试ig_pr=2在发送 API 时添加到请求 cookie。这个快速修复对我有用。谁知道FB什么时候又换了。

只要 FB 不对这些基本 API 强制登录,总会有一个简单的解决方法。

@ArbazAbid 我担心会发生这种情况。自 Cambridge Analytica 惨败以来,Facebook 一直在不经通知的情况下更改其 API。我们真的不能责怪他们,因为无论如何最终用户都不打算使用这个 API。由于我的一个项目依赖于这个 API,我最终会研究一下。
2021-04-20 23:07:37
@Pablo 我已经更新了上面的快速修复。发送请求时,添加ig_pr=2到请求cookie中。我有一种感觉,这将是一场猫捉老鼠的游戏。
2021-04-20 23:07:37
@SalehMosleh 该 api 端点是 Instagram 的私有 api,创建时仅供 Instagram 应用程序/网络使用,而非公开使用。所以可能只有 Instagram 知道 query_hash 和 query_id 代表什么。我首先认为它是变量的散列值,但它是永久性的(独立于变量)。把它想象成硬编码的 auth_token
2021-04-30 23:07:37
@pablo ,您找到任何解决方案了吗?我真的需要它;(
2021-05-04 23:07:37
我刚刚找到了相同的解决方案!它现在可以工作,但看起来我们将不得不使用他们的 API
2021-05-15 23:07:37

将一些人的代码翻译成 PHP:

<?php
function getPublicInfo($username) {
    $url     = sprintf("https://www.instagram.com/$username");
    $content = file_get_contents($url);
    $content = explode("window._sharedData = ", $content)[1];
    $content = explode(";</script>", $content)[0];
    $data    = json_decode($content, true);
    return $data['entry_data']['ProfilePage'][0];
}

不知道能用多久。对于我的小项目,它现在可以完成工作。结果与 URL 中的结果非常相似(如果不相等):instagram.com/{user}/?__a=1

似乎解决方案现在不起作用
2021-04-21 23:07:37
我们可以使用 php curl 获取媒体(图片或视频)的 mp4 或 jpg 网址吗?
2021-05-02 23:07:37
谢谢分享,暂时解决了我的问题
2021-05-09 23:07:37
我不知道要工作多久,但到目前为止“window._sharedData”方法有效,而通常的“file_get_contents”似乎触发了请求IP的某种黑名单(顺便说一句,我们不不知道它被列入黑名单多久,或者是否随时被列入白名单)。
2021-05-15 23:07:37

使用图形/查询的主要问题是我只有用户名,要提取 userId 和最后一篇文章,就像我们以前用 ?__a=1 做的那样,我们必须获取 instagram 的用户页面并提取 _sharedData

Javascript

let url = "https://www.instagram.com/"+username;
$.ajax({
    type: 'GET',
    url: url,
    error: function () {
        //..
    },
    success: function (data) {
        data = JSON.parse(data.split("window._sharedData = ")[1].split(";</script>")[0]).entry_data.ProfilePage[0].graphql;
        console.log(data);
    }
})

获得所有这些数据后,我们可以调用图形/查询(不在客户端)

@Pablo 我如何获得我自己提要的第一页?我想要 window.__additionalDataLoaded('feed' 数据!你能帮忙吗?谢谢
2021-04-20 23:07:37
您的数据变量将不起作用。您需要转义脚本标签中的右括号 data = JSON.parse(data.split("window._sharedData = ")[1].split(";<\/script>")[0]).entry_data.ProfilePage[0].graphql;
2021-05-16 23:07:37