30 votes

Instagram ?__a=1 url ne fonctionne plus et problèmes avec graphql/requête pour obtenir les données

Mise À Jour Le 19 Avril

Après quelques jours à l'aide de cookie ig_pr il y a deux jours est bloquer. Regarde comme le seul moyen d'obtenir les données est d'utiliser sessionid avec une valeur spécifique

D'origine

J'ai été en utilisant instagram ?__a=1 url de lire tous les post de instagram à ses utilisateurs.

Quelques heures auparavant, il y avait un changement dans la réponse et maintenant ne m'autorise pas à utiliser max_id de la pagination.

Avant que je généralement envoyé une demande à

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

et à l'aide de l' graphql.edge_owner_to_timeline_media.page_info.end_cursor dans la réponse, j'ai appelé la même page avec un nouveau max_id

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

Maintenant l' end_cursor changements dans chaque appel & max_id ne fonctionne pas.

S'il vous plaît aider :)

24voto

Felix Ng Points 41

Le query_hash ne change pas, au moins dans les derniers jours. Indique de quel TYPE de requête, il est.

Ci-dessous énumérés 4 types de requêtes, je le savais, j'espère que ces aider.

Charger plus de médias en vertu de https://www.instagram.com/someone/?__a=1

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

(Instagram bloqué au-dessus d'accès depuis 2018-04-12. Vous devez supprimer l' __a=1 et extrait au format JSON à l'intérieur d'un bloc. Regarder par la fenêtre"._sharedData" dans le code HTML)

Charger plus de médias en vertu de 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"}

Charger plus de médias en vertu de 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"}

Charger plus de commentaires pour https://www.instagram.com/p/Bf-I2P6grhd/

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

où XXXXXXXX est le end_cursor de la demande originale

14voto

Daniel Choi Points 136

Je viens par la même question.

Ressemble ils ont juste changé leur api privée en supprimant les max_id. Leur site web semble avoir remplacé l'ancienne api avec le graphql api.

https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={"id":"111","première":12,"après":"xxx"}

  • id: ID utilisateur,
  • première: quantité de nœuds pour obtenir,
  • après: le "end_cursor' vous pouvez obtenir à partir de données['utilisateur']['edge_owner_to_timeline_media']['page_info']['end_cursor']

utiliser query_hash ou query_id

  • query_hash: 472f257a40c653c64c666ce877d59d2b
  • query_id: 17888483320059182

Je n'ai aucune idée de combien de temps que query_id/query_hash de travail, c'est à Instagram. Ils finiront par changer.

Mise à jour 4/8/2018 - Avant que FB n'a pas vérifier tous les cookies, mais il semble que ils ont ajouté une validation rapide. Essayez d'ajouter de l' ig_pr=2 de la demande cookie, lors de l'envoi de votre API. Cette solution rapide qui fonctionne pour moi. Qui sait quand FB vais le changer à nouveau.

Aussi longtemps que FB ne pas appliquer de connexion pour la base de ces Api, il y aura toujours une simple solution de contournement.

7voto

Pablo Points 343

Le problème principal avec l'aide de graphes/la requête est que je n'ai que le nom d'utilisateur, pour extraire le nom d'utilisateur et le dernier post, comme nous faisons avec ?__a=1, nous avons pour obtenir l'instagram de l'utilisateur de la page de l'extrait de _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);
    }
})

Après avoir vu toutes ces données, on peut graphe d'appel/de requête (pas dans le côté client)

6voto

Zerquix18 Points 615

Traduit certains des gens de code 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];
}

Pas sûr de combien de temps ça va marcher. Pour mon petit projet, il fait le travail pour l'instant. Le résultat est très similaire (si ce n'est égal) à celui de l'URL: instagram.com/{user}/?__a=1

3voto

Noushad Points 1422

Cette réponse n'est pas directement en aidant à la question, mais l'affichage parce que quelqu'un pourrait bénéficier de la réponse. À compter de la date du jour 12 avril 2018, la charge de plusieurs Api ne fonctionnera pas sans un Cookie - tête ensemble. Ci-dessous sont quelques-uns des codes pour récupérer Instagram API publiques

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

et pour charger plus d'articles, je suis en utilisant:

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

Il semble query_id n'est plus nécessaire et query_hash suffit maintenant. Je n'en suis pas sûr mais il me semble de travail sans trop pour moi.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X