Instagram?__ a = 1 url不再工作&graphql / query的问题来获取数据

问题描述 投票:22回答:7

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中都没有变化。

请帮忙 :)

javascript instagram instagram-api
7个回答
13
投票

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


10
投票

我刚刚遇到同样的问题。

看起来他们只是通过删除max_id来改变他们的私人api。他们的网站似乎用graphql api取代了旧的api。

https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables= { “ID”: “111”, “第一”:12, “后”: “XXX”}

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

使用query_hash或query_id

  • query_hash:472f257a40c653c64c666ce877d59d2b
  • query_id:17888483320059182

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

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

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


7
投票

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

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


6
投票

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


3
投票

这个答案不是直接帮助问题而是发布,因为有人可能从答案中受益。截至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现在已经足够了。我不确定但是对我来说它似乎没有它们。


2
投票

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


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.