Instagram? __ a = 1 url больше не работает и проблемы с graphql/query для получения данных
Обновление 19 апреля
Через несколько дней использование cookie ig_pr
два дня назад является блоком. Похоже, единственный способ получить данные теперь - использовать sessionid
с определенным значением
оригинал
Я использовал instagram? __ a = 1 url, чтобы прочитать все сообщения пользователей instagram.
Несколько часов назад произошла смена ответа, и теперь я не могу использовать max_id
для 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 не работает.
Пожалуйста помоги :)
Ответы
Ответ 1
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 внутри блока. Ищите "window._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 является конечным_курсором из исходного запроса
Ответ 2
Я только что пришел к тому же вопросу.
Похоже, они просто изменили свой частный api, удалив max_id. Их веб-сайт, похоже, заменил старый api графиком api.
https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables= {"id": "111", "first": 12, "after": "xxx"}
- 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 не проверял файлы cookie, но похоже, что они добавили быструю проверку. Попробуйте добавить ig_pr=2
в файл cookie запроса при отправке вашего API. Это быстрое исправление работает для меня. Кто знает, когда FB снова изменит его.
Пока FB не применяет логин для этих основных API-интерфейсов, всегда будет непросто обходное решение.
Ответ 3
Основная проблема с использованием графика/запроса заключается в том, что у меня есть только имя пользователя, чтобы извлечь userId & last post, как мы привыкли делать? __ a = 1 мы должны получить страницу пользователя instagram & 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);
}
})
После получения всех этих данных мы можем вызвать граф/запрос (а не на стороне клиента)
Ответ 4
Я построил небольшой сервер, который делает это преобразование. Вы получите данные как обычно - получайте удовольствие 😊
https://apinsta.herokuapp.com/u/appwithus
Ответ 5
Перевел некоторые из кода людей на 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];
}
Не уверен, как долго он будет работать. Для моего небольшого проекта он работает на данный момент. Результат очень похож (если не равен) на тот, который instagram.com/{user}/?__a=1
по URL-адресу: instagram.com/{user}/?__a=1
Ответ 6
Этот ответ не помогает напрямую, но публикует сообщения, потому что кто-то может воспользоваться ответом. На текущий день 12 апреля 2018 года загрузка дополнительных API-интерфейсов не будет работать без набора заголовков Cookie
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
достаточно. Хотя я не уверен, но, похоже, для меня это работает без них.
Ответ 7
Для разбивки на страницы теперь вы можете использовать? __ a = 1 & page = 2
Ответ 8
По состоянию на текущую дату 12 апреля 2018 года, 16:00 (GMT + 1), запросы API работают без какого-либо файла cookie. Я понятия не имею, что они делают...
Просто попробуйте эту ссылку в частной навигации.
Ответ 9
Uri https://www.instagram.com.br/someusername?__a=1 все еще работает. Что вам нужно сделать, это отправить действительный файл cookie в заголовке вашего запроса. Для тестов войдите в свою учетную запись, пропустите этот URI с именем пользователя и проверьте заголовки запросов (в Chrome вы можете видеть его), получите значение cookie и в вашем приложении, когда вы выполняете запрос к этому URI, установите этот cookie в своем запросите заголовки и будете работать.