Instagram ?__a=1 url 不再工作 & graphql/query 获取数据时出现问题
Instagram ?__a=1 url not working anymore & problems with graphql/query to get data
4 月 19 日更新
几天后使用cookie ig_pr
两天前被屏蔽了。看起来现在获取数据的唯一方法是使用 sessionid
和特定值
原创
我正在使用 instagram ?__a=1 url 阅读 instagram 用户的所有 post。
几个小时前,响应发生了变化,现在不允许我使用 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 不起作用。
请帮忙:)
我刚遇到同样的问题。
看起来他们刚刚通过删除 max_id 更改了私有 api。
他们的网站似乎已经用 graphql api.
替换了旧的 api
https://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={"id":"111","first":12,"after":"xxx"}
- id:用户ID,
- first:要获取的节点数量,
- after: '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。他们最终会改变它。
2018 年 4 月 8 日更新 - 之前 FB 没有检查任何 cookie,但看起来他们添加了快速验证。在发送 API 时,尝试将 ig_pr=2
添加到请求 cookie。这个快速修复对我有用。谁知道FB什么时候又改了。
只要 FB 不对这些基本 API 强制登录,总会有一个简单的解决方法。
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 年 4 月 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 是原始请求end_cursor
对于分页,您现在可以使用 ?__a=1&page=2
这个答案不是直接帮助问题,而是发布,因为有人可能会从答案中受益。从当前日期 2018 年 4 月 12 日开始,如果没有 Cookie
header 集,加载更多 API 将无法工作。
下面是一些获取 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
就足够了。虽然我不确定,但对我来说,没有它们似乎也能正常工作。
截至当前日期 2018 年 4 月 12 日,4:00PM (GMT+1),API 查询在没有任何 cookie 的情况下工作。我不知道他们在做什么...
试试this link私人导航。
使用 graph/query 的主要问题是我只有 用户名 来提取 userId 和最后一个 post 就像我们过去做的那样使用 ?__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(不在客户端)
将一些人的代码翻译成 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
编辑 15/03
不再工作
似乎 instagram 再次更改了他们的 API,现在它给出了 CORS 错误。
截至 2021 年 2 月 2 日,我找到了解决方案
而不是使用
https://www.instagram.com/username/?__a=1
它要求登录。
只需添加一个 /channel 似乎就可以了,就像这样:
自 2021 年 5 月 21 日起,使用 /channel 将使其工作,但前提是使用浏览器 User-Agent header 处理您的请求,例如使用 curl:
curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" https://www.instagram.com/{username}/channel/?__a=1
我遇到了类似的问题,因为我无法使用“?__a=1”解析 JSON 文件,结果是 JSONDecodeError: Expecting value
。找了很多地方终于找到了一个catch,用Header解决了问题。试试这个,它对我有用
link = 'http://instagram.com/instagram/?__a=1'
headers = {'User-Agent': 'Mozilla'}
r = requests.get(link, headers=headers)
data = r.json()
100% 目前正在工作
可以使用会话 ID 来绕过它。
- 它也适用于从未登录过的 ip。
我发送了 10K 个查询,但没有给出任何错误。
Instagram Api Curl Request
实际上,位置和标签已更改,如果您看清楚的话,我们不需要任何频道或任何内容 url 所有数据都存在于视频版本属性下,实际上具有许多视频质量
但有时 ?_a=1 工作正常,即您可以在开始部分看到短代码
如果您使用住宅代理,它仍然有效,例如通过 https://webscraping.ai/ API(注意 url
参数应为 URL-encoded):
$ curl https://api.webscraping.ai/html?proxy=residential&api_key=test-api-key&url=https%3A%2F%2Fwww.instagram.com%2Fapple%2F%3F__a%3D1
{"seo_category_infos":[["Beauty","beauty"],["Dance & Performance","dance_and_performance"],["Fitness","fitness"],["Food & Drink","food_and_drink"],["Home & Garden","home_and_garden"],["Music","music"],["Visual Arts","visual_arts"]],"logging_page_id":"profilePage_5821462185","show_suggested_profiles":false,"graphql":{"user":{"biography":"Everyone has a story to tell. \nTag #ShotoniPhone to take part.","blocked_by_viewer":false,...
4 月 19 日更新
几天后使用cookie ig_pr
两天前被屏蔽了。看起来现在获取数据的唯一方法是使用 sessionid
和特定值
原创
我正在使用 instagram ?__a=1 url 阅读 instagram 用户的所有 post。
几个小时前,响应发生了变化,现在不允许我使用 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 不起作用。
请帮忙:)
我刚遇到同样的问题。
看起来他们刚刚通过删除 max_id 更改了私有 api。 他们的网站似乎已经用 graphql api.
替换了旧的 apihttps://www.instagram.com/graphql/query/?query_hash=472f257a40c653c64c666ce877d59d2b&variables={"id":"111","first":12,"after":"xxx"}
- id:用户ID,
- first:要获取的节点数量,
- after: '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。他们最终会改变它。
2018 年 4 月 8 日更新 - 之前 FB 没有检查任何 cookie,但看起来他们添加了快速验证。在发送 API 时,尝试将 ig_pr=2
添加到请求 cookie。这个快速修复对我有用。谁知道FB什么时候又改了。
只要 FB 不对这些基本 API 强制登录,总会有一个简单的解决方法。
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 年 4 月 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 是原始请求end_cursor
对于分页,您现在可以使用 ?__a=1&page=2
这个答案不是直接帮助问题,而是发布,因为有人可能会从答案中受益。从当前日期 2018 年 4 月 12 日开始,如果没有 Cookie
header 集,加载更多 API 将无法工作。
下面是一些获取 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
就足够了。虽然我不确定,但对我来说,没有它们似乎也能正常工作。
截至当前日期 2018 年 4 月 12 日,4:00PM (GMT+1),API 查询在没有任何 cookie 的情况下工作。我不知道他们在做什么...
试试this link私人导航。
使用 graph/query 的主要问题是我只有 用户名 来提取 userId 和最后一个 post 就像我们过去做的那样使用 ?__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(不在客户端)
将一些人的代码翻译成 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
编辑 15/03 不再工作 似乎 instagram 再次更改了他们的 API,现在它给出了 CORS 错误。
截至 2021 年 2 月 2 日,我找到了解决方案
而不是使用 https://www.instagram.com/username/?__a=1 它要求登录。
只需添加一个 /channel 似乎就可以了,就像这样:
自 2021 年 5 月 21 日起,使用 /channel 将使其工作,但前提是使用浏览器 User-Agent header 处理您的请求,例如使用 curl:
curl -H "User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4430.93 Safari/537.36" https://www.instagram.com/{username}/channel/?__a=1
我遇到了类似的问题,因为我无法使用“?__a=1”解析 JSON 文件,结果是 JSONDecodeError: Expecting value
。找了很多地方终于找到了一个catch,用Header解决了问题。试试这个,它对我有用
link = 'http://instagram.com/instagram/?__a=1'
headers = {'User-Agent': 'Mozilla'}
r = requests.get(link, headers=headers)
data = r.json()
100% 目前正在工作 可以使用会话 ID 来绕过它。
- 它也适用于从未登录过的 ip。 我发送了 10K 个查询,但没有给出任何错误。 Instagram Api Curl Request
实际上,位置和标签已更改,如果您看清楚的话,我们不需要任何频道或任何内容 url 所有数据都存在于视频版本属性下,实际上具有许多视频质量
但有时 ?_a=1 工作正常,即您可以在开始部分看到短代码
如果您使用住宅代理,它仍然有效,例如通过 https://webscraping.ai/ API(注意 url
参数应为 URL-encoded):
$ curl https://api.webscraping.ai/html?proxy=residential&api_key=test-api-key&url=https%3A%2F%2Fwww.instagram.com%2Fapple%2F%3F__a%3D1
{"seo_category_infos":[["Beauty","beauty"],["Dance & Performance","dance_and_performance"],["Fitness","fitness"],["Food & Drink","food_and_drink"],["Home & Garden","home_and_garden"],["Music","music"],["Visual Arts","visual_arts"]],"logging_page_id":"profilePage_5821462185","show_suggested_profiles":false,"graphql":{"user":{"biography":"Everyone has a story to tell. \nTag #ShotoniPhone to take part.","blocked_by_viewer":false,...