admin管理员组

文章数量:1134247

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 with a specific value

Original

I was using instagram ?__a=1 url to read all the post of instagram's users.

A few hours ago there was a change in the response and now doesn't allow me to use max_id to paginate.

Before I usually sent a request to

/{{username}}/?__a=1

and using the graphql.edge_owner_to_timeline_media.page_info.end_cursor in the response I called the same page with a new max_id

/{{username}}/?__a=1&max_id={{end_cursor}}

Now the end_cursor changes in each call & max_id is not working.

Please help :)

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 with a specific value

Original

I was using instagram ?__a=1 url to read all the post of instagram's users.

A few hours ago there was a change in the response and now doesn't allow me to use max_id to paginate.

Before I usually sent a request to

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

and using the graphql.edge_owner_to_timeline_media.page_info.end_cursor in the response I called the same page with a new max_id

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

Now the end_cursor changes in each call & max_id is not working.

Please help :)

Share Improve this question edited Apr 19, 2018 at 0:36 Pablo Gutiérrez asked Mar 13, 2018 at 20:29 Pablo GutiérrezPablo Gutiérrez 7531 gold badge6 silver badges7 bronze badges 5
  • Did you happen to find a solution for this? – Hese Commented Apr 13, 2018 at 17:07
  • instagram.com{{username}}/?__a=1 doesn't work for me at all and just gives access denied. – Dani Commented Apr 19, 2018 at 20:49
  • @dprogramz ?__a=1 is not working anymore, please read the solutions where you can extract _sharedData in the normal webpage – Pablo Gutiérrez Commented Apr 20, 2018 at 7:32
  • now this url's not working – SAURABH RATHOD Commented Dec 8, 2018 at 10:15
  • 1 "?__a=1" seems to be working just fine. – Doug S Commented Sep 13, 2019 at 12:23
Add a comment  | 

16 Answers 16

Reset to default 40

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

Edit 15/03 NOT WORKING ANYMORE Seems like instagram changed again their API, now it gives a CORS error.

As of 2 february 2021, I have found a solution

Instead of using https://www.instagram.com/username/?__a=1 which it asks for a login.

Justing adding a /channel seems to make it work, like so:

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

i fixed it by adding &__d=dis. for example like this https://www.instagram.com/p/Ch656GRoyuO/?__a=1&__d=dis

I just came by the same issue.

Looks like they just changed their private api by removing the max_id. Their website seems to have replaced the old api with the graphql api.

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

  • id: user ID,
  • first: amount of nodes to get,
  • after: the 'end_cursor' you can get from data['user']['edge_owner_to_timeline_media']['page_info']['end_cursor']

use either query_hash or query_id

  • query_hash: 472f257a40c653c64c666ce877d59d2b
  • query_id: 17888483320059182

I have no idea how long that query_id/query_hash will work, it's up to Instagram. They will eventually change it.

Updated 4/8/2018 - Before FB didn't check any cookies, but looks like they added quick validation. Try adding ig_pr=2 to the request cookie, when sending your API. This quick fix works for me. Who knows when FB will change it again.

As long as FB doesn't enforce login for these basic APIs, there always will be an easy workaround.

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

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)

As of 21 May 2021, using a /channel will make it work, but only if using a browser User-Agent header with your request, for example with a 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

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

As of 19th May 2023

The solution that seems to be working fine for me (without using an external website) is to send a request here:

https://www.instagram.com/{username}/feed/?__a=1&__d=dis

There is no need to be authenticated (and have a session id) to make this request.

The problem I'm still encountering is that I can't get all posts, and I can only get the first 12.

I tried adding max_id={{end_cursor}} to the URL but it didn't work.

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.

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.

Now it returns this response and doesn't work:

for (;;);{"__ar":1,"error":1357004,"errorSummary":"Sorry, something went wrong","errorDescription":"Please try closing and re-opening your browser window.","payload":null,"hsrp":{"hblp":{"consistency":{"rev":1006107013}}},"lid":"7136695846284496053"}

URL: https://www.instagram.com/instagram/?__a=1

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

I faced a similar problem in that I was unable to parse the JSON file using "?__a=1" and ended up with JSONDecodeError: Expecting value. Searched in many places and finally found a catch, using Header solved the probelm. Try using this, it worked for me

link = 'http://instagram.com/instagram/?__a=1'

headers = {'User-Agent': 'Mozilla'}
r = requests.get(link, headers=headers)
data = r.json()

100% working as of now It can be circumvented using the session ID.

  • It also works on a never logged in ip. I sent 10K queries and it didn't give any errors. Instagram Api Curl Request

actually the position and tag changed if you look clearly we dont require any channel or anything url change at all the data is present under video versions attribute with many video quality actually

but sometimes ?_a=1 working normally i.e you can see the short code in the start

Currently https://www.instagram.com/username/channel/?__a=1 seems to be working. However, after a few minutes of trying this URL, it may still request for login. In this case, if you convert the word channel to reels, the problem will be fixed.

For example: https://www.instagram.com/username/reels/?__a=1

本文标签: javascriptInstagram a1 url not working anymore amp problems with graphqlquery to get dataStack Overflow