问题描述
这里是一个示例url,可返回instagram用户数据的JSON:https://www.instagram.com/therock/?__a=1
它返回JSON,如下所示:
{
"logging_page_id":"profilePage_232192182","show_suggested_profiles":true,"show_follow_dialog":false,"graphql":{
"user":{
"biography":"founder","blocked_by_viewer":false,"business_email":null,"restricted_by_viewer":false,"country_block":false,"external_url":"https://projectrock.online/7ad","external_url_linkshimmed":"https://l.instagram.com/?u=https%3A%2F%2Fprojectrock.online%2F7ad&e=ATMKh6M0eOgq-_jVoR3-xJ0Q2wwVSenYemMoYM0A0nWrW9Y5P7mDXX1dkk2dDLidhEuV1Wees7Z3teLJqp7vB2k&s=1","edge_followed_by":{
"count":199139001
},"followed_by_viewer":false,"edge_follow":{
"count":406
},"follows_viewer":false,"full_name":"therock","has_ar_effects":false
我正在使用ASP.NET Core API,并且有一个采用instagram句柄并解析JSON的终结点。它在本地可以正常工作,但是当我在Azure部署的API上点击相同的终结点时,我得到的是登录页面:
<!DOCTYPE html>
<html lang="en" class="no-js not-logged-in client-root">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>
Login • Instagram
</title>
<meta name="robots" content="noimageindex,noarchive">
<meta name="apple-mobile-web-app-status-bar-style" content="default">
<meta name="mobile-web-app-capable" content="yes">
<meta name="theme-color" content="#ffffff">
<meta id="viewport" name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,viewport-fit=cover">
<link rel="manifest" href="/data/manifest.json">
我尝试使用第三方浏览器即服务(PhantomJsCloud),但返回了相同的登录页面。我以为这是CORS政策,但无法解决,也没有设置返回的cookie,但无济于事。我真的很迷失在这里,如果有人能指出为什么会这样,我将非常感谢。谢谢!
解决方法
可能 instagram 不希望您像这样获取它,并且有一些机制来识别您的请求是以编程方式完成的。我假设当你在浏览器中调用它时它正在工作。您可以尝试使用 cypress 或 puppeteer 使其仍然工作,或者可能使用带有令牌等的官方 api。
编辑: 好吧..我玩了一会儿,可以让它以某种方式工作,但不确定这有多可靠:
- 首先我从以下几点开始:https://codelike.pro/fetch-instagram-posts-from-profile-without-__a-parameter/
- 在解析 JSON 对象后,我搜索了
entry_data.ProfilePage[0].graphql.user.edge_owner_to_timeline_media.page_info.end_cursor
--> 使用 end_cursor 进行以下请求: -
https://www.instagram.com/graphql/query/?query_id=17888483320059182&id=928659671&first=100&after= 您需要将 end_cursor 用于 &after 查询参数。
query_id
是instagram账号中的Media,id
是instagram账号的id(可以从parsedObject获取instagram账号的id
)
query_id
是来自 instagram 的某种硬编码的东西,其他 ID 可以在这里找到:https://gist.github.com/Carlos-Henreis/2df27431fa5d7a84b7a5e57ee1bf6ae2#file-query_id-csv
编辑2: 意识到这仅在 instagram 未检测到您的 ip 或您发送登录会话的 cookie 时才有效,否则您将无法获得 ProfilePage 而是不幸的是 LoginAndSignupPage
有关详细信息,请参阅此处:https://stackoverflow.com/a/57722553/5195852