Instagram? A=1 url больше не работает и проблемы с graphql / query для получения данных

Обновление 19 Апреля

через несколько дней с помощью cookie ig_pr два дня назад заблокировать. Выглядит как единственный способ получить данные использовать sessionid с определенным значением

Оригинал

я использовал instagram ?__a=1 url, чтобы прочитать все сообщения пользователей instagram.

несколько часов назад произошло изменение в ответ и теперь не позволяет мне использовать 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 не работает.

пожалуйста, помогите :)

7 ответов


query_hash не меняется, по крайней мере, в последние несколько дней. Это указывает, какой тип запроса это.

Ниже перечислены 4 типа запросов, которые я знал, надеюсь, что это поможет.

загрузить больше СМИ под https://www.instagram.com/someone/?__a=1

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

(Instagram заблокировал вышеуказанный доступ с 2018-04-12. Вы должны удалить __a=1 и извлечь JSON внутри блока. Ищите "окно"._sharedData " в HTML)

загрузить больше СМИ под 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"}

загрузить больше СМИ под 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"}

загрузить больше комментарии для 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 от оригинала запрос


Я только что пришел к той же проблеме.

похоже, они просто изменили свой частный api, удалив max_id. Их веб-сайт, похоже, заменил старый api на GraphQL api.

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

  • id: пользователь ID,
  • первый: количество узлов, чтобы получить,
  • после: 'end_cursor' вы можете получить из данных ['user'] ['edge_owner_to_timeline_media'] ['page_info'] ['end_cursor']

используйте query_hash или query_id

  • query_hash: 472f257a40c653c64c666ce877d59d2b
  • query_id: 17888483320059182

Я понятия не имею, как долго это query_id / query_hash будет работать, это до Instagram. В конце концов они изменят его.

обновление 4/8/2018 - раньше FB не проверял куки, но похоже, что они добавили быструю проверку. Попробуйте добавить ig_pr=2 в файл cookie запроса при отправке вашего API. Это быстрое решение работает для меня. Кто знает, когда FB снова изменит его.

пока FB не применяет логин для этих основных API, всегда будет простой обходной путь.


основная проблема с использованием graph / query заключается в том, что у меня есть только имя пользователя, чтобы извлечь идентификатор пользователя и последний пост, как мы используем ?__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);
    }
})

после получения всех этих данных мы можем вызвать graph / query (не на стороне клиента)


этот ответ напрямую не помогает вопросу, а публикует, потому что кто-то может извлечь выгоду из ответа. По состоянию на текущую дату 12 апреля 2018, загрузка больше API не будет работать без Cookie установить заголовок. Ниже приведены некоторые коды для извлечения 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
    });

и для загрузки дополнительных элементов я использую:

    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 теперь достаточно. Я не уверен, хотя, кажется, работает без них тоже для меня.


перевел код некоторых людей на 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];
}

Не уверен, как долго это сработает. Для моего маленького проекта он работает сейчас. Результат очень похож (если не равен) на результат по URL:instagram.com/{user}/?__a=1


для разбиения на страницы теперь можно использовать ?__a=1 & page=2


по состоянию на текущую дату 12 апреля 2018, 4: 00PM (GMT+1), запросы API работают без каких-либо файлов cookie. Я понятия не имею, что они делают...

просто попробовать этой ссылке в частных навигации.