web-dev-qa-db-fra.com

Instagram? __ a = 1 url ne fonctionne plus et problèmes avec graphql / query pour obtenir les données

Mise à jour du 19 avril

Après quelques jours d'utilisation d'un cookie ig_pr il y a deux jours est bloqué. On dirait que le seul moyen d'obtenir les données maintenant est d'utiliser sessionid avec une valeur spécifique

Original

J'utilisais instagram? __ a = 1 url pour lire tous les messages d'utilisateurs d'Instagram.

Il y a quelques heures, la réponse a changé et je ne peux plus utiliser max_id paginer.

Avant d’envoyer habituellement une demande à

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

et en utilisant le 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 le end_cursor changements dans chaque appel & max_id ne fonctionne pas.

S'il vous plaît aider :)

22
Pablo

Query_hash ne change pas, du moins ces derniers jours. Il indique de quel type de requête il s'agit.

Ci-dessous 4 types de requêtes répertoriées que je connaissais, espérons que ces derniers seront utiles.

Chargez plus de médias sous https://www.instagram.com/someone/?__a=1

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

(Instagram a bloqué l'accès ci-dessus depuis le 2018-04-12. Vous devez supprimer le __a = 1 et extraire le JSON à l'intérieur d'un bloc. Recherchez "window._sharedData" dans le code HTML)

Chargez plus de médias sous 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"}

Chargez plus de médias sous 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 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 curseur final de la demande d'origine

15
Felix Ng

Je suis juste venu par le même problème.

On dirait qu'ils viennent de changer leur API privée en supprimant le max_id . Leur site Web semble avoir remplacé l'ancienne API par la graphql api.

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

  • id : ID utilisateur,
  • first : nombre de nœuds à obtenir,
  • after : le 'curseur_fin' que vous pouvez obtenir à partir des données ['utilisateur'] ['Edge_owner_to_timeline_media'] ['page_info'] ['end_cursor']

utilisez query_hash ou query_id

  • query_hash : 472f257a40c653c64c666ce877d59d2b
  • query_id : 17888483320059182

Je n'ai aucune idée de la durée pendant laquelle query_id/query_hash fonctionnera, c'est à Instagram. Ils finiront par le changer.

Mis à jour le 08/04/2018 - Avant que FB ne vérifie aucun cookie, il semblerait qu'ils aient ajouté une validation rapide. Essayez d'ajouter ig_pr=2 au cookie de demande lors de l'envoi de votre API. Cette solution rapide fonctionne pour moi. Qui sait quand FB le changera à nouveau.

Tant que FB n'imposera pas la connexion à ces API de base, il existera toujours une solution de contournement simple.

10
Daniel Choi

Le principal problème avec l'utilisation de graph/query est que je n'ai que le nom d'utilisateur, pour extraire l'ID utilisateur & le dernier message comme nous le faisons avec? __ a = 1, nous devons obtenir la page utilisateur d'Instagram & extraire _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 obtenu toutes ces données, nous pouvons appeler graph/query (pas du côté client)

7
Pablo

Traduit une partie du code de ces personnes en 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];
}

Je ne sais pas pour combien de temps ça va marcher. Pour mon petit projet, il fait le travail pour le moment. Le résultat est très similaire (sinon égal) à celui de l'URL: instagram.com/{user}/?__a=1

6
Zerquix18

Cette réponse n’aide pas directement la question, mais la publication, car une personne pourrait en bénéficier. À la date du 12 avril 2018, le chargement de plusieurs API ne fonctionnera pas sans un en-tête Cookie. Vous trouverez ci-dessous des codes pour récupérer le site APIS public Instagram.

    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, j'utilise:

    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 est suffisant maintenant. Je ne suis pas sûr cependant, mais cela semble fonctionner sans eux aussi pour moi.

3
Noushad

Pour la pagination, vous pouvez maintenant utiliser? __ a = 1 & page = 2

2
Igor Sovcik

À compter de la date du 12 avril 2018, à 16h00 (GMT + 1), les requêtes d'API fonctionnent sans aucun cookie. Je n'ai aucune idée de ce qu'ils font ...

Essayez juste ce lien en navigation privée.

1
Pierre Grimaud