Instagram ?__a=1 url not working anymore & problems with graphql/query to get data

后端 未结 7 1192
难免孤独
难免孤独 2020-11-30 18:23

Update 19 April

After a few days using cookie ig_pr two days ago is block. Looks like the only way to get the data now is use sessionid w

相关标签:
7条回答
  • 2020-11-30 18:48

    Translated some of the folks' code to 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];
    }
    

    Not sure for how long it's gonna work. For my small project it does the job for now. The result is very similar (if not equal) to the one at the URL: instagram.com/{user}/?__a=1

    0 讨论(0)
  • 2020-11-30 18:48

    The main problem with using graph/query is that I only have the username, to extract the userId & the last post like we use to do with ?__a=1 we have to get the instagram's user page & extract _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);
        }
    })
    

    After get all this data we can call graph/query (not in client side)

    0 讨论(0)
  • 2020-11-30 18:48

    As of the current date 12 April 2018, 4:00PM (GMT+1), API queries work without any cookie. I have no idea what they're doing...

    Just try this link in private navigation.

    0 讨论(0)
  • 2020-11-30 18:49

    For pagination you can now use ?__a=1&page=2

    0 讨论(0)
  • 2020-11-30 18:56

    The query_hash does not change, at least in the past few days. It indicate what TYPE of query it is.

    Below listed 4 query types I knew, hope these help.

    Load more media under https://www.instagram.com/someone/?__a=1

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

    (Instagram blocked the above access since 2018-04-12. You have to remove the __a=1 and extract the JSON inside a block. Look for "window._sharedData" in the HTML)

    Load more media under 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"}
    

    Load more media under 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"}
    

    Load more comments for https://www.instagram.com/p/Bf-I2P6grhd/

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

    where XXXXXXXX is the end_cursor from the original request

    0 讨论(0)
  • 2020-11-30 18:56

    This answer is not directly helping the question but posting because someone might benefit from the answer. As of the current date 12 April 2018, the load more APIs will not work without a Cookie header set. Below are some codes for fetching Instagram public 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
        });
    

    and for load more items, I am using:

        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) { });
    

    It seems query_id is no longer required and query_hash is sufficient now. I'm not sure though but it seems working without them too for me.

    0 讨论(0)
提交回复
热议问题