web-dev-qa-db-ja.com

Instagram?__ a = 1 URLが機能しなくなり、データを取得するgraphql / queryの問題

4月19日更新

Cookieを使用して数日後ig_prは2日前にブロックされます。現在データを取得する唯一の方法は、特定の値でsessionidを使用することです

元の

Instagramのユーザーのすべての投稿を読むためにinstagram?__ a = 1のURLを使用していました。

数時間前、応答に変更があり、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が機能しなくなりました。

助けてください :)

22
Pablo

少なくとも過去数日間は、query_hashは変更されません。クエリの種類を示します。

以下に、私が知っている4つのクエリタイプを示します。これらが役立つことを願っています。

https://www.instagram.com/someone/?__a=1 の下にさらにmediaを読み込む

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 の下にさらにmediaを読み込む

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 の下にさらにmediaを読み込みます

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

もっと読み込むcommentsfor 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です

15
Felix Ng

私はちょうど同じ問題に来ました。

max_idを削除してプライベートAPIを変更したようです。彼らのウェブサイトは古いAPIをgraphql APIに置き換えたようです。

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

  • id:ユーザーID、
  • first:取得するノードの量、
  • after:data ['user'] ['Edge_owner_to_timeline_media'] ['page_info'] ['end_cursor']から取得できる 'end_cursor'

query_hashまたはquery_idのいずれかを使用します

  • query_hash:472f257a40c653c64c666ce877d59d2b
  • query_id:17888483320059182

Query_id/query_hashがどのくらいの期間機能するかはわかりません。Instagramの問題です。最終的には変更されます。

2018年4月8日に更新-FBはCookieをチェックしませんでしたが、クイック検証を追加したようです。 APIを送信するときに、リクエストCookieにig_pr=2を追加してみてください。この簡単な修正は私にとっては有効です。 FBがいつそれを再び変更するかを誰が知っていますか。

FBがこれらの基本的なAPIのログインを強制しない限り、常に簡単な回避策があります。

10
Daniel Choi

グラフ/クエリを使用する場合の主な問題は、sernameしかなく、ユーザーIDを抽出することと、?__ 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);
    }
})

このデータをすべて取得した後、グラフ/クエリを呼び出すことができます(クライアント側ではありません)

7
Pablo

人々のコードの一部を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];
}

どれくらいの期間機能するかはわかりません。私の小さなプロジェクトでは、今のところ仕事をしています。結果は、UR​​Lの結果と非常によく似ています(等しくない場合):instagram.com/{user}/?__a=1

6
Zerquix18

この回答は、質問を直接支援するのではなく、誰かが回答の恩恵を受ける可能性があるため、投稿しています。現在の日付2018年4月12日の時点で、Cookieヘッダーセットがないと、APIのロードは機能しません。以下はInstagramのパブリックAPIを取得するためのいくつかのコードです

    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で十分です。確かではありませんが、それらがなくても私には機能しているようです。

3
Noushad

ページネーションには、?__ a = 1&page = 2を使用できます

2
Igor Sovcik

2018年4月12日の午後4時(GMT + 1)現在、APIクエリはCookieなしで機能します。彼らが何をしているかわからない...

プライベートナビゲーションで このリンク を試してください。

1
Pierre Grimaud