【问题标题】:Instagram ?__a=1 url not working anymore & problems with graphql/query to get dataInstagram ?__a=1 url 不再工作 & graphql/query 获取数据的问题
【发布时间】:2018-08-22 06:00:37
【问题描述】:

4 月 19 日更新

几天后使用cookie ig_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 不起作用。

请帮忙:)

【问题讨论】:

  • 您是否碰巧找到了解决方案?
  • instagram.com{{username}}/?__a=1 对我根本不起作用,只会拒绝访问。
  • @dprogramz ?__a=1 不再工作,请阅读在普通网页中可以提取_sharedData的解决方案
  • 现在这个网址失效了
  • "?__a=1" 似乎工作得很好。

标签: javascript instagram instagram-api


【解决方案1】:

至少在过去几天里,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 年 4 月 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/加载更多cmets

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

其中 XXXXXXXX 是原始请求的 end_cursor

【讨论】:

  • 你知道为 explore/locations api 加载更多位置的 query_hash 吗?
  • 上面的 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
  • 截至 2018 年 4 月 12 日,在没有设置 Cookie 标头的情况下仅加载更多 api 会失败
  • @ArbazAbid:我所做的是登录到我的 Instagram 并加载了一些页面,然后在开发人员控制台中检查了网络选项卡以查看网络调用。您可以在每个请求中看到他们正在发送一个名为 Cookie 的标头和一个变量。因此,我使用该值通过在请求标头中设置相同的标头值对来进行 api 调用。我只使用了 Cookies 标头,没有其他任何东西
  • @ArbazAbid 您可以在下面的答案中看到我的代码。 Instagram 似乎在世界不同地区有不同的 API 身份验证流程。除了简单的 Cookie 标头之外,我没有传递任何 csrftoken 或其他标头也许这个 link 会帮助你
【解决方案2】:

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

我刚遇到同样的问题。

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

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

  • id:用户 ID,
  • first:要获取的节点数量,
  • 之后:您可以从 data['user']['edge_owner_to_timeline_media']['page_info']['end_cursor'] 获得的 'end_cursor'

使用 query_hash 或 query_id

  • query_hash:472f257a40c653c64c666ce877d59d2b
  • query_id:17888483320059182

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

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

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

【讨论】:

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

将一些人的代码翻译成 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

【讨论】:

  • 感谢分享,暂时解决了我的问题
  • 我们可以使用php curl获取媒体(图片或视频)的mp4或jpg url吗?
  • 我不知道会工作多久,但到目前为止“window._sharedData”方法有效,而通常的“file_get_contents”似乎触发了某种请求IP的黑名单(顺便说一句,我们不知道它会在黑名单中停留多长时间,或者是否随时被列入白名单)。
  • 现在解决方案似乎不起作用
【解决方案5】:

使用图形/查询的主要问题是我只有 用户名,要提取 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);
    }
})

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

【讨论】:

  • 您的数据变量将不起作用。您需要在脚本标签data = JSON.parse(data.split("window._sharedData = ")[1].split(";&lt;\/script&gt;")[0]).entry_data.ProfilePage[0].graphql; 中转义右括号
  • @Pablo 我怎样才能获得自己提要的第一页?我想要获取 window.__additionalDataLoaded('feed' 数据!你能帮忙吗?谢谢
【解决方案6】:

对于分页,您现在可以使用 ?__a=1&page=2

【讨论】:

  • 谢谢。只是好奇,但你是怎么想出来的?
  • @Moondra 我只是在开发工具中查看网络请求。
【解决方案7】:

这个答案并没有直接帮助这个问题,而是发布,因为有人可能会从这个答案中受益。截至当前日期 2018 年 4 月 12 日,如果没有 Cookie 标头集,加载更多 API 将无法工作。 下面是一些获取 Instagram 公共 APIS 的代码

    let url = "https://www.instagram.com/explore/";
    if (payload.type == 'location') {
        url = url + "locations/" + payload.location_id + "/" + payload.location_name + "/?__a=1";
    } else if (payload.type == 'hashtag') {
        url = url + "tags/" + payload.hashtag + "/?__a=1";
    } else { //profile
        url = "https://www.instagram.com/" + payload.user_name + "/?__a=1";
    }

    request(url, function (error, response, body) {
        body = JSON.parse(body);
        //below are params which are required for load more pagination payload
        paginationData = {
            has_next_page: body.data.user.edge_owner_to_timeline_media.page_info.has_next_page,
            end_cursor: body.data.user.edge_owner_to_timeline_media.page_info.end_cursor
        };

        //user.edge_owner_to_timeline_media for profile posts,
        //hashtag.edge_hashtag_to_media for hashtag posts
        //location.edge_location_to_media for location posts
    });

为了加载更多项目,我正在使用:

    let url = "https://www.instagram.com/graphql/query/";
    if (payload.type == 'location') {
        let variables = encodeURIComponent('{"id":"' + payload.pagination.id + '","first":50,"after":"' + payload.pagination.end_cursor + '"}');
        url = url + "?query_hash=ac38b90f0f3981c42092016a37c59bf7&query_id=17865274345132052&variables=" + variables;
    } else if (payload.type == 'hashtag') {
        let variables = encodeURIComponent('{"tag_name":"' + payload.pagination.tag_name + '","first":50,"after":"' + payload.pagination.end_cursor + '"}');
        url = url + "?query_hash=298b92c8d7cad703f7565aa892ede943&query_id=17875800862117404&variables=" + variables;
    } else { //profile
        let variables = encodeURIComponent('{"id":"' + payload.pagination.owner_id + '","first":50,"after":"' + payload.pagination.end_cursor + '"}');
        url = url + "?query_hash=472f257a40c653c64c666ce877d59d2b&query_id=17888483320059182&variables=" + variables;
    }

    let options = {
        url: url,
        headers: {
            Cookie: "Cookie value which i copied from my logged in instagram browser window"
        }
    };

    request(options, function (error, response, body) { });

似乎 query_id 不再需要,query_hash 现在就足够了。虽然我不确定,但它似乎对我来说也没有它们。

【讨论】:

  • 如何获取query_hashquery_id参数?
  • query_hashquery_id 对于每种类型的请求都是固定的。我认为 query_id 不再需要。 query_hash 就足够了。我只是保留它以供某人参考。您可以使用上述值
  • 谢谢,到目前为止,您的解决方案对我有用,似乎没有速率限制,因为我的网站每天有 2k+ 流量,而且这个解决方案仍然可以正常工作。
【解决方案8】:

自 2021 年 5 月 21 日起,使用 /channel 将使其工作,但前提是您的请求使用浏览器 User-Agent 标头,例如使用 curl:

curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" https://www.instagram.com/{username}/channel/?__a=1

【讨论】:

    【解决方案9】:

    截至当前日期 2018 年 4 月 12 日下午 4:00 (GMT+1),API 查询无需任何 cookie 即可工作。我不知道他们在做什么......

    只需在私人导航中尝试this link

    【讨论】:

    • 我在没有登录的情况下收到 403 错误。我来自印度,我认为他们已将更改后的代码部署到新服务器并逐渐迁移流量。
    • @FarazAzhar x-requested-with、x-instagram-gis、cookie 和 user-agent 在标头中是必需的。
    • 你从哪里得到 query_hash ?
    【解决方案10】:

    我遇到了类似的问题,因为我无法使用“?__a=1”解析 JSON 文件并最终得到 JSONDecodeError: Expecting value。找了很多地方终于找到了一个catch,用Header解决了这个问题。试试这个,对我有用

    link = 'http://instagram.com/instagram/?__a=1'
    
    headers = {'User-Agent': 'Mozilla'}
    r = requests.get(link, headers=headers)
    data = r.json()
    

    【讨论】:

      【解决方案11】:

      100% 工作至今 可以使用会话 ID 绕过它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-09-24
        • 1970-01-01
        • 2020-08-18
        • 1970-01-01
        • 2022-06-11
        • 2022-06-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多